上一篇写了数种Unity中的移动方式,有物理移动,有非物理移动等,这篇我们来谈谈Unity中的移动控制方式,来结合上一篇所说的方法,用起来。一般控制是通过获取用户输入来处理角色移动逻辑的,而用户输入的设备有键盘、鼠标、手柄等等,本篇仅介绍最常用的键鼠控制角色移动方式。
目录
前排提醒:本文仅代表个人观点,以供交流学习,若有不同意见请评论留言,笔者一定好好学习,天天向上。
视频讲解:
详解Unity的移动控制实现_BiLiBiLi
本篇使用Translate来演示移动控制,若想使用其他移动方法,更新其移动逻辑即可
在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类中也有专门用于监听轴向的,你可以这么理解:
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);
}
上一节说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]网络.Unity官方API & Unity圣典API
[2]梦天幼.详解Unity的几种移动方式实现
[3]梦天幼.详解Unity中的射线与射线检测
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中