애니메이션의 원하는 부분에 다른 이벤트가 함께 나타나게 하기
대부분 가져온 애니메이션의 경우, 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);
}
}
'유니티' 카테고리의 다른 글
Slider HP Bar / property / Billboard (0) | 2022.06.06 |
---|---|
player 순찰 & 추적 / waypoint / NavMeshAgent (0) | 2022.06.06 |
공격을 받았을 때 Material 바꾸기 (Flash effect) (0) | 2022.05.24 |
싱글톤 Singleton (C#) (0) | 2022.05.15 |
FBSGunTarget 1인칭 시점 object grab (0) | 2022.05.12 |