메소드 오버로딩
메소드 오버로딩은 함수이름이 같을 경우
void Add();
void Add(int a, int b);이런게 메소드 오버로딩이다.
메소드 오버라이딩
메소드 오버라이딩은
부모 클래스에서 proteced void Add(); 선언 할 경우
이 부모 클래스를 상속받는 자식 클래스에서
protected override Add(); 가
메소드 오버라이딩이다.부모에서 정의된 멤버 메서드를 자식에서 재 정의하는 것을 의미합니다.
따라서
유니티에서 자주 사용하는 메소드 오버로딩은
스크립트가 실행될 때, 한번만 실행이 되는 함수.
cs파일이 비활성화 되어 있어도 호출됨.
코루틴으로 실행 불가능 함.
Update가 호출되기 전에 한번만 호출
스크립트(cs파일)이 활성화 되어 있어야 실행 됨.
다른 스크립트의 모든 Awake가 실행된 후에 실행이된다.
코루틴으로 실행이 가능하다.
프레임마다 호출 되는 함수.
스크립트가 활성화 되어 있어야함.
모든 Update가 호출되고 나서 마지막에 한번씩 호출
순차적으로 실행해야하는 로직에 사용한다.(카메라 같은 경우)
카메라 이동 로직에 주로 사용 하는 함수이다.
마찬가지로 스크립트가 활성화 되어 있어야함.
주로 물리엔진을 사용하는 경우 일정 시간 간격으로 힘을 가할 때 사용하는 함수
발생하는 주기 일정
GameObject or script 활성화 할 경우 사용
이벤트 연결시 사용
코루틴 사용 불가능.
오브젝트 비활성화 할 경우 사용
이벤트 연결 종료 할 경우
코루틴 사용 불가능
여기다가 LateUpdate를 통해 흔들리지 않도록 해줌
Update가 호출 되고나서 호출 되니까
Lerp/Slerp : 시작점과 끝점 사이의 특정 위치 값을 추출 해 낼 때 사용.
이러한 보간 함수는 "현재값"을 목표값으로 변경할 경우 갑자기 변경하지 않고 부드럽게 변경하고 싶을 경우 사용한다.
Vector3.Lerp(시작값, 종료값, t)
Mathf.Lerp(시작값, 종료값, t)
Quaternion.Lerp(시작값, 종료값, t)
Vector3.Slerp(시작값, 종료값, t)
Quaternion.Slerp(시작각도, 종료각도, t)
Vector3.SmoothDamp()
current : 시작위치
target : 목표 위치
currentVelocity : 현재 속도
smoothTime : 목표위치까지의 도달 시간
maxSpeed : 최대 속력 제한 값(기본값 : 무한대 Mathf.Infinity), 생락가능
deltaTime : 프레임 보장을 위한 델타 타임(기본값 : Time.deltaTime), 생략 가능
이런식으로 사용한다.
Update를 통해 카메라를 설정을 한다면
매 프레임 호출되는 기본적인 Update 함수로, 프레임마다 전체 시스템에서 수행되는 작업의 양이 매번 다르므로 Update가 호출되는 주기가 일정하지 않다.
즉 성능이 좋은 컴퓨터는 깜빡히는 횟수(프레임)이 많고, 성능이 안좋은 컴퓨터는 화면 깜빡이는 횟수(프레임 수)가 적다.
그래서 Update에서 직전 프레임이 완료되는 데까지 걸린 시간 즉, 현재 프레임과 이번 프레임 사이 시간을 반환하는 Time.deltaTime을
Update 함수가 호출 되고 나서 호출이 되는 LateUpdate에다가
Time.deltaTime 60 or Time.deltaTime 30
60프레임이나 30프레임 (== 결과값을 곱해 준다) 그러면 한번 실행할 때 얼마만큼 실행을 할지 정해진다.
실시간 그림자 => 많은 부화
그렇기 때문에 그림자 효과가 필요 없는 3D 모델은 실시간 그림자를 처리 하지 않도록 하는 옵션을 반드시 검토해야 함.
3D 모델은 아래 두 개의 컴포넌트를 반드시 포함하고 있다.
위의 두 개의 컴포넌트에는 실시간 그림자와 관련된 속성이 있음.
Cast Shadow : 물체의 그림자를 그릴 것인가에 대한 여부
off : 그림자를 만들지 않음
on : 그림자를 만듬
Two Sided : 백페이스 컬링을 무시하고 그림자를 양면으로 만듬
Quad 같은 단면만 렌더링 하는 모델의 경우 Cast Shadow 속성을 On 으로 해도 그림자가 만들어 지지 않음. 그렇기 때문에 Two Sided로 설정하면 그림자를 생성할 수 있다.
Shadow Only : 그림자를 만들지만 자신은 렌더링 하지 않음. 즉, 화면에 보이지 않는 특성이 있어 그림자 처리만을 위한 3D 모델에 활용할 수 있음
Receive Shadows : 이 물체의 표면에 다른 물체의 그림자를 그릴것인가에 대한 여부
== 그림자 폴리커 현상
매쉬A와 매쉬B의 깊이(뎁스)가 동일하거나 유사하여 무엇이 우선으로 렌더링 되어야할지 모르는 상황이 발생하게 되면 매쉬A와 매쉬B가 겹쳐보이는 현상
출처: https://chipmunk-plump-plump.tistory.com/350 [다람쥐와 포동포동이:티스토리]
< 해결법 >
1. 렌더링의 우선순위를 값을 조정한다. (확 차이가 나게)
2. 매쉬A와 매쉬B의 거리를 벌린다.
3. 유니티에서는 카메라의 Near를 올리고 Far를 낮춰 정확도를 올려준다.
4. 마찬가지로 유니티에서 Near / Far = 정밀도인데, 모바일에서는 소수점을 잘라버리기 때문에
애초에 소수점이 나오지 않도록 Near와 Far를 조정해준다
출처: https://chipmunk-plump-plump.tistory.com/350 [다람쥐와 포동포동이:티스토리]
총알이 물리적으로 발사되는 방식으로 총알이 직접 날아가 적에게 타격을 입힌다. 따라서 당연히 총알이 시각적으로 표현되지만, 짧은 시간동안 여러개의 총알을 생성하게 되면 게임의 속도가 저하되는 단점이 있음. 따라서 총알은 일반적으로 로우폴리모델이나 Panel Mesh 모델에 텍스쳐를 입혀 사용한다. 총알 역시 동적으로 생성하기 보다는 오브젝트 풀(Object Pool)개념을 도입해 총알을 미리 생성해두고 번갈아 가며 발사되도록 구현하는 편이 속도 향상에 유리하다.
FPS게임에서 저격용 총의 발사 루틴을 구현하는데 자주 활용된다. 실제 총알이 발사되는 방식이 아니라 레이저 빔과 같이 눈에 보이지 않는 선을 발사해 적 또는 물체를 검출하는 방식임. 즉, 총을 쏘면 총구 화염이 표시됨과 동시에 멀리 떨어져 있는 적이 피격되는 효과를 연출할 수 있다.
( 근데 레이 쓰면 쏘자 마자 맞는 현상이 발생함. )
유니티에서 게임 오브젝트를 이동할 때 보통 Transform의 Position 속성을 이용하거나 Rigidbody컴포넌트를 추가해 물리 시뮬레이션을 이용함
Rigidbody컴포넌트를 게임오브젝트에 추가하면 해당 게임오브젝트는 물리엔진의 영향을 받음
Collider컴포넌트는 충돌을 감지하는 일종의 "센서"
- Box Collider
가장 일반적인 충돌 체크 (건물등에 사용)- Sphere Collider
가장 처리속도가 빠름- Capsule Collider
주로 Player나 적 캐릭터의 충돌체로 사용할 때가 많음- Mesh Collider
충돌 감지를 위한 CPU부하가 제일 많은 Collider- Wheel Collider
차량의 바퀴에 사용할 목적으로 제공되는 Collider- Terrain Collider
지형의 충돌을 위한 Collider
IsTrigger : Off
OnCollisionEnter()
OnCollisionStay()
OnColiisionExit()
IsTrigger : On
OnTriggerEnter()
OnTriggerStay()
OnTriggerExit()
트레일 렌더러란?
Scene의 GameObject가 움직일 때 뒤에서 트레일을 만드는데 사용을 한다.
ex) 총알 발사체 제작할 경우
이 컴포넌트는 유니티에서 제공하는 기본 컴포넌트이다.
이거 보고 이해 ㄲ
Physics.OverlapSphere - 중점과 반지름으로 가상의 원을 만들어 추출하려는 반경 이내에 들어와 있는 콜라이더들을 반환하는 함수.
함수의 반환 값은 Collider 컴포넌트의 배열로 넘어옵니다.
또한 OverlapSphere 함수는 특정 레이어만 검출할 수도 있어요.
https://a-game-developer0724.tistory.com/54
AddExplosionForce=> 폭발력을 전달하는 함수=> rigidbody.AddExplosionForce(폭발력, 원점, 반경, 위로 솟구치는 힘)
ex)
Collider[] cols = Physics.OverlapSphere(tr.position, 10.0f);
foreach(Collider col in cols)
{
if(col.rigidbody != null)
{
col.rigidbody.AddExplosionForce(300.0f, tr.position, 10.0f, 300.0f);
}
}
https://you-rang.tistory.com/65
유니티의 애니메이션 상태머신 시스템, 애니메이션 미들웨어 엔진.
FSM 상태에 따라 적절한 애니메이션 조작을 메카님을 이용하여 구현함.
시각적인 설계방식을 제공함.
Humanoid : 팔(2개), 다리(2개), 머리(1개)를 가진 인간형 캐릭터 -> "리타겟팅(ReTargetting)" 시스템을 사용하여 애니메이션을 공유 할 수 있음
예) 오크/ 엘프/ 사람 … 같은 애니메이션 공유
Generic : 인간형을 제외한 4족 보행동물, 슬라임과 같은 기타 메시등을 일컬음
리타겟팅 기능이 제공되지 않고 메카님을 이용하여 애니메이션 처리
메카님 장점 : 리타겟팅 가능
리타겟팅 : 다른 애니메이션 동작을 가지고 와서 적용이 가능
메타님 애니메이션에서 리타게팅을 사용하려면 모델과 애니메이션 클립의 Animation Type 둘다 Humanoid 로 설정이 되어 있어야 함
3D 애니매이션 Tool 사용
모든 애니메이션 클립이 한 파일에 들어있고, 시작프레임과 종료프레임을 가져 개발자가 직접 분리하여 사용함.
모든 애니메이션 클립이 한 파일에 들어있고, 분리되어 있는 상태
클립을 동작별로 분리해서 별도의 파일로 생성 (수정이 많다면)
FSM : 유한 상태 머신
FMS은 자신의 상태 값을갖고 있어야 하며, 현재 어떤 상태인지 갱신하고 해당 상태에 맞는 행동을 취해야한다.
적 캐릭터의 상태를 Idle, Walk, Attack, Die로 정의한다.
내가 하던거
몬스터 공격 중지 할 경우
PlayerDie() 함수 업데이트
SendMessage : 첫번째 인자로 전달한 함수명과 동일한 함수가 해당 게임오브젝트의 스크립트에 있다면 실행하라.
SendMessageOptions.DontRequireReceiver : 호출한 함수가 없더라도 함수가 없다는 메세지를 반환하지 않겠다. -> 빠른 실행을 위해서 반드시 필요함
canvas
Canvas 객체는 Canvas 컴포넌트를 자체 포함하고 있는 게임 오브젝트임.
모든 UI 항목(UI Element)은 반드시 Canvas객체의 하위에 위치해야 함.
Rect Transform 컴포넌트를 가짐.
Canvas 객체의 하위로 차일드 함.
EventSystem 객체도 자동 생성.
EventSystem 객체는 시스템에서 발생하는 키보드, 조이스틱, 스크린 터치 등의 입력 정보를 Canvas하위에 있는 UI 항목에 전달하는 역할을 담당.
Canvas 컴포넌트는 Render Mode에 따라 3가지 옵션에 따라 화면 배치 방식을 다음과 같이 정의할 수 있다.
Screen Space - Overlay : 일반적인 방법
Screen Space - Camera : 카메라를 하나 더 두어 입체적으로 구현
World Space : VR에서의 HUD 같은 UI 구현
Eventsystem
이벤트 시스템은 UI에 대한 이벤트를 담당하고 있다.
이 객체의 생성 방법은 이렇다.
GameObject -> UI -> Canvas를 눌러 생성하면 자동으로 생성된다.
EventSystem 객체는
EventSystem.
Standalone Input Modult.
Touch Input Module
컴포넌트를 포함하고 있다.