之前的用脚本控制Spine动画播放和切换皮肤里实现了点击后更换播放动画
但不管是点击什么位置,事件都会响应就很离谱,毕竟市面上游戏都是点了立绘区域才切换动画
选中Spine动画,在组件-2D物理中添加2D多边形碰撞器
点击编辑碰撞器按钮
拖动绿色的路径点框个大概形状
修改之前的脚本,新东西主要是这个函数
void OnMouseDown()//当鼠标在碰撞体区域被按下时触发事件
{
Debug.Log("MouseDown");
}
备忘
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Spine;
using Spine.Unity;
public class NewBehaviourScript1 : MonoBehaviour
{
bool Touch = false;//用来控制动画播放过程中不能被重复开始播放
bool cloth = false;//是否切换皮肤
public SkeletonAnimation skeletonanimation;
public bool Test = false;
void Start()//游戏开始时执行一次
{
//skeletonanimation=GetComponent<SkeletonAnimation>();//获取骨骼动画组件,但已声明为公有可以不进行获取
//skeletonanimation.Skeleton.SetSkin("8");
/*这种设置方式只会修改部分贴图,另一部分还是原来的,不管是不是bug都很拉胯*/
skeletonanimation.AnimationState.Complete += completeEvent;//注册动画回调事件函数
skeletonanimation.AnimationState.SetAnimation(0, "白龙马", true);
}
void OnMouseDown()//当鼠标上的按钮被按下时触发的事件
{
if(Touch == false)
{
Touch = true;
Debug.Log("MouseDown");
skeletonanimation.AnimationState.SetAnimation(0, "铁憨憨", false);
}
}
void Update()//每帧执行
{
/*这种方式监听到的是场景里所有点击事件*/
//if (Input.GetMouseButtonDown(0) && Touch == false) //左键
//{
// Touch = true;
// print("点击屏幕");
// skeletonanimation.AnimationState.SetAnimation(0, "香蕉船", false);
//}
//if (Input.GetMouseButtonDown(1)) //右键
if (Test) //按钮
{
if(cloth)
{
cloth = false;
print("默认皮肤");
skeletonanimation.initialSkinName = "1";
skeletonanimation.Initialize(true); //重新初始化
skeletonanimation.AnimationState.Complete += completeEvent;//重新初始化后也需要重新注册动画回调事件函数
skeletonanimation.AnimationState.SetAnimation(0, "铁树不开花", true);
Touch = false;
Test = false;
}
else
{
cloth = true;
print("切换皮肤");
skeletonanimation.initialSkinName = "几何";
skeletonanimation.Initialize(true); //重新初始化
skeletonanimation.AnimationState.Complete += completeEvent;//重新初始化后也需要重新注册动画回调事件函数
skeletonanimation.AnimationState.SetAnimation(0, "荣枯", true);
Touch = false;
Test = false;
}
}
}
/*定义动画回调事件函数*/
public void completeEvent(Spine.TrackEntry trackEntry)
{
//print("CallBack");
if(Touch)
{
Touch = false;
//点击动画播放完成后切换回待机动画
skeletonanimation.AnimationState.SetAnimation(0, "走廊", true);
}
}
}
但是有个问题,之前好像是实现按钮跳转场景的时候搞的场景里有个EventSystem,估计是事件监听用的
但是Spine动画对象加了2D碰撞后也被自动挂载了一个EventSystem组件,然后一运行日志里疯狂报警告说一个场景里只能有一个事件监听,按钮跳转也失效了
解决:把Spine对象的EventSystem组件删掉,然后点击响应和按钮跳转依然正常