생각보다 웃긴 문제가 발생했다. 스크립트의 초기화 문제인데, monstermanager에서 activeMonsters 리스트를 만들고 이를 monster가 생성될 때 monster.cs에서 add 해주는 방식으로 몬스터의 수를 관리.
이후 몬스터 수가 0이 되면 다음 스테이지로 넘어가는 방법을 했었다.
근데 monster의 생성 속도가 monstermanager보다 빠르면 오류가 나는 것.
실은 이후 프로젝트가 진행됨에 따라 무조건 monstermanager가 먼저 만들어지기 때문에 (시작 화면 등) 해결할 필요는 없지만 해결 방안은 있다.
Edit > Project Setting > Script Execution Order

여기서 script의 순서를 결정할 수 있던 것. Default time보다 일찍 스크립트를 적용하게 되면 무조건 monster보다 빠르게 생성된다.
IEnumerator PlayAttackAnimation(float attackType)
{
isAttacking = true;
m_animator.speed = m_stats.attackSpeedMultiplier;
m_animator.SetTrigger("Attack" + attackType);
AnimatorClipInfo[] clipInfos = m_animator.GetCurrentAnimatorClipInfo(0);
float clipLength = clipInfos.Length > 0 ? clipInfos[0].clip.length : 0.5f;
yield return new WaitForSeconds(clipLength / m_stats.attackSpeedMultiplier);
isAttacking = false;
m_animator.speed = 1.0f;
}
원래 여기서 isAttacking을 체크하고 끝내고를 확인했는데, 이렇게 될 경우 특정 공격에서 완벽하게 시간처리가 안되서
bool isParried = otherAnimator != null && otherAnimator.GetBool("PerfectParrying");
bool isAttacking = m_monster.isAttacking; // 몬스터가 공격 중인지 여부
bool isGuarding = m_monster.isGuarding; // 몬스터가 방어 중인지 여부
// 경직 여부 판단
bool applyStun = true;
if (m_stats.SuperArmor)
{
// 슈퍼아머 상태일 때는 공격중에만 패리됨
applyStun = isParried && isAttacking && !isGuarding;
}
이런 식으로 슈퍼아머의 공격처리에서 시간차이 때매 오류가 생기는 것을 발견.
그래서
// 센서 콜라이더 활성화 및 비활성화
public void EnableSensorCollider()
{
m_sensorMonster.sensorCollider.enabled = true;
m_monster.isAttacking = true;
}
public void DisableSensorCollider()
{
m_sensorMonster.sensorCollider.enabled = false;
m_monster.isAttacking = false;
}
몬스터 공격에서의 콜라이더 활성화 쪽으로, 아예 애니메이션 이벤트 쪽으로 넘겨버림.