2022. 2. 20. 17:09ㆍUnity3D/수업 내용
애니메이션의 특정 프레임에 이벤트 부여하기
애니메이션 이벤트는
애니메이션의 특정 지점에서 특정한 동작을 실행하기 위해 사용했던
임팩트타임 보다 간편한 방법이다.
애니메이터가 달린 컴포넌트에 애니메이션 이벤트를 받을 스크립트를 부착한다.
public UnityEvent<string> animEventTrigger = new UnityEvent<string>();
그리고 메인 스크립트로부터 이벤트 발생 시에 실행할 코드를 담는 이벤트 시스템 객체를 생성한다.
(대리자와 비슷)
이를 위해 using UnityEngine.Events; 를 작성한다.
메인스크립트가 이벤트 시스템 객체에 AddListener로 동작을 추가하고,
애니메이션 클립에서 특정 프레임 구간에 Add Event로 그 이벤트 시스템 객체가 있는 스크립트의 함수를 호출한다.
그 함수에서 이벤트 시스템 객체를 Invoke()한다.
또한 이벤트 시스템 객체를 생성할 때 받을 매개변수도 설정할 수 있어서
Invoke(string eventName);
등등 활용할 수 있다.
HUD 텍스트 표기하기
주인공 캐릭터가 공격한 대상의 머리 위에 데미지 텍스트가 표시되게 한다고 해보자.
표시를 담당하는 스크립트는
텍스트 게임오브젝트의 프리팹을 가지고 있어야 하고,
텍스트가 표시될 위치 정보를 가져야 한다.
일단, 텍스트 프리팹을 인스턴스화 하는데 텍스트는 UI오브젝트이기 때문에
Instantiate()에 두번째 인수를 넣어서 Canvas를 부모로 만들어줘야 한다.
그리고 텍스트가 표기 될 위치 정보를 게임 3D 공간 상의 좌표로 갖고 있기 때문에,
UI 공간 상의 좌표로 바꿔야만 우리가 원하는 위치에 텍스트를 띄울 수 있다.
-> text.transform.position = Camera.main.WorldToScreenPoint(textPoint.position);
이러면 대상의 머리 위에 텍스트를 표기하기 완성이다.
위에서 배운 애니메이션 이벤트와 결합해 사용할 수 있다.
소스코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class AnimationEventReceiver : MonoBehaviour
{
public UnityEvent<string> animEventTrigger = new UnityEvent<string>();
public void OnTriggerAnimationEvent(string eventName)
{
Debug.Log(eventName);
animEventTrigger.Invoke(eventName);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class TestMain : MonoBehaviour
{
[SerializeField] Button btnAttack;
[SerializeField] Animator anim1;
[SerializeField] Animator anim2;
[SerializeField] GameObject hudText;
[SerializeField] Transform point;
[SerializeField] Transform canvasRect;
void Start()
{
anim1.gameObject.GetComponent<AnimationEventReceiver>().animEventTrigger.AddListener((eventName) =>
{
Debug.Log(eventName + "made a lot of damage!");
anim2.Play("GetHit", -1, 0);
GameObject txt = Instantiate(hudText, canvasRect);
txt.transform.position = Camera.main.WorldToScreenPoint(point.position);
txt.transform.DOLocalMoveY(200f, 0.5f).onComplete = () =>
{
txt.transform.DOScale(1, 1f).onComplete = () => Destroy(txt);
};
});
btnAttack.onClick.AddListener(() =>
{
anim1.Play("Attack01", -1, 0);
});
}
}
'Unity3D > 수업 내용' 카테고리의 다른 글
22.02.15 업적 창 구현하기 (0) | 2022.02.15 |
---|---|
22.02.14 Shop 메뉴 구현하기 (0) | 2022.02.14 |
22.02.11 UI 기능 추가 (페이지, 해금, 재화 표시) (0) | 2022.02.11 |
22.02.04 JSON 데이터를 UI에 바인딩하기 (0) | 2022.02.05 |
22.02.03 Canvas와 UI 배우기 (0) | 2022.02.03 |