官方的,直接在 package manager 里面就能看到
先点击角色 Perfab
打开 Perfab
点击菜单栏中的 Animation Rigging - Rig Setup,给这个 Perfab 配置 Rig
这时,Perfab 身上会多出一个 Rig Builder 组件
Rig Builder 用于与 Animator 配合,所以要和 Animator 在同一个 GameObject 上
同时 Perfab 里面也会多出一个 Rig
Rig 用于收集其子物体的 Rig Constraints 并生成列表,然后交给 Rig Builder
Rig 要与骨骼的根节点同一层级
为了方便看,在 Perfab 中点击 菜单栏 - Animation Rigging - Bone Renderer Setup,显示骨骼
在 Perfab 中就会显示 Bone Render 组件
在 Rig 底下添加一个空物体,然后在这个空物体上添加 Multi - Aim Constraint
把武器挂在一只手上
为了好看,还是先将枪调整一下,看上去好像是手握着一样
然后对于 Rig 底下新建的空物体的 Multi - Aim Constraint 组件,将挂着武器的手作为 Constraint Object
为了继续配置这个 Multi - Aim Constraint 组件的 Aim Axis 和 Up Axis,要在局部坐标系下看手部的向上的参考轴
为了让局部坐标系的原点落在手部基点,要选择 Pivot 模式,同时为了显示局部坐标系,要选择 Local 模式
Aim Axis 指向被瞄准的物体,因此对于我这个手,就是这个绿色的 Z 轴的负方向
Up Axis 指向上方向,因此这里就是 Y 轴负方向
配置为
哦……后面调试出来我这轴搞错了
原来绿色的是 Y 轴啊……
为了继续配置 Source Objects,需要一个可以瞄准的物体
计划是使用子弹落点作为瞄准点
但是作为测试可以新建一个小球,然后使用这个小球作为瞄准目标
测试的时候出了这个报错
Transform ‘Weapon_AK12’ not found in HumanDescription.
System.InvalidOperationException: The TransformStreamHandle cannot be resolved.
This Exception was thrown from a job compiled with Burst, which has limited exception support. Turn off burst (Jobs -> Burst -> Enable Compilation) to inspect full exceptions & stacktraces
我找到了一个具有相同问题的
https://forum.unity.com/threads/issues-with-adding-weapons-to-a-character-using-animation-rigging.951957/
但是我这个枪并没有相同名字的子物体……
然后我又找到一个解答
https://forum.unity.com/threads/animation-rigging-weapon-attachment.920021/
他要我使用 rigbuilder 的 build 方法,再启用 animator
一开始我是使用不了 using UnityEngine.Animations.Rigging;
我还以为是我 package 没装好
一看有一个验证的问题
但是试验之后这个是我 Unity 账号许可证过期了而已
重新登陆 Unity 账号,获取许可证就好了
但是还是用不了 using UnityEngine.Animations.Rigging;
后来想到我用了一个 Assembly
向 Assembly 里面添加 UnityEngine.Animations.Rigging 就好了
然后按照那个解答中 unity 官方的意思就是这样写
private void Start()
{
RigBuilder rigBuilder = GetComponent<RigBuilder>();
rigBuilder.Build();
Animator animator = GetComponent<Animator>();
animator.enabled = true;
}
如果是要 wait 的话,我也测试过
private void Start()
{
StartCoroutine(SetRig());
}
private IEnumerator SetRig()
{
yield return new WaitForSeconds(1);
RigBuilder rigBuilder = GetComponent<RigBuilder>();
rigBuilder.Build();
Animator animator = GetComponent<Animator>();
animator.enabled = true;
yield return null;
}
但是这都不行,报错还是一样的
不把这个武器绑在手上,绑在任意骨骼上,都会有问题
给这个武器添加了 Rig Transform 也有问题
总的来看
如果没有配置 Animation Rigging 的话,那么可以随便在 Perfab 骨骼层级中挂东西
如果配置了 Animation Rigging,那么 Perfab 的骨骼层级中不能加任何多余的东西
这就很奇怪
草……后来发现真的是我有相同命名的物体的问题
我靠……没想到啊
没事了……
单纯一个手部是这样
为身体添加了更多约束之后
要注意挂着 Multi - Aim Constraint 的 GameObject 的层级关系从上到下,是骨骼关系中从根到子的顺序
新建一个 GameObject 用来放双手持枪的约束
添加 Two Bone IK Constraint 组件
先把左手拖进来
右键组件,点击 Auto Setup From Tip Transform
自动配好
添加 Two Bone IK Constraint 组件之后,这个 GameObject 底下会自动新建两个 GameObject
一个作为目标,一个用来辅助调整姿态
可以把它们都拖到右手下面
武器是可能从角色身上解绑销毁的,所以不放在武器下面
在运行模式下一点点调这两个物体的 transform,调完了之后复制 transform,退出运行模式,在编辑模式下粘贴回去
效果是这样