学习内容:b站傅老师的U3D黑魂复刻课程
添加动画控制器和控制脚本
在animator中添加动画
创建叫ground的 blend tree
添加对应动画
出现默认的idle状态
接下来通过脚本添加动画控制
前面的Dmag数值就可以作为Speed
这里说一下计算Dmag为什么不用上一个脚本里的velocity,因为那个其实是加速度。试一下就知道了
public GameObject model;
public PlayerInput pi;
[SerializeField]
private Animator anim;
// Start is called before the first frame update
void Awake()
{
pi = GetComponent<PlayerInput>();
anim = model.GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
anim.SetFloat("Speed",pi.Dmag);
}
取消apply root motion后可以看到现在模型可以原地踏步了
添加移动和转向
private Rigidbody rigid;
// Start is called before the first frame update
void Awake()
{
pi = GetComponent<PlayerInput>();
anim = model.GetComponent<Animator>();
rigid = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
anim.SetFloat("Speed",pi.Dmag);
model.transform.forward = pi.Dvec;
}
void FixedUpdate()
{
rigid.velocity = pi.Dvec;
}
添加刚体以及FixedUpdate中对刚体速度的改变实现移动。
可以行走了
增加奔跑
增加变量
public string keyRun = "left shift";
public bool run;
以及pi中的按键查询
run = Input.GetKey(keyRun);
添加速度系数
[SerializeField]
private float SpeedFactor = 2;
刚体移动速度
private Vector3 bodyVelocity = Vector3.zero;
在update中计算速度
void Update()
{
model.transform.forward = pi.Dvec;
if(pi.run){
bodyVelocity.x = SpeedFactor * pi.Dmag * pi.Dvec.x;
bodyVelocity.z = SpeedFactor * pi.Dmag * pi.Dvec.z;
}
else{
bodyVelocity.x = pi.Dmag * pi.Dvec.x;
bodyVelocity.z = pi.Dmag * pi.Dvec.z;
}
将速度赋值
void FixedUpdate()
{
rigid.velocity = bodyVelocity;
}
动画已经添加完成,直接在加入setfloat
anim.SetFloat("Speed",pi.run?pi.Dmag:2);
这样跑步和走路切换的太突然,加入平滑过渡
anim.SetFloat("Speed",Mathf.Lerp(anim.GetFloat("Speed"),pi.run?2:pi.Dmag,0.5f));
同时修改转向平滑
model.transform.forward = Vector3.Lerp(model.transform.forward,pi.Dvec,0.5f);
测试发现bug就是即使原地不动,按下shift也会做出奔跑动作
作出修改
anim.SetFloat("Speed",Mathf.Lerp(anim.GetFloat("Speed"),pi.Dmag*(pi.run?2:1),0.5f));
本节完成。