1.导入资源包
2.新建地形
3.给player物体添加组件
添加刚体(冻结旋转xyz轴)、添加胶囊碰撞体
4.新建动画控制器
动画控制器命名为playControl
5.给player添加动画控制器
动画可以实现不同效果(如果用代码量控制的话会大量复杂代码)
将动画控制器拖拽到player的控制器源中
并设置好avatar(现阶段的了解的这个类似于骨骼的用到的,相对于动画需要配置的参数)
6.设置动画
控制动画的1输入、输出、以及变化过程
1.添加变量速度speed
2.创建空状态
将运动设置为unarmed-idle,这个类似于动作的枢纽
3.创建混合树
4.双击混合树添加两个运动域
5.创建过渡(前进、和加速前进)
混合树到枢纽设置less,值为0.2,右侧枢纽设置greater,值设置为0.2
6.拖拽(后退)动作到动画中
设置左边为less 值为-0.2,右边设置为greater,值设置为-0.2
7.拖拽跳跃两个动作到动画框中
8.创建jump变量,类型为trigger
9.设置过渡选择jump变量
注意:退出时间根据实际项目中勾选或者不勾选,如果出现卡顿的话建议取消勾选
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;
}
}