- Unity3D 控制角色(一)
- 最简单的移动 脚本挂到需要控制的角色上
- 所在代码
- 对上述方法的说明
- 需求增加
- 控制使用的按键可自定义 增加平滑的功能
- 代码
- 增加一项Input Axis 名称为Rotate后 使用 Q 和 E 键旋转
- 整个平滑的过程
- 效果 起步和停止都有一个缓冲
Unity3D 控制角色(一)
最简单的移动 脚本挂到需要控制的角色上
public float MoveSpeed = 15.0f;
public float RotateSpeed = 80.0f;
void Update () {
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(0, 0, 1 * MoveSpeed * Time.deltaTime, Space.Self);
}
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(0, 0, -1 * MoveSpeed * Time.deltaTime, Space.Self);
}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{
transform.Translate(-1 * MoveSpeed * Time.deltaTime, 0, 0, Space.Self);
}
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{
transform.Translate(1 * MoveSpeed * Time.deltaTime, 0, 0, Space.Self);
}
if (Input.GetKey(KeyCode.Q))
{
transform.Rotate(0, -1 * RotateSpeed * Time.deltaTime, 0, Space.Self);
}
if (Input.GetKey(KeyCode.E))
{
transform.Rotate(0, 1 * RotateSpeed * Time.deltaTime, 0, Space.Self);
}
}
所在代码
ControlCharacter001.cs
对上述方法的说明
- 方法直接操作对象的tranform组件
- 写在Update中每帧调用
- translate中的三个坐标值表示的是相对当前位置的位移向量 位移(距离)=速度*时间 时间则是time.deltaTime(单位是秒 表述的是从上一帧到本帧经过的时间 是变化的 速度的单位是米每秒)
- 对外部暴露2个速度变量可修改(移动和旋转)
- Time.deltaTime用于协调线性,保证帧与帧之间速度一致,因为帧间隔随机器性能不同,使用Time.deltaTime可以保证是匀速运动
- 不使用Time.deltaTime的后果是在前端表现出卡顿 速度虽然可以通过2个公有变量进行调整
关于Time.deltaTime参看
需求增加
- 按键需要可以修改
控制使用的按键可自定义 增加平滑的功能
使用Input,按键不再使用KeyCode这种方式
使用按键轴名定义 Axis
参数位置 Edit -> Project Settings -> Input
- 可以增加自定义轴名称
- 一个功能分为正向和反向(Negative->反向 Positive->正向)
- 有第2按键的功能(Alt部分)
- 平滑的功能(Gravity Dead) 使用GetAxis可以得到平滑滤波的值
- 使用GetAxisRaw则依然是 -1 0 1三个值
- 使用GetAxis对应按下键有一个逐渐增加到1的过滤 放开按键逐渐变回0
Positive Button:使用GetButton()时,引用的字符串名
Gravity:使用GetAxis()时,返回0的速度,越大越快
Sensitivity:使用GetAxis()时,达到1或-1的速度,越大越快
Dead:当使用摇杆时,当Dead越大需要移动越大的距离才会有返回值(当不需要过小的返回值时使用)
snap:使用GetAxis()时,如果勾选,正反按键同时按下会返回0
导出后的项目可以给用户修改按键
代码
public float MoveSpeed = 15.0f;
public float RotateSpeed = 80.0f;
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
//Debug.Log(string.Format("h: {0} v: {1}", h, v));
transform.Translate(h * MoveSpeed * Time.deltaTime, 0, v * MoveSpeed * Time.deltaTime, Space.Self);
}
增加一项Input Axis 名称为Rotate后 使用 Q 和 E 键旋转
public float MoveSpeed = 15.0f;
public float RotateSpeed = 80.0f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
float r = Input.GetAxisRaw("Rotate");
//Debug.Log(string.Format("h: {0} v: {1}", h, v));
transform.Translate(h * MoveSpeed * Time.deltaTime, 0, v * MoveSpeed * Time.deltaTime, Space.Self);
transform.Rotate(0, r * RotateSpeed * Time.deltaTime, 0, Space.Self);
}
整个平滑的过程
按下按键 值从0逐渐变为1 放开按键从1逐渐变回0
变化的量由Gravity
效果 起步和停止都有一个缓冲