unity游戏开发入门-spine

Posted 熠、培养中~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity游戏开发入门-spine相关的知识,希望对你有一定的参考价值。

好久没写了,过来写一下,本文章针对代码(示例Lua)控制Spine(一种2D美术资源),这里主要针对SkeletonAnimation形式,说明方式使用代码注释记录。
代码每块全博客衔接

1.spine当前播放的动画名称

--获取SkeletonAnimation组件
 local skeleton = obj[Spine.Unity.SkeletonAnimation]
 local skeletonName = skeleton.AnimationName

2.spine当前播放的动画时长

local time = skeleton.Skeleton.Data:FindAnimation(skeletonName).Duration

3.spine动画播放控制

--播放动画:trackIndex,要播放的动画名称,是否循环
skeleton.AnimationState:SetAnimation(0, aniName, isLoop)

4.spine资源切换皮肤

同一个spine资源,修改Initial Skin属性

--skinName:皮肤名称-string
skeleton.initialSkinName = skinName
skeleton:Initialize(true)

5.spine切换层级

--levelNum:层级数-int
skeleton.sortingOrder = levelNum

6.spine操作部件

local skeletionRenderSeparator = obj[Spine.Unity.SkeletonRenderSeparator]

--增加部件
--partsName:部件名称-string
skeletionRenderSeparator.SkeletonRenderer:FindAndApplySeparatorSlots(partsName, false, true)

--获取部件
--pareName:部件的编号
skeletionRenderSeparator.partsRenderers[partNum].MeshRenderer

7.拼接

通过spine本身的皮肤拼接形成新的皮肤
举例:通过原有的皮肤(”jump“, ”stand“)形成新的皮肤(”run")

--将新皮肤从原有的皮肤复制一份出来
    local newSkin = skeletion.Data:FindSkin("jump") 
    local _skin = skeletion.Data:FindSkin(”stand“)
 --将皮肤混合
    newSkin:AddSkin(_skin)
  --将新皮肤进行应用
    skeletion:SetSkin(newSkin)
    skeletion:SetSlotsToSetupPose()

8.倒放动画

--将当前spine播放动画的起始帧与结束帧同步
    skeleton.AnimationState:GetCurrent(0).AnimationStart = 
    skeleton.AnimationState:GetCurrent(0).AnimationEnd
--播放速度反向
    skeleton.timeScale = -1 
 --延时处理后恢复动画播放速度并执行回调
    Timer.call(time, function ()
        skeleton.timeScale = 1
        --回调
        fun()
    end)

Spine应用--使用Spine动画制作动作游戏

在前面的文章中,已经陆陆续续的讲解了一些使用Spine动画的细节,有了这些细节,我们已经满足了在unity中使用Spine动画制作动作游戏的技术基础。

那么,要使用Spine动画在unity中制作一款动作游戏,究竟还有哪些是需要注意的呢?

 

1. 主角的控制系统

  主角的控制,主要分为以下三个部分:

  1. 输入检测 &&输入数据加工
  2. 接受输入数据,改变主角的位置
  3. 根据输入数据 && 当前状态,播放对应的Spine动画。

  输入检测,这个根据不同的游戏输入方式,有不同的处理,输入的加工,也因游戏而不同,这里不做过多的说明。

 

  至于改变主角的位置,这里使用 Unity自带的控制器:Character Controller。Character Controller会在主角的身上挂上一个 胶囊碰撞体,用这个胶囊碰撞体来检测物理碰撞,这个Controller除了提供移动主角API外,还处理了

  许多的逻辑,比如主角可以上坡的角度,主角是否碰撞到了地面等问题。

 

  播放动画组件,这里需要考虑的是Spine各个动画之间转换的动画融合问题,比如从走到跑,这样的过程需要一个渐进的过程,也就是动画融合了。

 

  这里尤其需要注意的是,因为我们使用了Character Controller来控制 主角的移动,那么,在Spine动画里面,一定不能有位移,不然的话,这样就会出现一个问题,那就是明明看着主角已经走过去了,

  但实际上这个人的碰撞体根本没动!如下图:

  技术分享图片

2.伤害检测系统

  动作游戏,当然要有伤害检测了,这里的伤害检测,我们使用Unity的物理碰撞检测来做。从1中我们已经知道,Spine动画不能有位移,但是在一些酷炫的技能中,

主角难免会有些微的位移,但是因为Character Controller其实是不会随着Spine动画的移动而移动的(其实可以看成这样,Character Controller 在父层级,而Spine动画播放时,移动的是Character Controller的子层级),

但是问题是我们又要实实在在的让碰撞检测跟着 Spine动画走(比如A拿大刀砍怪物,那肯定是刀看到怪物算是伤害成功),那么到底该如何办呢?

  解决方案很简单,我们不使用 Character Controller的胶囊碰撞体来做伤害检测,我们额外的添加碰撞体来做伤害检测。至于怎么添加可以跟随Spine动画移动的碰撞体,请看我的Spine学习系列文章,里面有提到。

   在骨骼上绑定Collider 2D 和 Rigidbody 2D,因为骨骼是靠Spine动作来驱动,并且我们并不想使用物理引擎来控制人物的移动,所以呢,骨骼上的Rigidbody 2D的类型,选择为:Kinematic。

  然后喃,我们在碰撞的时候,显然刀子什么的是可以穿透身体,那么最好 Collider 2D也勾选上 Is Trigger属性。具体设置如下:

  技术分享图片

  这样的设置以后,该物体就可以碰撞到 任意勾选了 Is Trigger的物体了,并且会触发 OnTriggerxxx函数。

  同时,在该物体上添加适合的 Tag,就可以通过Tag区分到底是什么物体与自己产生了碰撞。

3.总结

  当然,制作动作游戏可不是像我说的那样,只要解决了上面两个问题就可以了,具体的制作还有许许多多的细节问题,也有可能需要新的 人物控制,上面的两个方面也只是为制作动作游戏搭好了一个前提。

以上是关于unity游戏开发入门-spine的主要内容,如果未能解决你的问题,请参考以下文章

Unity 3D 游戏开发Unity3D 入门 - 工作区域介绍 与 入门示例

unity3d游戏开发和unity入门到精通哪本书适合初学者

Unity3D 入门 游戏开发 Unity3D portal game development

Unity3d游戏开发UGUI插件入门之游戏菜单

unity游戏开发入门-spine

unity的入门