Unity Version : 2021.3.5f1
https://docs.unity3d.com/kr/2019.4/Manual/script-AnimationWindowEvent.html <- 공식 문서
https://assetstore.unity.com/packages/3d/characters/humanoids/barbarian-warrior-75519 <- 테스트 에셋
스크립트로 애니메이션 이벤트 추가
바바리안 모델은 애니메이션 컨트롤러가 없다. (직접 만들어주자)
각 Idle, Walk의 애니메이션이 끝나면 이벤트를 실행 (Run과 RoundKick은 X )
using UnityEngine; public class Test : MonoBehaviour { private Animator ani; public AnimationClip Idle; public AnimationClip Walk; private void Awake() { this.ani = this.gameObject.GetComponent<Animator>(); this.Idle.AddEvent(new AnimationEvent() { time = Idle.length, // 애니메이션 클립의 길이를 받아서 이벤트 추가 functionName = "FunctionIdle" // 함수의 이름과 같아야한다. }); this.Walk.AddEvent(new AnimationEvent() { time = Walk.length, functionName = "FunctionWalk" }); } private void FunctionIdle() { Debug.Log("Idle 실행"); } private void FunctionWalk() { Debug.Log("Walk 실행"); } }
애니메이션에서 직접 이벤트 추가
바바리안 애니메이션은 Read only라서 수정이 불가능하다. (이벤트 추가 X)
새로운 애니메이션을 만들고 Run을 복붙하면 수정가능하다.
using UnityEngine; public class Test : MonoBehaviour { private Animator ani; public AnimationClip Idle; public AnimationClip Walk; private void Awake() { this.ani = this.gameObject.GetComponent<Animator>(); this.Idle.AddEvent(new AnimationEvent() { time = Idle.length, functionName = "FunctionIdle" }); this.Walk.AddEvent(new AnimationEvent() { time = Walk.length, functionName = "FunctionWalk" }); } private void FunctionIdle() { Debug.Log("Idle 실행"); } private void FunctionWalk() { Debug.Log("Walk 실행"); } private void FunctionRun() { Debug.Log("Run 실행"); } }
애니메이션 이벤트 파라미터 사용하기
https://forum.unity.com/threads/how-to-use-multiple-param-in-animation-event.364138/ <- 참고
using UnityEngine; public class Test : MonoBehaviour { private Animator ani; public AnimationClip Idle; private void Awake() { this.ani = this.gameObject.GetComponent<Animator>(); this.Idle.AddEvent(new AnimationEvent() { time = Idle.length, intParameter = 100, stringParameter = "바보", functionName = "FunctionIdle" }) ; } private void FunctionIdle(AnimationEvent myEvent) { Debug.Log("Idle 실행"); Debug.Log(myEvent.intParameter); // 파라미터 사용 Debug.Log(myEvent.stringParameter); // 파라미터 사용 } private void FunctioasdnRun() { Debug.Log("Run 실행"); } }
참고
using System; using System.Runtime.InteropServices; using UnityEngine.Scripting; namespace UnityEngine { // // 요약: // AnimationEvent lets you call a script function similar to SendMessage as part // of playing back an animation. [Serializable] [StructLayout(LayoutKind.Sequential)] [RequiredByNativeCode] public sealed class AnimationEvent { internal float m_Time; internal string m_FunctionName; internal string m_StringParameter; internal Object m_ObjectReferenceParameter; internal float m_FloatParameter; internal int m_IntParameter; internal int m_MessageOptions; internal AnimationEventSource m_Source; internal AnimationState m_StateSender; internal AnimatorStateInfo m_AnimatorStateInfo; internal AnimatorClipInfo m_AnimatorClipInfo; [Obsolete("Use stringParameter instead")] public string data { get { return m_StringParameter; } set { m_StringParameter = value; } } // // 요약: // String parameter that is stored in the event and will be sent to the function. public string stringParameter { get { return m_StringParameter; } set { m_StringParameter = value; } } // // 요약: // Float parameter that is stored in the event and will be sent to the function. public float floatParameter { get { return m_FloatParameter; } set { m_FloatParameter = value; } } // // 요약: // Int parameter that is stored in the event and will be sent to the function. public int intParameter { get { return m_IntParameter; } set { m_IntParameter = value; } } // // 요약: // Object reference parameter that is stored in the event and will be sent to the // function. public Object objectReferenceParameter { get { return m_ObjectReferenceParameter; } set { m_ObjectReferenceParameter = value; } } // // 요약: // The name of the function that will be called. public string functionName { get { return m_FunctionName; } set { m_FunctionName = value; } } // // 요약: // The time at which the event will be fired off. public float time { get { return m_Time; } set { m_Time = value; } } // // 요약: // Function call options. public SendMessageOptions messageOptions { get { return (SendMessageOptions)m_MessageOptions; } set { m_MessageOptions = (int)value; } } // // 요약: // Returns true if this Animation event has been fired by an Animation component. public bool isFiredByLegacy => m_Source == AnimationEventSource.Legacy; // // 요약: // Returns true if this Animation event has been fired by an Animator component. public bool isFiredByAnimator => m_Source == AnimationEventSource.Animator; // // 요약: // The animation state that fired this event (Read Only). public AnimationState animationState { get { if (!isFiredByLegacy) { Debug.LogError("AnimationEvent was not fired by Animation component, you shouldn't use AnimationEvent.animationState"); } return m_StateSender; } } // // 요약: // The animator state info related to this event (Read Only). public AnimatorStateInfo animatorStateInfo { get { if (!isFiredByAnimator) { Debug.LogError("AnimationEvent was not fired by Animator component, you shouldn't use AnimationEvent.animatorStateInfo"); } return m_AnimatorStateInfo; } } // // 요약: // The animator clip info related to this event (Read Only). public AnimatorClipInfo animatorClipInfo { get { if (!isFiredByAnimator) { Debug.LogError("AnimationEvent was not fired by Animator component, you shouldn't use AnimationEvent.animatorClipInfo"); } return m_AnimatorClipInfo; } } // // 요약: // Creates a new animation event. public AnimationEvent() { m_Time = 0f; m_FunctionName = ""; m_StringParameter = ""; m_ObjectReferenceParameter = null; m_FloatParameter = 0f; m_IntParameter = 0; m_MessageOptions = 0; m_Source = AnimationEventSource.NoSource; m_StateSender = null; } internal int GetHash() { int num = 0; num = functionName.GetHashCode(); return 33 * num + time.GetHashCode(); } } }