文章目录

  • Unity 程序动画讲解
  • 一、程序动画是什么?
  • 二、使用步骤
  • 1.建立模型
  • 2.骨骼建立
  • 3.代码部分
  • 4.角色身体的位置适配
  • 总结



Unity 程序动画讲解

unity中启动FFMpeg unity启动动画_unity中启动FFMpeg

提示:以下是本篇文章正文内容,下面案例可供参考

一、程序动画是什么?

程序动画就是通过c#脚本加上逆向骨骼动画实现的可随场景地形改变而做出对应改变的动画。


二、使用步骤

1.建立模型

使用blender建立一个简单的双足机器人模型

提示:腿部关节需要将坐标原点设立在模型顶部

unity中启动FFMpeg unity启动动画_游戏引擎_02

unity中启动FFMpeg unity启动动画_unity中启动FFMpeg_03


然后设置好物体的子父级关系

unity中启动FFMpeg unity启动动画_游戏引擎_04


框选所有组成的物体,选择fbx导出。

在blender中

模型的-y对应unity中的z;

模型的z对应unity中的y;

2.骨骼建立

安装animation rigging

unity中启动FFMpeg unity启动动画_动画_05


将导出的模型拖入asset,然后拖入场景,让后建立一个空节点作为物体的父节点,再在两个最低端的leg关节分别建立两个空物体作为脚掌。

unity中启动FFMpeg unity启动动画_unity_06


然后选中总的父节点,进行骨骼生成

unity中启动FFMpeg unity启动动画_动画_07


unity中启动FFMpeg unity启动动画_unity中启动FFMpeg_08


然后继续选择主父节点生成ik控制模块

unity中启动FFMpeg unity启动动画_游戏引擎_09


生成后能看见一个rig空物体,然后再在rig下新建空物体left,right。

再在两个空物体下建下两个空物体。

unity中启动FFMpeg unity启动动画_c#_10


在left和right中add Tow Bone 组件,分别将腿部各个部分的transform拖入其中,target和hint也就是我们刚才建立的两个子物体。target是脚掌的位置,hint是膝盖的位置。

unity中启动FFMpeg unity启动动画_c#_11


以上设置完成就开始我们自己的代码部分。

3.代码部分

将代码拖拽到每个脚的target上。
代码的思路
提示:射线函数ray的第一个参数为发射位置,第二个为发射方向,是相对于第一个参数的局部向量,

  1. 在身体左右侧发射竖直向下的射线,获取脚掌的目标位置.
  2. 判断目标位置的距离是否大于设定的step距离,大于且没有其他腿在迈步,该腿则开始迈步,迈步使用Lerp函数计算与目标点的距离。
  3. 在一只腿迈步时开始,内部变量lerp = 0 ,每一帧lerp + Time.deltaTime * speed,来跟新脚掌插值的位置,迈步完毕,lerp>1。
  4. 迈步的台脚,放脚使用的是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)
有啥问题,咋们评论区见。