前言

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

详解Unity的移动控制实现相关推荐

  1. 详解Unity中的粒子系统Particle System (七)

    前言 本篇来讲一讲Collision和Triggers模块,这两个模块主要用于粒子系统与物理世界的交互,一个是碰撞器,另一个是触发器.有了这两个模块我们又可以做出更炫酷的粒子效果啦! 目录 前言 本系 ...

  2. 详解Unity中的粒子系统Particle System (二)

    前言 上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解.从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状 ...

  3. 详解Unity中的粒子系统Particle System (四)

    前言 上一篇我们主要讲解了Shape形状模块,以及Emission发射模块,这是粒子系统中最为重要的两个模块,学会了它们我们足以做出惊艳的效果,比如霰弹枪的发射,蘑菇蛋的冲击波等等.本篇讲的内容依旧重 ...

  4. 详解Unity中的粒子系统Particle System (十一)

    前言 今天讲最后一个模块--External Forces,该模块需要和Force Field组件配合使用,作用是模拟物理的力对粒子的影响.至此,Unity内置粒子系统的最后一块物理砖补齐,理论上来讲 ...

  5. 详解Unity中的粒子系统Particle System (十)

    前言 第十篇,我们讲Light模块和Trails模块,这两个模块不像前几篇所讲的模块一样基本都是对粒子的运行逻辑变化产生影响的,而是对粒子的呈现效果产生影响.比如爆炸粒子不能只有爆炸,还要有光亮,被炸 ...

  6. 详解Unity中的粒子系统Particle System (八)

    前言 书接上回,咱们继续讲粒子系统,本篇该说Inherit Velocity和Sub Emitters这两个模块,依旧是重量级选手,特别是Sub Emitters这个模块,有了它,我们的粒子效果可以做 ...

  7. 详解Unity中的粒子系统Particle System (九)

    前言 今天讲Texture Sheet Animation模块,先前我们已经讲了很多很多模块,通过上述模块可以实现很酷的效果,但是缺了一点真实感.比如说爆炸特效,仅指望单独的粒子来模拟真实的爆炸效果是 ...

  8. 详解Unity中的车轮碰撞器Wheel Collider

    前言 碰撞体组件定义了物体的物理性状,Unity中有一系列基本碰撞体,我们可以使用它们组合成任意形状,但除了基本碰撞体之外,Untiy还提供了诸如车轮(Wheel).网格(Mesh).地形(Terra ...

  9. 详解Unity中的粒子系统Particle System (三)

    前言 上一篇我们详细讲解了有关主模块的全部内容,已经对粒子系统的基本运作有了足够的了解,本篇就来讲一下被粒子系统默认启用的Emission.Shape.Renderer模块又在粒子系统中扮演着怎么样的 ...

最新文章

  1. [BZOJ4553][TJOI2016HEOI2016]序列(CDQ分治)
  2. linux根据端口查pid、根据pid查端口、根据pid查服务路径
  3. 从零开始学视觉Transformer (11):目标检测DETR-2
  4. 测试管理_我的敏捷测试
  5. 解决coding上的hexo博客访问不了的问题
  6. 生成器和迭代器,列表推导式
  7. 104协议服务器端,104规约详解.doc
  8. 哔哩哔哩中缓存的视频和音频如何合并
  9. TcpClient类异步接收数据
  10. 59——EXPLORING THE LIMITS OF DATA AUGMENTATION FORRETINAL VESSEL SEGMENTATION
  11. JZOJ1728. Antimonotonicity
  12. 虚幻浏览器插件 播放视频
  13. python爬取图片源码_python爬图源码
  14. 数字接龙 用计算机完成318,微信报名接龙数字如何排列对齐传递
  15. VUE 保证输入框无法输入半角数字以外的字符
  16. CPU 与 GPU 渲染:如何选择及原因?
  17. 王佩丰 Excel 基础24讲 | 学习笔记(全)
  18. 纯前端JS实现一个登记照改换底色背景色功能
  19. 【English】百词斩阅读记事
  20. C#毕业设计——基于C#+asp.net+SQL server的教学网站及网上考试系统设计与实现(毕业论文+程序源码)——教学网站及网上考试系统

热门文章

  1. 取得违约金收入的税务处理
  2. BigDecimal精度丢失问题
  3. 自己动手制作C 语言编译器(7):语句
  4. android:elevation属性,控制View底部渐变阴影
  5. 年终总结没有思路?别怕,这里有一个万能写法
  6. 【EMNLP20 论文笔记】HGN:基于分层图网络的多跳阅读理解模型
  7. elasticsearch安装配置
  8. 电脑系统重装篇2:使用软碟通软件制作U盘系统安装盘(UltraISO)
  9. android学音标软件,英语音标学习助手
  10. 【GAMES101】作业6 加速结构