Unity3D 学习笔记 创建3d人物并让其动起来
2020年2月9日
17:03
学习内容:b站傅老师的U3D黑魂复刻课程
# 创建地板,添加地板砖材质
调整大小,调整贴图
# 创建一个胶囊,并添加角色模型
取消胶囊模型的渲染,调整collider,添加rigidbody
# 创建输入控制脚本
创建playerinput添加给Playerhandle(空胶囊)
定义输入按键
[Header("-------------keys--------------")]
public string keyUp = "w";
public string keyDown = "s";
public string keyLeft = "a";
public string keyRight = "d";
定义信号
[Header("--------------signals----------------")]
[SerializeField]
private float Dup;
[SerializeField]
private float Dright;
[SerializeField]
private float velocityDup;
[SerializeField]
private float velocityDright;
private float targetUp;
private float targetRight;
在update中计算
void Update()
{
targetUp = (Input.GetKey(keyUp)?1.0f:0.0f) - (Input.GetKey(keyDown)?1.0f:0.0f);//是否向上
targetRight = (Input.GetKey(keyRight)?1.0f:0.0f) - (Input.GetKey(keyLeft)?1.0f:0.0f);//是否向右
Dup = Mathf.SmoothDamp(Dup,targetUp,ref velocityDup,0.1f);
Dright = Mathf.SmoothDamp(Dup,targetRight,ref velocityDright,0.1f);
}
验证按下按键时,信号可以正确变化。
但是当同时按下w和d或者是其他斜向运动,速度最大值可以达到单一方向运动的根号2倍,需要将方块映射到圆中。
因此添加一个新的映射方法
private Vector2 SquareToCircle(Vector2 input)
{
Vector2 res= Vector2.zero;
res.x = input.x*Mathf.Sqrt(1-(input.y *input.y) /2);
res.y = input.y*Mathf.Sqrt(1-(input.x *input.x) /2);
return res;
}
添加新变量
public float Dmag;
public Vector3 Dvec;
在update中进行计算
Vector2 tempDAxis = SquareToCircle(new Vector2(Dright,Dup));
Dmag = Mathf.Sqrt(tempDAxis.x * tempDAxis.x +tempDAxis.y * tempDAxis.y);
Dvec = tempDAxis.x * transform.right + tempDAxis.y * transform.forward;
可得正确效果
网友评论