详解Unity的移动控制实现

article/2025/11/10 22:44:13

前言

上一篇写了数种Unity中的移动方式,有物理移动,有非物理移动等,这篇我们来谈谈Unity中的移动控制方式,来结合上一篇所说的方法,用起来。一般控制是通过获取用户输入来处理角色移动逻辑的,而用户输入的设备有键盘、鼠标、手柄等等,本篇仅介绍最常用的键鼠控制角色移动方式。

目录

    • 前言
    • 一、监听指定键 Input.GetKey()
    • 二、监听虚拟键(轴向) Input.GetAxis()
    • 三、监听虚拟键 Input.GetButton()
    • 四、物体跟随鼠标移动
    • 五、鼠标点击移动角色
    • 六、总结和资料参考
      • 1.总结
      • 2.资料参考

前排提醒:本文仅代表个人观点,以供交流学习,若有不同意见请评论留言,笔者一定好好学习,天天向上。

视频讲解:
详解Unity的移动控制实现_BiLiBiLi

本篇使用Translate来演示移动控制,若想使用其他移动方法,更新其移动逻辑即可


一、监听指定键 Input.GetKey()

在Input类中有专门用于监听指定按键的,如GetKey(是否持续按下某键)、GetKeyDown(是否按下某键),可以通过if判断这些键是否被按下来触发相应的移动逻辑,将整体的逻辑放到更新函数中,循环监听执行,来达到移动控制目的。

使用GetKey函数来监听某键是否持续按下,如果你想同时响应多个方向,请不要写成if…else形式
在这里插入图片描述

    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()

在Input类中也有专门用于监听轴向的,你可以这么理解:
Unity内置了一些虚拟键,其中Vertical代表当你按下“上”键或“下”键时触发,Horizontal代表当你按下“左”或“右”键时触发,而触发则返回一个范围在正负1的float值,而这个返回值就可以代替上一个例子中的Vertor.forward、back等值。这样定义的好处在于移植性高,比如这个例子移植到手机上依旧能正常运行,当拖动手机屏幕摇杆向上则触发Vertical,其余同理。

关于GetAxis定义的虚拟键的详细信息,大家可以到Edit-Project Settings-Input Manager中找到。

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

上一节说Unity内置了一些虚拟键,其中Vertical代表当你按下“上”键或“下”键时触发…这些只是用于方向,鼠标等真正具有轴向的虚拟控制键。而对于哪些功能性很强的,如跳跃,射击,出拳等操作没法用轴来定义了,Unity就又定义了一些虚拟键,用于这些功能。监听使用GetButton函数。

关于GetAxis定义的虚拟键的详细信息,大家可以到Edit-Project Settings-Input Manager中找到。

使用GetAxis函数来监听轴向,使用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(),本例就使用这种方法来做演示吧。

在这里插入图片描述

再次重复关于Input定义的虚拟键的详细信息,大家可以到Edit-Project Settings-Input Manager中找到。
在这里插入图片描述

而本例则会使用Mouse X和Mouse Y这两个虚拟键。

在这里插入图片描述

本例仅简单的通过修改transform的XZ坐标来实现移动的,若要做出精准的物体跟随鼠标运动,需要将屏幕坐标转换为世界坐标,才能通过对转换后的世界坐标位置进行位移操作,下一个例子就用到了转换坐标的相关知识。

    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);}

五、鼠标点击移动角色

上述几个例子都是通过键盘控制或鼠标移动控制,也有很多游戏是通过鼠标点击来移动的,获取鼠标点击时的位置信息也有很多方法,但其重点在于如何将2维平面转换为3维世界的实际位置,这涉及到世界坐标和屏幕坐标的相互转换,以及射线相关知识,读者可自行查阅API了解。后续我也会写相关的这类文章。

通过鼠标点击来移动角色思路如下:当鼠标点击时,从当前鼠标点击位置生成一条射线,穿过屏幕通过转换来获取实际世界坐标,然后通过更新函数来移动角色抵达相应位置
在这里插入图片描述

    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中的射线与射线检测


http://chatgpt.dhexx.cn/article/eAasKcX1.shtml

相关文章

JSON数据和解析

JSON> JavaScript Object Notation JSON是一个字符串 常常用于网络传输数据的一种字符 json数据是一种轻量级的数据交换格式&#xff0c;它基于一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语…

Android开发之JSON数据解析详解(一)

&#xfeff;&#xfeff; 今天很高兴和大家一起学习Android的JSON数据解析,可能对于学习安卓的朋友都知道JSON在数据解析方面已经很普遍了.所以也是我们必定要了解的知识 ,下面让我们了解一下JSON的发展历程. XML——这种用于表示客户端与服务器间数据交换有效负载的格式&am…

Android开发json数据解析

在Android开发过程中&#xff0c;或更新数据&#xff0c;或为减轻手机负担将大部分复杂运算交由服务器来进行&#xff0c;都需要与服务器之间进行数据交互&#xff0c;数据交互中&#xff0c;使用的较为频繁的格式变为json数据&#xff0c;书写便捷&#xff0c;操作方便&#x…

JSON解析data数据

之前 是用JSONObject去解析data后来就报错 com.alibaba.fastjson.JSONException: expect : at 0, actual

JSON数据解析 之JSONPath

一&#xff1a;JSONPath说明&#xff1a; JSONPath是一种通过配置正则表达式语法&#xff0c;抽取json中的指定数据的一种类库&#xff1b; 二&#xff1a;需要的jar依赖&#xff08;依赖阿里巴巴的fastjson.jar&#xff09; maven用户可通过maven远程仓库获取配置地址 <…

一文搞懂JSON及JSON数据解析

文章目录 前言一、XML1、简介2、XML解析方式2.1、SAX解析方式2.2、DOM解析方式2.3、JDOM解析方式2.4、DOM4J解析方式 二、JSON1. 简介及其语法格式2. 解析方式2.1 GSON解析2.1.1 对象转换为JSON字符串2.1.2 JSON字符串转换为对象 2.2 fastjson2.2.1 对象转换为JSON字符串2.2.2 …

c语言解析json数据

我使用的是cJSON: http://sourceforge.net/projects/cjson/ 先看json的数据结构 c中没有对象&#xff0c;所以json数据是采用链表存储的 C代码 typedef struct cJSON { struct cJSON *next,*prev; // 数组 对象数据中用到 struct cJSON *child; // 数…

JSON数据解析(GSON方式)

Android技术学习&#xff0c;更多知识请访问https://www.itkc8.com     JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;采用完全独立于语言的文本格式&#xff0c;为Web应用开发提供了一种理想的数据交换格式。 在上一篇…

android studio json数据解析汇总(备忘)

之前写过一个&#xff0c;但是写不太全&#xff0c;结果自己都看不懂&#xff0c;希望这个以后能看懂吧。 以两个例子说明json数据解析&#xff0c;一个是最简单的&#xff0c;一个是比较难的。 必须知道的&#xff1a;JSONObject和JSONArray JSONObject是在{ }内的。如{&qu…

json解析数据详解

对于服务器端来说&#xff0c;返回给客户端的数据格式一般分为html、xml和json这三种格式&#xff0c;那么本篇随笔将讲解一下json这个知识点&#xff0c;包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据&#xff0c;以及如何在我们的Android客户端解析来自…

Python3 JSON数据解析

JSON是一种比轻量级的数据交换格式。比XML更小、更快、更容易解析。 JSON语法时JavaScript对象表示语法的子集。书写格式为&#xff1a;键:值。用英文逗号为分隔符&#xff0c;{}大括号报错对象&#xff0c;[]中括号报错数组。 python3中使用json模块对JSON进行编码和解码&am…

json数据解析 jsonpath

json是一种文本数据交换格式&#xff0c;不是一种语言 jsonpath是一种语法&#xff0c;用于json数据&#xff0c;类似xpath用于html 1.json.dumps json.loads 需要import json json.dumps——将python数据转化为json数据 实际上就是将python里面的字典转化成json格式的数…

Android开发--Json数据的解析

在执行解析数据之前&#xff0c;需要将一个类库应用到你的程序中&#xff0c;下载的地址是&#xff1a; http://code.google.com/p/google-gson/ 下载解压之后你需要将蓝色标记的文件放入到你的程序之中应用 首先&#xff0c;我们需要知道什么是Json数据: JSON的定义&…

Python3 JSON 数据解析

Python3 中可以使用 json 模块来对 JSON 数据进行编解码&#xff0c;它包含了两个函数&#xff1a; json.dumps(): 对数据进行编码。json.loads(): 对数据进行解码。 示例&#xff1a; # -*- coding:utf-8 -*-import json # 加载json模块data { # 定义一个字典类型a: 1,b:…

json数据解析(json数据解析 前端)

JAVA为什么要返回JSON数据&#xff1f;JAVA为什么要返回JSON数? print( String()); 这样在前台页面就可以通过eval(data。List)获取到。 输出 String()就可以看到讲一个java对象转换成json对象的结果。其他java对象也可以这么来处理。 另外还有就是 List list new ArrayL…

JSON 数据解析的方法

JSON 数据解析 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于C语言家族的习惯&#xff08;包括C、C、C#、Java、JavaScript、Perl、Python等&#xff09;。这…

手动JSON数据解析

1.将json格式的字符串{}转化为JAVA对象 //第一步&#xff1a;获取或创建Json数据String json "{\n" " \"id\":2,\"name\":\"小龙虾\",\n" " \"price\":12.3,\n" " …

【Python爬虫与数据分析】爬虫Json数据解析

目录 一、Json文件数据解析 二、Json数据包解析获取图片资源 三、Json数据包解析获取视频资源 一、Json文件数据解析 json字符串&#xff1a;通常类似python数据类型中的列表和字典的结合&#xff0c;也可能是单独的列表或者字典格式&#xff0c;通常可以通过json模块的函数…

Json格式数据解析

一、简介 XML这种数据格式。XML的特点是功能全面&#xff0c;但标签繁琐&#xff0c;格式复杂。在Web上使用XML现在越来越少&#xff0c;取而代之的是JSON这种数据结构。 JSON是JavaScript Object Notation的缩写&#xff0c;它去除了所有JavaScript执行代码&#xff0c;只保…

JSON解析

#粤嵌星计划&#xff0c;粤嵌我来了# #粤嵌星计划&#xff0c;粤嵌我来了# 1、什么是JSON &#xff08;1&#xff09;JSON&#xff08;Java Script Object Notation&#xff09;是一种轻量级的数据交换语言&#xff0c;以文本字符串为基础&#xff0c;且易于让人阅读。&#x…