유니티

애니메이션의 특정 부분에 다른 이벤트가 함께 나타나는 기능 / Animation Event / Hit

nock_ji 2022. 6. 5. 21:47

 

 

애니메이션의 원하는 부분에 다른 이벤트가 함께 나타나게 하기

 

 

 

 

 

 

대부분 가져온 애니메이션의 경우, Attack(Read-Only)로 되어있기 때문에 수정이 불가능 하다

즉, 수정 가능한 애니메이션으로 바꿔야 한다

 

 

본래 애니메이션을 Ctrl+D 로 복붙하여 날 것의 애니메이션을 만든다

그럼 Read-Only였던 애니메이션은 수정 가능한 애니메이션이 된다

 

 

수정 가능한 애니메이션이 되었다면, 행동 중에 원하는 부분만 콕 집을 수 있다 ! 

 

 

✏️ Add Animation Event :  긴 형태의 아이콘이 바로 콕 집는 아이콘이다 

 

 

콕 집은 Animation Event를 클릭하면 Inspector창에 사용가능한 함수 목록이 뜬다 (아직 설정한 것이 없어 No Function이다)

 

 

( Animator는 이미 추가되어있음 ) 추가하고 싶은 이벤트를 위해 EnemyAnimationEvent 스크립트를 생성하여 붙인다.

 

 

 

📌 EnemyAnimationEvent.cs

공격 애니메이션의 공격시점과 공격종료시점을 알고싶다
//공격 애니메이션의 공격시점과 공격종료시점을 알고싶다
public class EnemyAnimationEvent : MonoBehaviour
{
	Enemy enemy;
    
    void Start
    {
    	//부모에 있는 컴포넌트를 가져옴
    	enemy = gameObject.GetComponentInparent<Enemy>();
    }
    
    public void OnAttackHit()
    {
    	enemy.OnAttackHit();
    }
    
    public void OnAttackFinished()
    {
    	enemy.OnAttackFinished();
    }
    

}

프리펩 안에 있는 EnemyAnimationEvent.cs

부모 Enemy와 통하고 있는 상태가 아니기 때문에 AddComponent로 Enemy.cs를 가져온다

 

 

 

이 때, Animation Event에 넣을 수 있는 함수 목록이 뜬다

각각 필요한 부분에 함수를 할당한다

 

 

📌 Enemy.cs

enemy와 player 사이의 거리를 구하고, 그 거리가 공격가능거리 이하라면, 어떤 이펙트를 하도록한다.

player가 맞는 이펙트는 아래에서 다룬다 !

public class Enemy : MonoBehaviour
{

	.
    	.
    	.
    
    
    //UpdateMove()는 OnAttackHit를 위해 가져온 함수
    void UpdateMove()
    {
    	//agent기능을 이용해서 목적지를 향해 이동하고싶다
        agent.SetDestination(target.transform.position);
        //1.enemy와 player 사의의 거리를 구하고
        float dist = Vector3.Distance(transform.position, target.transform.position);
        //2.그 거리가 공격가능거리(agent.stoppingDistance)이하라면, 공격상태로 전이하고싶다
        if (dist <= agent.stoppingDistance)
        {
        	state = State.ATTACK;
            anim.SetTrigger("Attack");
        }
    }
    
    public void OnAttackHit()
    {
    	//enemy와 player 사이의 거리를 구하고싶다
    	float dist = Vector3.Distance(transform.position, target.transform.position);
        // 그 거리가 공격가능거리(agent.stoppingDistance) 이하라면, 맞는 이펙트를 한다
        if (dist <= agent.stoppingDistance)
        {
    		HitManager.instance.DoHitPlz();
    	}
    }
    
    public void OnAttackFinished()
    {
    	// 만약 공격가능거리가 아니라면 (Player가 도망갔다면)
        float dist = Vector3.Distance(transform.position, target.transform.position);
        if (dist > agent.stoppingDistance)
        {
        	//이동상태로 전이하고 싶다
            state = State.MOVE;
            //애니메이션도 함께
            anim.SetTrigger("Move");
        }
    }
    

}

 

 

 

 

📌 1인칭시점에서 공격받았을 때 표시하기

공격받으면, 0.1초 동안 빨간 화면이 깜빡하고 사라지는 효과

 

Hit Manager Script빈 오브젝트 Hit Manager 에 추가한다.

* Canvas 오브젝트에 Hit 스크립트를 추가했을 때, 오브젝트가 비활성화 된 경우 스크립트가 계속 작동할 수 없기 때문에 다른 오브젝트에 추가한다.

//Enemy -> Player 공격했을 때 Hit UI를 활성화하고 
//0.1초 후에 비활성화하고싶다
public class HitManager : MonoBehaviour
{
	public static HitManager instance;
	public GameObject hitUI;
    
    void Awake()
    {
    	instance = this;
    }
	
    void Start()
    {
    	//태어날 때 Hit UI를 비활성화하고 싶다
        hitUI.SetActive(false);
    }
    
    public void DoHitPlz()
    {
    	StartCoroutine("IEDoHitPlz");
    }
    
    IEnumerator IEDoHitPlz()
    {
    	//깜빡거리고싶다
        hitUI.SetActive(true);
        //0.1초 후
        yield return new WaitForSeconds(0.1f);
        hitUI.SetActive(false);
    }
    

}