Unity Spine帧事件

这篇具有很好参考价值的文章主要介绍了Unity Spine帧事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpinePro中添加事件帧

首先 选中右上角的层级树 然后选择事件选项

Unity Spine帧事件,Unity,unity,spine,游戏引擎

最后在右下角看到 新建 点击它 新建一个事件

Unity Spine帧事件,Unity,unity,spine,游戏引擎
Unity Spine帧事件,Unity,unity,spine,游戏引擎

点击左上角的设置按钮 弹出编辑窗口

Unity Spine帧事件,Unity,unity,spine,游戏引擎
编辑窗口
Unity Spine帧事件,Unity,unity,spine,游戏引擎

在右上角 动画栏 可以切换对应的动画

点坐边的那个小灰点来切换 亮点代表当前动画
Unity Spine帧事件,Unity,unity,spine,游戏引擎

选中帧

Unity Spine帧事件,Unity,unity,spine,游戏引擎

添加事件 点击对应事件的🔑图标 在当前帧添加事件

Unity Spine帧事件,Unity,unity,spine,游戏引擎

添加成功后 点击左下角播放按钮 可以看到 人物身边有对应事件的文本弹出 表示添加成功

Unity Spine帧事件,Unity,unity,spine,游戏引擎

Unity监听Spine帧事件

面板上添加

可以一个事件 添加多个监听
Unity Spine帧事件,Unity,unity,spine,游戏引擎

代码中动态添加

一个事件可以添加多个监听
Unity Spine帧事件,Unity,unity,spine,游戏引擎

Unity Spine帧事件,Unity,unity,spine,游戏引擎文章来源地址https://www.toymoban.com/news/detail-652633.html

源码

using System.Collections.Generic;
using UnityEngine;
using Spine.Unity;
using Spine;
using System;
using UnityEngine.Events;

public class SpineEventHelper : MonoBehaviour
{

    [Serializable]
    public class SpineFrameKey
    {
        [SpineEvent] public string key;
        public UnityEvent handler;
    }
    [SerializeField] private List<SpineFrameKey> handlers;
    private Dictionary<string, UnityEvent> keyFrameEventDict = new Dictionary<string, UnityEvent>( );
    public const string START_EVENT = "START_EVENT", END_EVENT = "END_EVENT";
    private SkeletonAnimation skeletonAnimation;
    private void Start( )
    {
        Bind( );
    }
    private void Bind( )
    {
        skeletonAnimation = GetComponent<SkeletonAnimation>( );
        if ( skeletonAnimation == null ) return;
        skeletonAnimation.AnimationState.Event += HandleEvent;
        skeletonAnimation.AnimationState.Start += delegate ( TrackEntry trackEntry )
        {
            if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent @event ) )
            {
                @event.Invoke( );
            }
        };
        skeletonAnimation.AnimationState.End += delegate
        {
            if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent @event ) )
            {
                @event.Invoke( );
            }
        };
        foreach ( var handler in handlers )
        {
            keyFrameEventDict[ handler.key ] = handler.handler;
        }
    }
    /// <summary>
    /// 添加自定义的帧事件
    /// </summary>
    /// <param name="key"> 帧名称 </param>
    /// <param name="handler"> 处理的方法 </param>
    public void AddCustomEventHandler( string key, UnityAction handler )
    {
        if ( keyFrameEventDict.TryGetValue( key, out UnityEvent ev ) )
        {
            ev.AddListener( handler );
        }
        else
        {
            var ue = new UnityEvent( );
            ue.AddListener( handler );
            keyFrameEventDict.Add( key, ue );
        }
    }
    /// 移除自定义的帧事件
    /// </summary>
    /// <param name="key"> 指定帧名称 </param>
    /// <param name="handler"> 处理的方法 如果忽略则移除key的所有帧事件 </param>
    public void RemoveCustomEventHandler( string key, UnityAction handler = null )
    {
        if ( keyFrameEventDict.TryGetValue( key, out UnityEvent ev ) )
        {
            if ( handler == null )
            {
                ev.RemoveAllListeners( );
            }
            else
            {
                ev.RemoveListener( handler );
            }
        }
    }
    /// <summary>
    /// 添加动画开始事件
    /// </summary>
    /// <param name="handler"> 开始处理事件的方法 </param>
    public void AddStartEventHandler( UnityAction handler )
    {
        if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent ev ) )
        {
            ev.AddListener( handler );
        }
        else
        {
            var ue = new UnityEvent( );
            ue.AddListener( handler );
            keyFrameEventDict.Add( START_EVENT, ue );
        }
    }
    /// <summary>
    /// 移除开始帧事件
    /// </summary>
    /// <param name="handler"></param>
    public void RemoveStartEventHandler( UnityAction handler )
    {
        if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent ev ) )
        {
            ev.RemoveListener( handler );
        }
    }
    /// <summary>
    /// 添加结束帧事件
    /// </summary>
    /// <param name="handler"></param>
    public void AddEndEventHandler( UnityAction handler )
    {
        if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent ev ) )
        {
            ev.AddListener( handler );
        }
        else
        {
            var ue = new UnityEvent( );
            ue.AddListener( handler );
            keyFrameEventDict.Add( END_EVENT, ue );
        }
    }
    /// <summary>
    /// 移除结束帧事件
    /// </summary>
    /// <param name="handler"></param>
    public void RemoveEndEventHandler( UnityAction handler )
    {
        if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent ev ) )
        {
            ev.RemoveListener( handler );
        }
    }
    private void HandleEvent( TrackEntry trackEntry, Spine.Event e )
    {
        if ( keyFrameEventDict.TryGetValue( e.Data.Name, out UnityEvent @event ) )
        {
            @event.Invoke( );
        }
    }
    /// <summary>
    /// 清理所有帧事件 
    /// </summary>
    public void Clear( )
    {
        keyFrameEventDict.Clear( );
    }
    private void OnDestroy( )
    {
        Clear( );    
    }
}


到了这里,关于Unity Spine帧事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity | Spine动画记录

    https://blog.csdn.net/linshuhe1/article/details/79792432 https://blog.csdn.net/winds_tide/article/details/128925407 通常制作好的 Spine 动画导出时会有三个文件: .png 、.json 和 .atlas: skeleton-name.json 或 skeleton-name.skel.bytes,包含了skeleton和animation数据。 skeleton-name.atlas.txt,包含了texture atlas的信息。 一个

    2024年02月19日
    浏览(35)
  • Spine(Unity)

    1.当前动画播放完毕后自动播放下一个动画 2.自动动画补偿问题 1)由于spine在切换动画的时候自动补偿,用于动画的平稳过度。但是会导致残影等bug,这时候需要在SetAnimation前调用 skeletonAnimation.skeleton.SetToSetupPose (); spineAnimationState.ClearTracks ();    或 skeletonGraphic.AnimationState

    2024年02月11日
    浏览(35)
  • unity spine 进阶使用

    在项目实践中,我们常常遇到收集金币,钻石等这样的特效需求,最初我们也是全靠代码实现,效果总是差点,偶然和我们动画师聊天确定了一种新的实现方案。 大概流程是动画师在spine软件中实现炸金币+飞金币的过程 输出文件给到程序,程序需要在代码中动态修改节点位

    2023年04月08日
    浏览(67)
  • Unity——Spine动画的使用

    Spine是一个收费的跨平台的2D骨骼动画制作工具。 官方地址:http://zh.esotericsoftware.com/ Spine导出的资源有3个文件 .json 存储骨骼信息 .png 使用的图片图集 .atlas.txt 图片在图集中的位置信息 当我们把这三个资源导入到已经引入了Spine运行库的Unity工程后会自动为我们生成 _Atlas 材质

    2024年02月02日
    浏览(49)
  • 随笔-Unity中修改Spine材质

            我们在Unity中使用Spine动画时,往往需要在材质上添加一些效果,比如描边、闪光等等。              这些效果其实在Spine插件中就给我们提供好了对应的Shader,路径分别是: Spine/Outline/Skeleton、Spine/Skeleton Fill。 虽然有插件上给我提供好了这些常用的Shader,单独

    2024年02月11日
    浏览(47)
  • Unity 2D Spine 外发光实现思路

    前言 对于3D骨骼,要做外发光可以之间通过向法线方向延申来实现。 但是对于2D骨骼,各顶点的法线没有向3D骨骼那样拥有垂直于面的特性,那我们如何做2D骨骼的外发光效果呢? 理论基础 我们要知道,要实现外发光效果,首先得先实现外描边效果。对于2D图片的描边实现有

    2024年02月22日
    浏览(34)
  • 如何将spine的素材导入unity

    最近做项目,想将少前里的小人素材导入到unity里,于是乎便去捣鼓了一下,随便记录一下方便以后查看。 第一步:将素材导入spine(如果你已经有素材了,直接跳到第二步即可) 这里参考b站的一个教程:【少前/教程/小人动画】3分钟学会如何提取少前小人制作小人动画_哔

    2024年02月09日
    浏览(33)
  • Unity 如何导入二进制Spine文件

    总是忘记Spine导出二进制到Unity的设置,记录一下。 TIP 此教程只满足URP渲染管线与Linear颜色空间的需求 纹理打包器也修改一下拓展名(日常操作) 修改图集扩展名 不要 勾选图集的 预乘Alpha ,勾选 溢出 修改图集扩展名 .atlas.txt 可导出以下几种文件 Default Shader 设置为 Univer

    2024年02月07日
    浏览(27)
  • Spine动画导入unity后有白边的解决方法

     可以看官方视频[spine-unity] 常见导入问题解答_哔哩哔哩_bilibili 里面第四个问题就是讲的这个 如果你的spine文件导出用的是默认的情况,那么在导入unity后就有可能会出现透明贴图出现白边的情况 如下 此时先打开导入的图片文件  将右侧的sRGB选项取消选中(官方视频是这么

    2024年02月04日
    浏览(36)
  • Unity Spine 3.8 (URP) 踩坑(Shader报错修改)

    今天搜索spine优化,看到一篇文章项目导入多个Spine动画 合批 降低DrawCall -- UWA问答 | 游戏开发者互动问答社区 | 侑虎科技 提供了新思路,打算尝试一下URP。但美术使用的spine版本是3.8,项目用的Unity2021.3.11f1c2,直接导入spine URP包,shader报错:half4 不能转成 SurfaceData2D;遂改下

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包