Unity3D用c#脚本修改Animator controller的weight值

本文探讨了如何通过Unity3D的C#脚本动态修改Animator控制器的layer权重,解决了使用脚本添加新层时weight值不生效的问题。通过正确初始化layer并设置defaultWeight,确保权重在生成的animator controller中正常设置为1f。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      unity3d可以通过拖拉拽的方式创建animator controller,也可以通过c# 脚本创建(显然和拖拉拽调用的底层是一致的)。本文介绍如何通过脚本修改Animator controller的layer中的weight值


原理分析:

      用脚本创建animator controller将在另一篇文章中描述。我们知道animator controller可以是multi - layer的结构,用于更加精细的控制object的运动(例如在本项目中,是将形象的面部表情和身体分成了两层)。在非default层中存在可调节的weight参数,用于控制该层的动作叠加(这里统称,其实是分为addictive和override两种模式)在之前层次上的比重。
在这里插入图片描述

以下是踩坑部分:
      在最初的代码中,我们采用如下的方式添加新层和设置weight:

controller.AddLayer("faceController")</
### UnityAnimator Controller Layer 的使用方法及属性 #### 层的概念及其重要性 在 Unity 动画系统中,`Animator Controller` 可以拥有多个 `Layer` 来管理不同类型的动画。每一层可以有自己的状态机和权重(weight),这使得开发者能够更灵活地混合不同的动画效果[^1]。 #### 创建新的 Layer 并设置默认 Weight 为了创建一个新的图层并设定其初始权重,在 C# 脚本里可以通过下面的方式实现: ```csharp var layer = new UnityEditor.Animations.AnimatorControllerLayer { name = "faceController", defaultWeight = 1f, stateMachine = new UnityEditor.Animations.AnimatorStateMachine() }; ``` 这段代码展示了如何实例化一个名为 `"faceController"` 的新图层,并将其默认权重设为 `1f` 同时关联了一个新的状态机对象[^2]。 #### 获取现有 Layers 和 State Machines 对于已经存在的 `Animator Controller` ,如果想要访问其中所有的状态机名称,则可通过以下方式完成: ```csharp _animator = gObj.GetComponentInChildren<Animator>(); if (_animator != null && _animator.runtimeAnimatorController is AnimatorController aniController) { var stateMachine = aniController.layers[0].stateMachine; foreach (var it in stateMachine.states) { animatorStateNames.Add(it.state.name); } } ``` 此段代码首先尝试获取目标 GameObject 下的第一个子节点上的 `Animator` 组件;接着判断是否存在有效的运行时控制器(`runtimeAnimatorController`)以及它是否属于 `AnimatorController` 类型;最后遍历第一个图层的状态列表并将它们的名字加入到集合当中[^3]。 #### 修改或操作现有的 Layers 除了读取外,还可以对已有的 `Layers` 进行动态调整,比如更改某个特定条件下的触发行为或是改变当前播放的剪辑等。例如,可以在攻击动作结束之后返回闲置(idle)姿态: ```csharp void PlayFinishedReturnToIdle(AnimatorStateInfo stateInfo) { if ((stateInfo.IsName("attack") || stateInfo.IsName("hit")) && stateInfo.normalizedTime > 1.0f) { animator.SetTrigger("idle"); } } ``` 上述函数会在检测到 “attack” 或者 “hit” 状态结束后自动切换至 idle 态[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值