[Unity] 使用 Animation Rigging 制作瞄准 IK 1
Posted 「已注销」
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Unity] 使用 Animation Rigging 制作瞄准 IK 1相关的知识,希望对你有一定的参考价值。
1. 安装 Animation Rigging Package
官方的,直接在 package manager 里面就能看到
2. 配置 Rig
先点击角色 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 组件
3. 添加约束
在 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,需要一个可以瞄准的物体
计划是使用子弹落点作为瞄准点
但是作为测试可以新建一个小球,然后使用这个小球作为瞄准目标
4. 处理报错 Transform ‘XXX’ not found in HumanDescription.
测试的时候出了这个报错
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 的骨骼层级中不能加任何多余的东西
这就很奇怪
草……后来发现真的是我有相同命名的物体的问题
我靠……没想到啊
没事了……
5. 身体-手部-头部
单纯一个手部是这样
为身体添加了更多约束之后
要注意挂着 Multi - Aim Constraint 的 GameObject 的层级关系从上到下,是骨骼关系中从根到子的顺序
6. 双手持枪
新建一个 GameObject 用来放双手持枪的约束
添加 Two Bone IK Constraint 组件
先把左手拖进来
右键组件,点击 Auto Setup From Tip Transform
自动配好
添加 Two Bone IK Constraint 组件之后,这个 GameObject 底下会自动新建两个 GameObject
一个作为目标,一个用来辅助调整姿态
可以把它们都拖到右手下面
武器是可能从角色身上解绑销毁的,所以不放在武器下面
在运行模式下一点点调这两个物体的 transform,调完了之后复制 transform,退出运行模式,在编辑模式下粘贴回去
效果是这样
如何使这些 Mocap Animation FBX 与 Unity 配合使用?
【中文标题】如何使这些 Mocap Animation FBX 与 Unity 配合使用?【英文标题】:How to make these Mocap Animation FBX's work with Unity? 【发布时间】:2020-04-20 02:47:54 【问题描述】:这里的那些(任何一个)...http://dancedb.eu/main/performances
我正试图弄清楚如何将这些 FBX 应用到我在 Unity 中的人形操纵模型。
当我导入 FBX 并将其打开时,它会显示:https://i.imgur.com/6si7ptX.png
我无法在其中任何一个上按 Ctrl+D 将其复制到 *.anim 中(这是 Google 搜索推荐的内容)
那么,我哪里错了?如何将这些动画应用到我在 Unity 中绑定的人形角色?我是一个菜鸟,所以请原谅我。谷歌搜索了一段时间...
【问题讨论】:
我不认为“遗留”动画可以在 unity 中复制 - 还注意到使用 unity 2020 alpha 可以以未知方式影响行为.. 我明白了。对替代方法有什么建议吗?谷歌搜索也。我正在使用 2019.3.0a7 自 alpha 7 以来,2019.3 已经走过了漫长的道路……您究竟想复制它们做什么? 当我在 Google 上搜索如何将 FBX 动画应用于角色时,人们说使用动画控制器并通过复制其内容将 FBX 转换为 *.anim。但我要做的只是最终应用 FBX 动画,所以也许有更好的方法,不需要任何重复 您应该能够按原样使用它们。 【参考方案1】:使用Humanoid Retargeting。
使用您链接的网站中的 BVH 文件并使用 BVH importer here 可能会更好。
【讨论】:
以上是关于[Unity] 使用 Animation Rigging 制作瞄准 IK 1的主要内容,如果未能解决你的问题,请参考以下文章
Unity 动画系统 Animation 和 Animator的小实例
Unity 动画系统(Animation,Animator,Timeline)
Unity Animation Event窗口 Animation read only(只读)动画无法添加关键帧问题(无需拖入状态机重新连线)