当前位置:   article > 正文

Unity3D 控制角色(一)_unity3d脚本可以挂在人身上吗?

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);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

所在代码

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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

增加一项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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

整个平滑的过程

按下按键 值从0逐渐变为1 放开按键从1逐渐变回0
变化的量由Gravity

这里写图片描述

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

这里写图片描述

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/854309
推荐阅读
相关标签
  

闽ICP备14008679号