【Unity3D日常开发】Unity3D中控制人物移动

一、前言

网上关于角色移动的文章太多太多了,就我自己整理的时候都发现写了好多篇(因为有不同的方案),今天就将目前已知的移动角色的方案总结出来,毕竟是一个资源整合的时代,谁也不想找个角色移动的脚本都要找好几篇文章对吧

目前可以划分为三个方面

  • 角色移动到鼠标点击的位置
  • 键盘控制角色移动(其他的比如游戏手柄也算键盘、HTC手柄 也算键盘)
  • 手机端转盘控制角色移动

其他的比如摄像机跟随移动这个可以作为拓展

二、角色移动到鼠标点击的位置

代码:

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject Player;
    Vector3 tempPoint = new Vector3(0, 0, 0);

    void Update()
    {
        PlayerMove_FollowMouse();
    }

    //角色移动到鼠标点击的位置
    public void PlayerMove_FollowMouse()
    {
        
        //右键点击
        if (Input.GetMouseButtonDown(1))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray,out hitInfo))
            {
                tempPoint = hitInfo.point;
            }
        }
        float step = 10 * Time.deltaTime;
        Player.transform.localPosition = Vector3.MoveTowards(Player.transform.localPosition, tempPoint, step);
        Player.transform.LookAt(tempPoint);
    }
}

效果图:

三、键盘控制角色移动(其他的比如游戏手柄也算键盘、HTC手柄 也算键盘)

键盘移动也有好几种方案,这些都会写到

3-1、键盘通过Transform组件 控制角色移动

代码:

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject Player;
    public float m_speed = 5f;

    void Update()
    {
        //键盘控制移动
        PlayerMove_KeyTransform();
    }

    //通过Transform组件 键盘控制移动
    public void PlayerMove_KeyTransform()
    {
        if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前
        {
            Player.transform.Translate(Vector3.forward * m_speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //后
        {
            Player.transform.Translate(Vector3.forward * -m_speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左
        {
            Player.transform.Translate(Vector3.right * -m_speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右
        {
            Player.transform.Translate(Vector3.right * m_speed * Time.deltaTime);
        }
    }
}

效果图:

另一种写法,效果一致:

代码:

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject Player;
    public float m_speed = 5f;

    void Update()
    {
        //键盘控制移动
        PlayerMove_KeyTransform2();
    }

    //通过Transform组件 键盘控制移动 另一种写法
    public void PlayerMove_KeyTransform2()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下

        Player.transform.Translate(Vector3.forward * vertical * m_speed * Time.deltaTime);//W S 上 下
        Player.transform.Translate(Vector3.right * horizontal * m_speed * Time.deltaTime);//A D 左右
    }
}

效果图:

3-2、键盘通过Rigidbody组件 控制角色移动

通过Rigidbody组件 键盘控制移动 Velocity移动 角色身上需要挂载Rigidbody组件

代码:

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject Player;

    void Update()
    {
        PlayerMove_KeyRighidbody();
    }

    //通过Rigidbody组件 键盘控制移动 Velocity移动 角色身上需要挂载Rigidbody组件
    public void PlayerMove_KeyRighidbody()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下
        //这个必须分开判断 因为一个物体的速度只有一个
        if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.S))
        {
            Player.GetComponent<Rigidbody>().velocity = Vector3.forward * vertical * m_speed;
        }
        if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.D))
        {
            Player.GetComponent<Rigidbody>().velocity = Vector3.right * horizontal * m_speed;
        }
    }
}

通过Rigidbody组件 键盘控制移动 AddForce控制移动 角色身上需要挂载Rigidbody组件

代码:

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject Player;

    void Update()
    {
        PlayerMove_KeyRighidbody2();
    }

    //通过Rigidbody组件 键盘控制移动 AddForce控制移动 角色身上需要挂载Rigidbody组件
    public void PlayerMove_KeyRighidbody2()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下

        Player.GetComponent<Rigidbody>().AddForce(Vector3.forward * vertical * m_speed);
        Player.GetComponent<Rigidbody>().AddForce(Vector3.right * horizontal * m_speed);
    }
}

效果图:

3-3、键盘通过CharacterController组件 控制角色移动

通过CharacterController组件 键盘移动物体 SimpleMove控制移动

代码:

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject Player;

    void Update()
    {
        PlayerMove_KeyCharacterController();
    }

    //通过CharacterController组件 键盘移动物体 SimpleMove控制移动
    public void PlayerMove_KeyCharacterController()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下

        Player.GetComponent<CharacterController>().SimpleMove(transform.forward * vertical * m_speed);
    }
}

通过CharacterController组件 键盘移动物体 Move控制移动

代码:

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject Player;

    void Update()
    {
        PlayerMove_KeyCharacterController2();
    }

    //通过CharacterController组件 键盘移动物体 Move控制移动
    public void PlayerMove_KeyCharacterController2()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下
        float moveY = 0;
        float m_gravity = 10f;
        moveY -= m_gravity * Time.deltaTime;//重力
        Player.GetComponent<CharacterController>().Move(new Vector3(horizontal, moveY, vertical) * m_speed * Time.deltaTime);
    }
}

四、手机端转盘控制角色移动

这个可以使用EasyTouch插件,这个插件的使用以后再单独编写吧

恬静的小魔龙 CSDN认证博客专家 CSDN博客专家
博主从2017年9月开始在CSDN写博客,于2019年8月成为博客专家,比起那些4个月就成为博客专家的确实水平差了点,但是本来写博客也是为了对学习的东西的记录,慢慢的写出来的东西能帮助更多的人,也慢慢的提升了自己的水平。想起来一个例子:1.01^365=37.8,1.02^365=1377.4,每天进步一点点,一年后就差了几十倍的差距,加油吧少年。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__0809 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值