unity程序动画


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的第一个参数为发射位置,第二个为发射方向,是相对于第一个参数的局部向量,

  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)
有啥问题,咋们评论区见。
只因你太美,留下订阅再走吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值