面向小白!在Unity中实现最简单的人物移动脚本

简介: 网上关于角色移动的文章太多太多了,就我自己整理的时候都发现写了好多篇(因为有不同的方案),今天就将目前已知的移动角色的方案总结出来,毕竟是一个资源整合的时代,谁也不想找个角色移动的脚本都要找好几篇文章对吧目前可以划分为三个方面• 角色移动到鼠标点击的位置• 键盘控制角色移动(其他的比如游戏手柄也算键盘、HTC手柄 也算键盘)• 手机端转盘控制角色移动其他的比如摄像机跟随移动这个可以作为拓展

一、前言

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

目前可以划分为三个方面

  • 角色移动到鼠标点击的位置
  • 键盘控制角色移动(其他的比如游戏手柄也算键盘、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插件,这个插件的使用以后再单独编写吧



相关文章
|
6月前
|
存储 人工智能 Java
Unity优化——脚本优化策略4
Unity优化——脚本优化策略4
113 0
|
2月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
188 3
|
3月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
84 0
|
5月前
|
Go 图形学
【Unity小技巧】3D人物移动脚步和跳跃下落音效控制
【Unity小技巧】3D人物移动脚步和跳跃下落音效控制
61 1
|
5月前
|
图形学
【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件
【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件
207 0
|
5月前
|
人工智能 图形学
【unity小技巧】使用动画状态机脚本实现一个简单3d敌人AI功能
【unity小技巧】使用动画状态机脚本实现一个简单3d敌人AI功能
51 0
|
5月前
|
人工智能 定位技术 图形学
【Unity小技巧】一个脚本实现控制3D远程/近战敌人AI
【Unity小技巧】一个脚本实现控制3D远程/近战敌人AI
52 0
|
5月前
|
图形学 开发者
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
244 0
|
5月前
|
自然语言处理 图形学
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
83 0
|
5月前
|
存储 图形学
【unity实战】Unity实现2D人物双击疾跑
【unity实战】Unity实现2D人物双击疾跑
53 0
下一篇
无影云桌面