Unity 按键控制(移动、旋转、相机角度控制)
程序员文章站
2024-03-16 20:24:16
...
通过按键控制物体的位置及姿态
1、移动:物体xyz轴分别有对应的按键控制。
加速度控制:长按键会使加速度变大,同时加速度值有范围限制。
移动范围也有限制,都是通过函数 Mathf.Clamp 计算。
初值设置:
private Vector3 m_camRot;
private Transform m_camTransform;//摄像机Transform
private Transform m_transform;//摄像机父物体Transform
public float m_movSpeed = 1;//移动系数
public float m_rotateSpeed = 1;//旋转系数
public float m_objRotateSpeed=0.5f; //物体旋转速度
public float horizontalRotate=5;
//速度初值
private float xm = 0, ym = 0, zm = 0;
//最大加速度,反向时加负号
private float xmMax = 10, ymMax = 10, zmMax = 10;
private float posX, posY, posZ;
//位置范围,反向时加负号
public float posXRange, posYRange, posZRange;
private void Start()
{
m_camTransform = Camera.main.transform;
m_transform = GetComponent<Transform>();
xm = 0;
ym = 0;
zm = 0;
}
按键移动代码块:
加速度要注意,按键抬起时要归零。
#region 按键控制移动
void KeyToMove()
{
//按键盘W向上移动
if (Input.GetKey(KeyCode.W))
{
//加速度计算
ym += m_movSpeed * Time.deltaTime;
//限制速度范围
ym = Mathf.Clamp(ym, 0, ymMax);
PosYRange();
}
if (Input.GetKeyUp(KeyCode.W))
{
//按键抬起时,加速度归零
ym = 0;
}
if (Input.GetKey(KeyCode.S) /*&& m_transform.position.y >= 1*/ )//按键盘S向下移动
{
ym -= m_movSpeed * Time.deltaTime;
ym = Mathf.Clamp(ym, -ymMax, 0);
PosYRange();
}
if (Input.GetKeyUp(KeyCode.S))
{
ym = 0;
}
if (Input.GetKey(KeyCode.J))//向左移动
{
xm -= m_movSpeed * Time.deltaTime;
xm = Mathf.Clamp(xm, -xmMax, 0);
PosXRange();
}
else if (Input.GetKey(KeyCode.L))//向右移动
{
xm += m_movSpeed * Time.deltaTime;
xm = Mathf.Clamp(xm, 0, xmMax);
PosXRange();
}
if (Input.GetKey(KeyCode.I))//向前移动
{
zm -= m_movSpeed * Time.deltaTime;
zm = Mathf.Clamp(zm, -zmMax, 0);
PosZRange();
}
else if (Input.GetKey(KeyCode.K))//向后移动
{
zm += m_movSpeed * Time.deltaTime;
zm = Mathf.Clamp(zm, 0, zmMax);
PosZRange();
}
}
void PosXRange()
{
posX = m_transform.position.x + xm;
posX = Mathf.Clamp(posX, -posXRange, posXRange);
m_transform.position = new Vector3(posX,m_transform.position.y, m_transform.position.z);
}
void PosYRange()
{
//当前位置
posY = m_transform.position.y + ym;
//限制移动范围
posY = Mathf.Clamp(posY,-posYRange, posYRange);
//移动位置赋值
m_transform.position = new Vector3(m_transform.position.x, posY, m_transform.position.z);
}
void PosZRange()
{
posZ = m_transform.position.z + zm;
posZ = Mathf.Clamp(posZ, -posZRange, posZRange);
m_transform.position = new Vector3(m_transform.position.x, m_transform.position.y,posZ);
}
#endregion
2、旋转:
** 为避免方向键的Horizontal和AD、Vertical和WS冲突,在Edit-Input中取消关联**
#region 按键控制旋转
void KeyToRotate()
{
//方向键左右,控制左右旋转
//if (Input.GetAxis("Horizontal") != 0)
//{
// m_transform.Rotate(0,Input.GetAxis("Horizontal")*m_objRotateSpeed*Time.deltaTime,0);
//}
if (Input.GetKey(KeyCode.A))
{
m_transform.Rotate(Vector3.up, -horizontalRotate);
}
if (Input.GetKey(KeyCode.D))
{
m_transform.Rotate(Vector3.up, horizontalRotate);
}
//方向键上下,控制上下的旋转(俯仰)
//if (Input.GetAxis("Vertical") != 0)
//{
// m_transform.Rotate(Input.GetAxis("Vertical") * m_objRotateSpeed, 0, 0);
//}
}
#endregion
3、相机跟随鼠标旋转 :
#region 相机跟随鼠标旋转
void CameraRotate_Mouse()
{
if (Input.GetMouseButton(0))
{
//获取鼠标移动距离
float rh = Input.GetAxis("Mouse X");
float rv = Input.GetAxis("Mouse Y");
// 旋转摄像机
m_camRot.x -= rv * m_rotateSpeed;
m_camRot.y += rh * m_rotateSpeed;
}
m_camTransform.eulerAngles = m_camRot;
// 使主角的面向方向与摄像机一致
//Vector3 camrot = m_camTransform.eulerAngles;
//camrot.x = 0; camrot.z = 0;
//m_transform.eulerAngles = camrot;
}
#endregion
4、因为属于按键实时操作,所有在Update函数中调用。
private void Update()
{
KeyToMove();
KeyToRotate();
CameraRotate_Mouse();
}
上一篇: JDBC与Oracle存储过程
下一篇: 几种常见的加密算法及 Java 实现