unity实现动画的人物的移动(加速、后退、跳跃)

831 阅读2分钟

1.导入资源包

2.新建地形

image.png

3.给player物体添加组件

添加刚体(冻结旋转xyz轴)、添加胶囊碰撞体

4.新建动画控制器

动画控制器命名为playControl

image.png

5.给player添加动画控制器

动画可以实现不同效果(如果用代码量控制的话会大量复杂代码)

将动画控制器拖拽到player的控制器源中

并设置好avatar(现阶段的了解的这个类似于骨骼的用到的,相对于动画需要配置的参数)

image.png

image.png

6.设置动画

控制动画的1输入、输出、以及变化过程

1.添加变量速度speed

image.png

2.创建空状态

image.png

将运动设置为unarmed-idle,这个类似于动作的枢纽

3.创建混合树

image.png

4.双击混合树添加两个运动域

image.png

5.创建过渡(前进、和加速前进)

混合树到枢纽设置less,值为0.2,右侧枢纽设置greater,值设置为0.2

image.png

image.png

6.拖拽(后退)动作到动画中

设置左边为less 值为-0.2,右边设置为greater,值设置为-0.2

image.png image.png

7.拖拽跳跃两个动作到动画框中

image.png

8.创建jump变量,类型为trigger

image.png

9.设置过渡选择jump变量

image.png

注意:退出时间根据实际项目中勾选或者不勾选,如果出现卡顿的话建议取消勾选

7.编写player脚本文件

并将脚本文件挂载到player物体身上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour
{
    //拿到控制器
    private Animator ani;
    private float x;
    private float z;
    private Vector3 vector;
    // Start is called before the first frame update
    void Start()
    {
        //Cursor.lockState = CursorLockMode.Locked;
        ani = GetComponent<Animator>();//拿到player身上的控制器 
    }

    // Update is called once per frame
    void Update()
    {
        //获取垂直虚拟轴
        x = Input.GetAxis("Horizontal");
        z = Input.GetAxis("Vertical");//最大就是1  
        float d = Mathf.Sqrt(x * x + z * z);
        vector = new Vector3(x, 0, z); //zero = (0,0,0)
        if (vector != Vector3.zero) //不等于0说明按下了按键
        {
            //改变位置 --将物体朝向vector的方向就可以了 
            transform.rotation = Quaternion.LookRotation(vector);
            //移动操作 --朝着这个方向并且朝着这个方向同步移动
            transform.Translate(Vector3.forward * 4 * Time.deltaTime*d);

            if (Input.GetKey(KeyCode.LeftShift))
            {
                z *= 2;
            }
            //设置speed
            ani.SetFloat("speed", z);
            if (Input.GetKeyDown(KeyCode.Space))
            {
                ani.SetTrigger("jump");
            }
        }
        

        //if(Input.GetMouseButtonDown(0))//按下的时候是跑步  播放跑步的动画  isRun的值
        //{
        //    ani.SetBool("isRun", true);
        //}
        //if(Input.GetMouseButtonUp(0))
        //{
        //    ani.SetBool("isRun", false);
        //}
    }
}

8.编写camera脚本文件

将camera脚本文件挂载到摄像机上

    using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class camera : MonoBehaviour
{
    //保存开始时,玩家和相机的向量 
    private Vector3 vector;
    //保存玩家的transform组件 
    private GameObject player;
    // Start is called before the first frame update
    void Start()
    {
        //通过标签获取玩家的transform组件
        player = GameObject.FindWithTag("Player");
        //获取玩家和相机之间的向量
        vector = player.transform.position - transform.position;
    }


    // Update is called once per frame
    void Update()
    {
        //每次更新相机的位置--物体在前,摄像头在后面跟踪
        transform.position = player.transform.position - vector;
    }
}