이벤트 호출 문제

문제점

  • 이벤트 Invoke 당시 Vector2 값이 있는데
  • 이벤트를 수신하는 코드에서 Vector2 값이 zero가 되는 문제

확인사항 1 : Event Invoke 확인

  • 이벤트에서 Invoke 확인
  • 플레이어 및 Goblin 모두 이벤트 메서드를 상속 받기 때문에 Tag를 활용한 이벤트 주체 확인
protected void CallMoveEvent(Vector2 direction)  
{             
	OnMoveEvent?.Invoke(direction);  
    if (gameObject.CompareTag("Goblin"))  
    {        
	    Debug.Log($"꼬부꼬부 Call Move Invoke 디렉션 {direction}");  
    }
}
  • FixedUpdate에서 rigidbody 값을 변경하는 최종 움직임 코드 확인
private void ApplyMovement(Vector2 direction)  
{  
    direction *= _characterStatsHandler.CurrentStates.speed;  
    if (gameObject.CompareTag("Goblin"))  
    {       
	    Debug.Log($"꼬부꼬부 ApplyMove Before디렉션 {direction}");  
    }    
    _rigidbody2D.velocity = direction;  
}
  • 결괏값

  • 정상적으로 Invoke 를 하고 있지만, 결과 direction이 Vector2.zero 가 나오는 상황
  • 컴포넌트에는 정상적으로 접근하는 것으로 확인되어 스크립트가 오브젝트에 정상적으로 할당 된 것으로 판단

확인사항 2 : Move 수신자 확인

  • ApplyMovement 전에 direction을 할당하는 이벤스 수신자 확인
private void Move(Vector2 direction)  
{              
	if (gameObject.CompareTag("Goblin"))  
    {       
	    Debug.Log($"꼬부꼬부 Move After 디렉션 {direction}");  
    }    
    _moveDirection = direction;  
}
  • 결괏값
  • 해당 메서드가 호출 되지 않음
  • Move 메서드 실행이 안되므로 Invoke를 수신 받는 초기화 부분 확인

확인사항 3 : 이벤트 수신자 초기화 확인

  • 해당 MoveEntities 클래스 초기화 Start 확인
private void Start()  
{  
    _inputEvents.OnMoveEvent += Move;   

	if (gameObject.CompareTag("Goblin"))  
    {        
	    Debug.Log($"꼬부꼬부 OnMove 이벤트 호출!");  
    }
}
  • 결괏값

  • 정상적으로 구독하는 것을 확인함
  • 이벤트 구독 후 왜 Move 메서드가 실행되지 않는지 확인해야 함

문제점 파악

  • 아래는 Goblin 객체의 Component 입니다.

  • Class 상속 구조는 다음과 같습니다.

상속 다이어 그램

  • 문제는 Input System의 경우 플레이어의 Input 을 관리하게 되는데
  • 이때 Goblin의 오브젝트의 움직임 까지 제어를 하게 되어 호출 문제가 발생
  • Input System 스크립트를 Goblin 오브젝트에서 제거하여 필요없는 이벤트 호출을 제거하면 해결될 것으로 예상