1. Project Setting - audio - system sample Rate 가 0일 경우 오디오가 적용되지 않을 수 있다 (0인데 잘 적용되긴 함)
2. Build Settings 씬을 등록해놔야 불러올 수 있다
3. gizmo 옵션에서 selection outline 체크를 해제하면 오브젝트 선택시 나오는 주황색 라인을 안보이게 함
4. Player의 레이어를 Ignore Raycast로 하면 Raycast에 플레이어 자신이 포함되는것을 제외할 수 있다
5. 애니메이터의 시작 애니메이션을 팔을 꺼내는 듯한 모습으로 시작해 idle로 전환하는게 자연스럽다 (해변에서 깨어나는 애니메이션등) 이런 식으로 state를 할 경우 idle이 기본값이 아니기 때문에 Any State 애니메이션을 사용후 자연스럽게 idle 쪽으로 transition을 설정해주는것이 좋다
6. animation option & tip
has exit time은 애니메이션이 완전히 종료될때까지 대기한다
exit타임은 애니메이션 종료시간을 설정한다 (1이면 완전히 종료될때까지 기다린다)
transition duration은 애니메이션이 종료된 뒤 대기시간을 설정한다 애니메이션이 모두 보여지게한뒤 즉각 전환하려면 0으로 한다
idle 상태에서 walk, run 등으로 자연스럽게 전환되게 하려면 hasexit를 끈뒤 duration 0.1이 적당하다.
Any State의 Can Transition To Self 옵션은 자기 자신의 State로도 전이가 가능한지를 체크하는 옵션이다
애니메이션 클립에서 Loop Pose 기능은 Loop Time이 체크된 애니메이션의 시작과 끝을 자연스럽게 이어지도록 만들어주는 옵션이다
애니메이터 컨트롤러는 0,0,0 좌표에 로컬트랜스폼으로 있는 오브젝트에 붙여놓는게 편하다
7. Particle System
파티클 시스템의 scale, duration, lifetime, speed이나 Emission, Shape, Color over Lifetime, Size over Lifetime, Renderer, Texture Sheet Animation(sprite로 변경하면 renderer의 머터리얼을 sprite-default로 바꿔줘야함) 등을 만지면서 원하는 이펙트효과를 만들어낼 수 있다. (스킬의 모양이나 총구의 화염 등, 이것저것 눌러보면서 실험하자)
파티클을 맞는 대상에 있는 스크립트의 OnParticleCollision() 메소드는 particle의 collision이 체크되어있고 Send Collision Message가 체크되어있을때만 호출된다.
paticle system의 collision 탭에서 lifetime loss의 값을 1로 변경하면 충돌 즉시 사라지게 할수있다. (기본값 0 : 안사라짐)
renderer 탭의 renderer alignment는 기본값이 view라 카메라의 방향에 따라 파티클의 방향도 변경된다. (velocity로 변경하자)
simulation space를 Local에서 Global로 바꾸면 처음에 발사된 파티클이 처음 발사된 방향 그대로 날아간다 (기본값 Local의 경우 Target을 추적하는 로직으로 작성한 경우 파티클이 이동중에도 타겟을 향해 유도탄처럼 휘어진다)
8. optimize
* 연산량이 많이 들어가는 메쉬콜라이더는 필요할때만 쓴다
(모델링에 딱 맞춰 메쉬를 생성해준다)
(메쉬콜라이더의 컨벡스 항목을 체크하면 메쉬를 단순화 시켜 연산량을 크게 줄여주지만 그래도 나무나 석재같은 맵 전체에 깔리는
오브젝트에 쓰기에는 부적합하다)
* 이럴때는 그냥 박스 콜라이더같은 일반 콜라이더를 쓰자
모든 객체들이 가지는 동일한 데이터들을 ScriptableObject 로서 한 군데에 에셋으로서 모아 관리하고 생성되는 오브젝트들이 이 동일한 에셋을 참조하면 메모리를 효율적으로 쓸 수 있게 된다. 예를 들어 ScriptableObject 을 상속 받는 ZombieData 클래스를 만들고 이 곳에 좀비가 가지는 데이터들을 모아 두고 이를 에셋으로 생성하여서 좀비 오브젝트들이 이 곳을 참조하게 하면 된다!
메모리 사용을 줄인다. -> 여러 사본들이 생성되는 것을 방지
이 ScriptableObject을 참조하게 된다.
MonoBehavior 대신 ScriptableObject를 상속 받는다면
다른 스크립트와 달리 오브젝트에 컴포넌트로서 붙일 수 없다. [MonoBehavior를 상속 받지 못 했으니까]
이벤트는 OnEnable, OnDisable, OnDestroy 만 받을 수 있다.
스크립트는 아닌 에셋이다. 어떤 고유한 파일로서.
클래스이름.CreateInstance 와 클래스이름.CreateAsset 으로, 이 클래스의 인스턴스를 만들고 이를 하나의 에셋으로서 생성할 수 있다.
그냥 스크립트나 폴더 추가하듯이 [CreateAssetMenu]로 에셋 생성 메뉴에 쉽게 추가할 수 있도록 할 수도 있다.
[CreateAssetMenu](filename, menuName, order)
// filename 이 에셋을 생성하게 되면 기본적으로 지어질 이름
// menuName 유니티 에셋-우클-Create- 메뉴에 보일 이름
// order 메뉴에 보일 순서 (기본적으론 첫 번째)
[CreateAssetMenu(fileName = "New Item", menuName = "New Item/item")]
public class Item : ScriptableObject
{
}
Item 클래스는 ScriptableObject 를 상속받는다.
다른 스크립트와 달리 오브젝트에 컴포넌트로서 붙일 수가 없다.
아이템들이 가지는 기본적인 데이터들을 관리한다.
에셋으로서 만들어 둘 수 있다.
9. OnEndDrag 과 OnDrop 의 차이
OnEndDrag -> 나 자신을 드래그 하는 것을 끝냈을 때 호출
내가 드래그 되는 것이 끝났을 때!
드래그가 종료했을 때, 드래그 대상이 되었던 오브젝트에서 호출 됨.
OnDrop -> 누군지 모르겠지만 내 자신한테 드롭 된 무언가가 있을 때 호출.
나한테 누가 드롭 되었을 때!
드래그를 멈춘 위치에 있는 오브젝트에서 호출 됨.
드롭 된 다른 곳의 OnDrop 이, 드래그를 끝낸 내 OnEndDrag 보다 먼저 실행된다.
10. Trigger 사용시 주의점
Trigger는 상대 오브젝트에 RigidBody가 있는 경우에만 반응하기 때문에
적용할 오브젝트에 mass drag usegravity등 속성값을 전부 없애고 is Kinematic만 넣은 껍데기 리지드바디를 넣어준다