Unity3D 控制角色(一)

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参看 https://blog.csdn.net/wdjhzw/article/details/73433658?locationNum=7&fps=1

需求增加

  • 按键需要可以修改

控制使用的按键可自定义 增加平滑的功能

使用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

这里写图片描述

效果 起步和停止都有一个缓冲

这里写图片描述

如果使用GetAxisRaw替换GetAxis则没有缓冲效果
参看 https://blog.csdn.net/cui240558023/article/details/50448013?_t=t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值