※ 물리 엔진은 1초에 50번만 계산한다.
그런데 우리 움직임은 Update 에서 움직ㅇ므로 프레임이 서로 같지않다. 비동기화 되어있다.
이를 해결하기위해 프레임 동기화를 해줘야한다.
1. 물리엔진의 프레임을 끌어올려준다. Edit - Project Setting - Time 에서 Fixed Timestep 을 건드린다.
2. Rigidbody 에서의 Interpolate 버젼을 Interpolate 로 해준다. ( 그래도 끊기면 Extrapolate )
3. Application.targetFrameLate = int 값 으로 프레임 값을 고정시켜 버릴수있다.
※ 스크립트 상에서 빨간줄이 그어져 있는 부분에 커서를 놓고 F12 를 누르면 고쳐할 부분으로 워프
돌아오기는 Ctrl + Tab
※ 과거에 컴퍼넌트가 꺼져있을 때도 플레이 되는 순간 돌아갔다. 지금은 세상에 꺼내져있어도 액티브 상태가 아니라면,
실행이 안되고 있다.
※ 부모가 LigidBody 가 있다면 하위는 모두 Dynamic 이다.
※ 기존의 스위치문 사용하던 것을 Dictionary 를 이용하여 바꿔줄수 있다 .
Dictionary <ENEMYSTATE, System.Action> dic = new Dictionary<ENEMYSTATE, System.Action>()
로 선언을 해주고
dic[ENEMYSTATE.IDLE] = Idle ;
dic[ENEMYSTATE.MOVE] = Move ;
dic[ENEMYSTATE.ATTACK] = Attack ;
dic[ENEMYSTATE.DAMAGE] = Damage ;
dic[ENEMYSTATE.DEAD] = Dead ;
식으로 미리 선언을 해주고, dic[enemyState](); 식으로 Update 에서 호출하면 enemyState 에 따라 적당한 함수가 호출된다.
Delegate 와 동일하다 = System.Action
애니메이션 추가설명
※ 맞는 도중 또맞아도 그냥 Play 로 했다면, 맞다가 또 맞아도 기존에 플레이 되던 애니메이션을 마저 플레이 한다.
만약 플레이 도중이어도 다시 플레이를 시켜야 한다면
AnimationState animStae = anim.PlayQueued("Damage", QueueMode.PlayNow);
※ AnimationState = anim[ " " ] 와 같지만 PlayQueued 에서는 적용이 불가능하다.
playqueue 할때는 재생시키고, 스피드 바로 바꿔줘야함
※ 죽는 모션이 모두 끝난 다음에 객체를 사라지게 하고싶다면 어떻해해야할까 나는 이런 식으로 구현했다. void Dead() {
if (dead) ※ dead 는 bool 함수로 단 한번 실행된다.
{
anim.PlayQueued("Die",QueueMode.PlayNow); ※피격중이었던 공격중이엇던 즉시 Die 애니메이션ㅇ로
dead = false; 넘어간다.
}
if (!anim.isPlaying) ※ 현재 수행되고 있는 애니메이션이 없다면
{
Destroy(gameObject);
manager.cnt -= 1;
}
}