文章目录
- Unity 程序动画讲解
- 一、程序动画是什么?
- 二、使用步骤
- 1.建立模型
- 2.骨骼建立
- 3.代码部分
- 4.角色身体的位置适配
- 总结
Unity 程序动画讲解
提示:以下是本篇文章正文内容,下面案例可供参考
一、程序动画是什么?
程序动画就是通过c#脚本加上逆向骨骼动画实现的可随场景地形改变而做出对应改变的动画。
二、使用步骤
1.建立模型
使用blender建立一个简单的双足机器人模型
提示:腿部关节需要将坐标原点设立在模型顶部
然后设置好物体的子父级关系
框选所有组成的物体,选择fbx导出。
在blender中
模型的-y对应unity中的z;
模型的z对应unity中的y;
2.骨骼建立
安装animation rigging
将导出的模型拖入asset,然后拖入场景,让后建立一个空节点作为物体的父节点,再在两个最低端的leg关节分别建立两个空物体作为脚掌。
然后选中总的父节点,进行骨骼生成
然后继续选择主父节点生成ik控制模块
生成后能看见一个rig空物体,然后再在rig下新建空物体left,right。
再在两个空物体下建下两个空物体。
在left和right中add Tow Bone 组件,分别将腿部各个部分的transform拖入其中,target和hint也就是我们刚才建立的两个子物体。target是脚掌的位置,hint是膝盖的位置。
以上设置完成就开始我们自己的代码部分。
3.代码部分
将代码拖拽到每个脚的target上。
代码的思路
提示:射线函数ray的第一个参数为发射位置,第二个为发射方向,是相对于第一个参数的局部向量,
- 在身体左右侧发射竖直向下的射线,获取脚掌的目标位置.
- 判断目标位置的距离是否大于设定的step距离,大于且没有其他腿在迈步,该腿则开始迈步,迈步使用Lerp函数计算与目标点的距离。
- 在一只腿迈步时开始,内部变量lerp = 0 ,每一帧lerp + Time.deltaTime * speed,来跟新脚掌插值的位置,迈步完毕,lerp>1。
- 迈步的台脚,放脚使用的是sin函数。
public class target : MonoBehaviour
{public Transform body;public Transform endbody;//身体public LayerMask terrainLayer; //检测图层public Vector3 newposition, oldposition, currentposition; //位置public float footSpacing1,footSpacing2; //落点偏移public float stepstance; //步长public float high = 0.1f; //高度public float speed = 2; //速度float lerp = 1;public target leg1,leg2; //约束private void Start(){newposition = transform.position;currentposition = transform.position;oldposition = transform.position;}void Update(){transform.position = currentposition;Vector3 start = body.position + (body.forward * footSpacing1) + (body.right * footSpacing2);Vector3 end = new Vector3(body.position.x,-2,body.position.z) + (body.forward * footSpacing1) + (body.right * footSpacing2);Ray ray = new Ray(start,Vector3.down );Debug.DrawLine(start,end,Color.red);if (Physics.Raycast(ray,out RaycastHit info, 20, terrainLayer.value)){if (Vector3.Distance(newposition, info.point) > stepstance && leg1.lerp >= 1 )//&& leg2.lerp >= 1{lerp = 0;newposition = info.point;}if (lerp<1){newposition = info.point;}}if (lerp < 1){Vector3 footposition = Vector3.Lerp(oldposition, newposition, lerp);footposition.y += Mathf.Sin(lerp * Mathf.PI) * high;currentposition = footposition;lerp += Time.deltaTime * speed;}else{oldposition = newposition;}}private void OnDrawGizmos(){Gizmos.color = Color.red; Gizmos.DrawSphere(newposition, 0.1f);}
}
4.角色身体的位置适配
大概思路这里就不贴代码了
使用连个target的位置的中间点的位置作为身体与地面的距离计算参考点。用lerp函数维持身体的y方向始终与地面参考点有一定的距离。
总结
比较忙所以,代码和文章比较大概。(其实是懒doge)
有啥问题,咋们评论区见。
只因你太美,留下订阅再走吧。