前言
上一篇写了数种Unity中的移动方式,有物理移动,有非物理移动等,这篇我们来谈谈Unity中的移动控制方式,来结合上一篇所说的方法,用起来。一般控制是通过获取用户输入来处理角色移动逻辑的,而用户输入的设备有键盘、鼠标、手柄等等,本篇仅介绍最常用的键鼠控制角色移动方式。
目录
本篇使用Translate来演示移动控制,若想使用其他移动方法,更新其移动逻辑即可
一、监听指定键 Input.GetKey()
public float speed = 3.0f;
void Update()
{
Move_Update();
}
private void Move_Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
}
}
二、监听虚拟键(轴向) Input.GetAxis()
public float speed = 3.0f;
void Update()
{
Move_Update();
}
private void Move_Update()
{
Vector3 v = Input.GetAxis("Vertical") * Vector3.forward;
Vector3 h = Input.GetAxis("Horizontal") * Vector3.right;
//此处乘以V3向量是为了Translate,因为此函数只接受V3向量
transform.Translate(v * speed * Time.deltaTime);
transform.Translate(h * speed * Time.deltaTime);
}
三、监听虚拟键 Input.GetButton()
比如下面这个例子,使用了GetButton来监听开火键(鼠标左键)、跳跃键(空格),因为一般开火键都是鼠标左键嘛,空格都是跳跃嘛。所以这些是属于约定俗成的东西。当然你完全可以更改,你改成鼠标左键跳跃也行,只要有人愿意买单就行,毕竟游戏引擎只是工具而已。
void Update()
{
if (Input.GetButtonDown("Jump"))
{
transform.GetComponent<Rigidbody>().AddForce(transform.up * 100);
}
if(Input.GetButtonDown("Fire1"))
{
Debug.Log("开火!");
}
}
四、物体跟随鼠标移动
上一个例子我们通过监听虚拟键来控制物体前后左右移动,这次我们通过控制鼠标移动来让物体跟随,依旧用到了Input类中的值,当设置好监听键然后当鼠标移动时,会触发返回一个范围在正负1的float值,如下图所示,这是一个屏幕范围,鼠标向屏幕正右移动则返回大于0且小于1的相对与屏幕的比例数字,向左则相反。若你只想让返回的数值是正负1的话,可避免使用GetAxis(),而是使用GetAxisRaw(),本例就使用这种方法来做演示吧。
public float speed = 10f;
void Update()
{
Move_Update();
}
private void Move_Update()
{
float mouseX = Input.GetAxisRaw("Mouse X");
float mouseY = Input.GetAxisRaw("Mouse Y");
transform.Translate(Vector3.right * mouseX * Time.deltaTime * speed);
transform.Translate(Vector3.forward * mouseY * Time.deltaTime * speed);
}
五、鼠标点击移动角色
private bool isNextMove = false;
private Vector3 point;
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Input.GetMouseButtonDown(0))
//当鼠标点击时,才触发射线检测
{
if (Physics.Raycast(ray, out hitInfo))
//当检测到地面
{
isNextMove = true;
point = hitInfo.point;
//将isNextMove设为true,然后保存当前撞击点位置
}
}
if(isNextMove == true)
//当isNextMove为真,则不停调用Move
{
Move(point);
}
}
void Move(Vector3 pos)
{
//使用Vector3的插值函数来移动位置
transform.position = Vector3.MoveTowards(transform.position, pos, Time.deltaTime * 3.0f);
if (transform.position == pos)
//当目标抵达位置的时候,将isNextMove置为false,等待下一次移动指令
isNextMove = false;
}
六、总结和资料参考
1.总结
本篇主要介绍了关于移动控制的实现
- 通过Input.GetKey()监听键盘
- 通过Input.GetMouseButton()监听鼠标
- 通过Input.GetAxis()监听虚拟轴向
- 通过Input.GetButton()监听虚拟键
2.资料参考
[1]网络.Unity官方API & Unity圣典API
[2]梦天幼.详解Unity的几种移动方式实现
[3]梦天幼.详解Unity中的射线与射线检测