AnimationEvent 'XXXXXX' on animation 'XXXXXX' has no receiver! Are you missing a component?
你准备要执行的方法所在的脚本,挂在你执行动画的物体上,就解决了!
1.脚本必须挂在 这个动画组件物体上,否则报错
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace WhackAMole
{
///
/// 所有动物
///
public class AnimalManage : MonoBehaviour
{
public Button SelfButton;
public Animator Animator_;
public AnimationClip[] clips;
float LingShiTime = 0;
bool bo;//是否被打
public virtual void Awake()
{
bo = false;
SelfButton = this.GetComponent();
Animator_ = this.GetComponent();
SelfButton.interactable = true;
SelfButton.onClick.AddListener(AnimalDie);
}
public virtual void Start()
{
//StartEvent 这些方法 写在这个 类里 就可以了
clips = Animator_.runtimeAnimatorController.animationClips;
//AddAnimationEvent(Animator_, _clip.name, "StartEvent", 0);//开始播放动画
//AddAnimationEvent(Animator_, _clip.name, "HalfEvent", _clip.length * 0.5f);//动画播放了一半
AddAnimationEvent(Animator_, clips[0].name, "MaoTouEvent", clips[2].length);
AddAnimationEvent(Animator_, clips[1].name, "RemainEvent", clips[2].length);
AddAnimationEvent(Animator_, clips[2].name, "HuiDongEvent", clips[2].length);
AddAnimationEvent(Animator_, clips[3].name, "DieEvent", clips[3].length);
//for (int i = 0; i < clips.Length; i++)
//{
// Debug.LogError("donghua名字=" + clips[i].name);
//}
}
public virtual void Update()
{
LingShiTime += Time.deltaTime;
if (LingShiTime >= GlobalVariable.RemainTime)
{
LingShiTime = 0;
Huidong();
}
}
///
/// 自己回洞
///
public virtual void Huidong()
{
if (bo)
{
Debug.Log("被打死了,不执行回洞");
return;
}
Debug.Log("未被打击,正常回洞!");
SelfButton.interactable = false;
Animator_.speed = GlobalVariable.AnimatorSpeed;
Animator_.Play("HuiDong", 0, 0);//猫和老鼠
//Destroy(this.gameObject, 1.6f);
//SetBurrowsPools02();
//Invoke("SetObj", 1.6f);
}
///
/// 被打
///
public virtual void AnimalDie()
{
Debug.Log("被打了");
SelfButton.interactable = false;
bo = true;
GlobalVariable.Score += 10;
Animator_.speed = GlobalVariable.AnimatorSpeed;
Animator_.Play("Die", 0, 0);
// Destroy(this.gameObject,1.6f);
//SetBurrowsPools02();
//Invoke("SetObj", 1.6f);
}
///
/// 冒头动画
///
public virtual void MaoTouEvent()
{
Debug.Log("冒头动画——播放完毕");
}
///
/// 地面停留动画
///
public virtual void RemainEvent()
{
Debug.Log("地面停留动画——播放完毕");
SetObj();
}
///
/// 回洞动画
///
public virtual void HuiDongEvent()
{
Debug.Log("回洞动画——播放完毕");
SetObj();
}
///
/// 被打死动画
///
public virtual void DieEvent()
{
Debug.Log("被打动画——播放完毕");
SetObj();
}
public void SetObj()
{
bo = false;
SelfButton.interactable = true;
SetBurrowsPools02();
if (this.gameObject.tag == ("Diglett"))
{
GameManage.Instance.SetDiglettObj(this.gameObject);
}
else
{
GameManage.Instance.SetCatObj(this.gameObject);
}
}
public void SetBurrowsPools02()
{
for (int i = 0; i < GameManage.Instance.BurrowsPools02.Count; i++)
{
if (GameManage.Instance.BurrowsPools02[i].position == this.transform.position)
{
switch (GlobalVariable.GameLevel)
{
case 1:
GameManage.Instance.BurrowsPools6.Add(GameManage.Instance.BurrowsPools02[i]);//添加位置
break;
default:
GameManage.Instance.BurrowsPools9.Add(GameManage.Instance.BurrowsPools02[i]);//添加位置
break;
}
GameManage.Instance.BurrowsPools02.Remove(GameManage.Instance.BurrowsPools02[i]);
}
}
}
///
/// 添加动画事件
///
///
/// 动画名称
/// 事件方法名称
/// 添加事件时间。单位:秒
private void AddAnimationEvent(Animator _animator, string _clipName, string _eventFunctionName, float _time)
{
AnimationClip[] _clips = _animator.runtimeAnimatorController.animationClips;
for (int i = 0; i < _clips.Length; i++)
{
if (_clips[i].name == _clipName)
{
AnimationEvent _event = new AnimationEvent();
_event.functionName = _eventFunctionName;
_event.time = _time;
_clips[i].AddEvent(_event);
break;
}
}
_animator.Rebind();
}
///
/// 清除所有事件
///
public virtual void CleanAllEvent()
{
for (int i = 0; i < clips.Length; i++)
{
clips[i].events = default(AnimationEvent[]);
}
Debug.Log("清除所有事件");
}
public virtual void OnDestroy()
{
SelfButton.onClick.RemoveListener(AnimalDie);
}
}
}