Unity_Spine动画多边形区域点击事件判定

5 篇文章 0 订阅

之前的用脚本控制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组件删掉,然后点击响应和按钮跳转依然正常

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值