Spine在游戏中的使用

Spine在我们游戏项目中的应用
第一次写博客,实属不知道从何下手,就简单介绍一下目前我们游戏(一款已上线的女性向游戏)中Spine的应用吧

一、在游戏中显示Spine
我们是将Spine在UI和场景中的显示分开处理的
1.Spine在UI中的显示
在生成的Spine预制物添加SkeletonGraphic组件,该类提供了如播放动画,播放速度,朝向等接口;
添加SpineActionEventHandler组件,该类主要是对动画播放的事件监听,处理。
2.Spine在场景中的显示
在生成的Spine预制物添加SkeletonAnimation组件,该类提供了如播放动画,播放速度,朝向等接口;
添加SpineActionEventHandler组件,该类提供了监听动画事件帧的处理;
添加刚体Rigidbody和碰撞体BoxCollider

二、遇到的问题
在Spine动画中如果检测到当前帧与下一帧的三角网格发生了变化或者下一帧的子网格material引用发生了变化,会强制更新Material,会导致修改Meshrenderer.material失效,猜测是因为外部修改了MeshRenderer.materials会生成新的material实例,导致SkeletonRenderer管理的Material与实际网格所引用的Material不一样。
关于这个问题,我们的解决方案是在OnWillRenderObject重新赋值sharematerials,每次更改material之后,都会在下一次渲染之前将修改的值赋值给sharematerials。
官方的方案是用MaterialPropertyBlock来修改材质数据,可参考https://blog.csdn.net/qq_14838361/article/details/78655881,一般情况下推荐使用mpb进行设置,效率更高,不会产生新的材质实例,并且相同材质时使用属性相同的mpb可以进行合批

三、性能问题
主要的性能消耗在Skeleton.UpdateWorldTransform()这个函数里面,该函数更新Spine的全部骨架数据,因此,骨架越多,性能消耗越大
我们的优化方案是,尽量减少骨架,降低该函数在Update中的调用频率 ,例如if(Time.frameCount % 2 != 0 ) return;
官方的建议是
1 if(Time.frameCount % 2 != 0 ) return 减少Update帧率
2 降低骨架复杂度
3 每帧只更新一部分骨架
4 仅让少数骨架实现动画效果,减少需要更新的骨架
5 尽量不注册UpdateWorld事件(会再调用一次Skeleton.UpdateWorldTransform())

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值