躁动光标 | 做一个追着鼠标跑的林克
简介最近沉迷于《王国之泪》不可自拔,正好本人开发的《躁动光标》基于蜘蛛侠Mod提炼出通用的角色控制器组件,一不做二不休,干脆做个林克Mod吧!功能需求游戏角色应该有丰富的可玩性,本Mod也不例外,先定下要实现的功能:角色跟随目标移动同步状态对应的随机动画道具自动附着到动画相应关节部分关节程序化运动(即裙摆、头发随着角色运动自然晃动)为用户提供可配置参数鸡的动画先放出成果:用户配置界面(比较硬核(丑
·
简介
功能需求
游戏角色应该有丰富的可玩性,本Mod也不例外,先定下要实现的功能:
-
角色跟随目标移动
-
同步状态对应的随机动画
-
道具自动附着到动画相应关节
-
部分关节程序化运动(即裙摆、头发随着角色运动自然晃动)
-
为用户提供可配置参数
-
鸡的动画
先放出成果:
用户配置界面(比较硬核(丑)):

素材准备
本Mod需要以下模型素材,在 Sketchfab 网站上可以找到版权为 CC Attribution 的免费模型:
-
林克(带剑、盾): https://skfb.ly/ooMso
-
咕咕鸡: https://skfb.ly/YFzC
此外林克还需要以下动画,Adobe旗下的 Mixamo 网站上有充裕的动画库,简单修改即可配齐:
-
静止动画×4
-
行走动画×3(奔跑、滑翔、盾滑)
-
剑盾攻击动画×5
注意事项
-
从Mixamo下载动画时需要选择带任意皮肤的文件,否则会出现关节扭曲的问题( 原因请查看Unity论坛讨论帖 ),正确的下载选项如下图。如果不需要用到皮肤,可在下载后复制文件中的动画到项目文件夹(选中动画然后按Ctrl+C/V),然后删掉源文件。

-
模型导入设置中,Rig中的AnimationType要设置为Humanoid,然后Unity才会将其识别为人形模型:

-
为了避免动画播放时影响角色坐标,需要将Animator组件的ApplyRootMotion字段设置为false来忽略动画的根位移及根旋转,并按需修改动画文件的导入设置,如下图:

功能实现
1.角色跟随目标移动
因为跟随目标这个功能比较常见,因此SDK中提炼出通用的AC_ObjectMovement_FollowTarget组件,Mod开发者只需要挂载这个组件,并且设置好跟随目标即可。

如果想让用户自定义角色的移动配置,可以创建一个ScriptableObject配置文件并赋值给AC_ObjectMovement_FollowTarget组件,并通过PersistentData_SO组件对该配置文件进行序列化/反序列化,后面会有相关介绍。

2.同步状态对应的随机动画
角色有三种状态(静止、行走及攻击),其中静止及行走状态基于移动速度进行切换,用户按下攻击键时会临时切换到攻击状态,三种状态归类如下:

使用Animator作为 状态机 处理状态之间的切换,对应的顶层链接关系如下图。程序运行后默认执行普通状态组(Normal Blend)的静止/行走动画,当用户在任意状态按下攻击键时会激活“AttackTrigger”触发器并临时切换到攻击状态组(Attack Blend),等攻击动画结束后会自动回到普通状态组:

为了实现随速度切换状态以及随机切换动画的功能,需要使用 BlendTrees ,其作用是将多个动画片段根据N个参数的权重进行混合,BlendTree还支持管理子BlendTree。上图中的每一个状态组都以BlendTree的形式组织子动画,双击即可进入其管理界面。如下图,以“Normal Blend”为例,Idle/Run两个子BlendTree基于MoveSpeed参数进行过渡,而子BlendTree基于IdleRandom/RunRandom参数随机选择需要播放的动画。

随机选择动画的实现比较简单,首先为子BlendTree设置好所有的动画,将最前/最后一个动画的Threshold值分别设置为0和1以便归一化,勾选下图的"Automate Thresholds"即可自动算出剩余动画的Threshold值。

然后在AC_CharacterAnimatorController实例的配置文件中设置随机参数的名称(该案例中为IdleRandom)、动画数量和随机值更新频率等信息,该配置文件可以提供给用户,让其按喜好修改。

3.道具自动附着到动画相应关节
老流氓们津津乐道的一点是,《旷野之息》、《王国之泪》扩充了道具的第二用途,如盾牌能用于滑行,鸡能用于滑翔。在本Mod中,道具也需要根据当前动画自动附着到对应角色关节中。为了实现该效果,需要用到 Animation Rigging (Unity官方的程序化动画插件)提供的 MultiParentConstraint 组件,该组件通过权重值让多个物体约束某个物体的位置及旋转,功能类似“父子关系”。
以盾牌为例,它在静止状态下附着在手部关节,在行走状态下附着在背部或脚下。MultiParentConstraint实例的配置如下,其中ConstrainedObject绑定盾牌物体,而SourceObjects列表中保存了三个角色关节的相关信息。当程序运行时,代码会持续检测当前播放的动画片段,并同步更新SourceObjects列表中各关节的权重。

通过将某个关节的权重设置为1,即可让盾牌跟随该关节:
剑与鸡的绑定方式与上面类似,这里不再重复。虽然克隆多个道具并放在对应关节上按需显隐也能实现该效果,但这种方式更加灵活,还能够同时跟随多个目标。
4.部分关节程序化运动
为了让角色动起来更加真实,需要添加运动细节,常用的方法是为头发、衣服、尾巴等部位绑定关节,并使用物理引擎或程序化代码让其随着角色运动或外力影响而自然晃动。Animation Rigging提供了 DampedTransform 组件来实现类似功能,它能够让关节跟随目标移动或旋转时产生缓冲效果。
该林克模型提供了很多可活动的关节,如裙摆、耳朵和马尾辫等。以马尾辫为例,DampedTransform实例的配置如下图,其中ConstrainedObject绑定马尾辫关节,Source绑定其父物体关节,按需更改Setting中的配置,然后点击运行查看效果。

PS:
-
如果要对尾巴等多关节模型实现程序化,需要为其中的每一个关节创建对应的DampedTransform实例。
-
因为性能原因,Animation Rigging的组件不支持在运行时缩放物体关节,因此需要使用AC_RigBuilderHelper组件检测到角色模型缩放后立即重建任务, 具体请查看Unity论坛讨论帖 。
彩蛋:我试着为林克的下巴关节增加程序化功能,然后就笑cry了!生动地表现出海拉鲁的十级台风!
5.为用户提供可配置参数
每个人的喜好各异,有些用户喜欢随机动画,另一些则希望能固定一组动画,还有的想更改攻击动画的触发按键。为了让Mod满足更多人的需求,可以将Mod的部分配置通过SDK的持久化模块暴露给用户,方便用户二次编辑或分享。
持久化有两种方式,第一种是通过PersistentData_SO组件将目标组件的ScriptableObject配置文件暴露给用户:

另一种是通过PersistentData_Enum等元组件,利用事件回调或反射绑定目标组件的单个字段:

PS:因为Mod导出插件不支持动态链接ScriptableObject,所以Mod开发者暂时无法自定义ScriptableObject脚本。
6.鸡的动画
SDK中将常用的 DoTween 功能(位移、缩放、变色等)封装成SOAction前缀的ScriptableObject配置文件,开发者不需要写代码即可实现常见的程序化动画。
咕咕鸡作为滑翔帆的平替,其唯一动画就是循环扇翅膀,通过以上方式即可快速实现该动画。设置好两个翅膀根物体的锚点后,分别为它们增加EventPlayer_SOAction组件,勾选"PlayOnAwake"选项以便在程序运行后自动启动动画,创建SOAction_TweenTransform配置文件并赋值给其“SoAction”字段,如下图。因为两个翅膀为互为镜像,转动方向一致,所以可以复用同一个配置文件。

配置文件设置如下图,需要注意以下关键字段:
-
EaseType:设置动画曲线
-
Loops:设置循环次数,-1代表无限循环
-
LoopType:设置循环方式,Yoyo代表类似悠悠球的来回循环方式
-
IsLocal:是否基于局部坐标轴进行变换
-
TransformType:决定变换的形式(移动、旋转或缩放)

PS:使用ScriptableObject配置文件保存组件的配置信息有很多好处,比如跨场景使用、多物体共用、退出程序后仍能保存数据,以及能够进行序列化等。
其他实现
卡通材质来源于开源库 BotW-ToonShader ,该Shader基于URP和ShaderGraph实现。
通过AC_CursorInputBehaviour组件监听鼠标或键盘组合键,并通过UnityEvent进行回调。
获取方法
本文涉及的源文件已经发布到开源库 AliveCursor_ModUploader 中,首次使用该库请先阅读 Wiki配置教程 。
该Mod也已经上传到 创意工坊 ,如果你购买了《躁动光标》,搜索“Tears of the Kingdom Link”即可下载使用。
《躁动光标》简介
《 躁动光标 》是本人独立开发的Steam程序,让玩家将系统光标替换成各种有趣的Mod,并支持编写自定义代码。该程序目前内测中,有兴趣的同学可以在IndieNova网站申请免费Key试用,申请时请备注【Unity社区】: https://indienova.com/novapress/game/id/610

碎碎语:因为之前埋头开发,忽略了用户反馈及用户文档,导致差评如潮🤣,目前正在努力修复口碑中,欢迎各位提建议!
更多推荐
所有评论(0)