0
点赞
收藏
分享

微信扫一扫

详解Unity的移动控制实现

千妈小语 2022-04-15 阅读 71
unity

前言

上一篇写了数种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中的射线与射线检测

举报

相关推荐

0 条评论