Unity 3D:角色控制器

我一直在学习Unity 3D的知识已有一段时间了,我总是忘了做某事,我想到一个新项目,我跳了进去,或者我碰到了颠簸而失去了继续前进的动力。

因此,现在我决定做事要有所不同–我将再次学习所有内容,也许会激发一些我已经知道但刚刚忘记的事情。 我会写关于它们的。 也许那会让我走上正轨。

考虑到这一点,这是我为此撰写的许多文章的第一部分。 我将使用Unity 3D物理系统进行简单的多维数据集移动(我知道还有其他方法,但是稍后我打算使用Unity物理系统进行碰撞,所以这似乎很合适)。

首先,我们需要创建一个带有平台和多维数据集的简单场景。 有两种简单的方法可以为我们提供一个简单的平台-平面和立方体。 对于此场景,我将选择一个多维数据集。

伸出立方体,现在称为“地面”

现在,我将添加第二个多维数据集,它将充当我的玩家角色。 为了区分两者,我创建了一种简单的红色材质放在播放器上

现在有一个玩家

现在,我们开始讲究实质:玩家运动,这是本文的重点。 首先,我创建了一个C#脚本。 您可以根据自己的喜好选择名称,但是由于此特定脚本会移动播放器,因此我将其命名为PlayerMotor.cs并将其附加到播放器对象上。 在您最喜欢的编辑器中打开它,将显示以下样板代码:(就我而言,在编写Unity脚本和C#时,我通常在Visual StudioVisual Studio Code之间波动)

 使用System.Collections;使用System.Collections.Generic;使用UnityEngine;公共类PlayerMotor:MonoBehaviour {//用于初始化void Start(){} //每帧调用一次更新void Update(){}} 

这带来了标准的Unity设置:实现MonoBehavior并使用Unity名称空间。 MonoBehavior是此脚本的重要组成部分,因为它允许我们访问Unity Engine特定的事物并控制物理原理。 该脚本还带有两个方法: Start()Update() 。 顾名思义,在游戏开始时(或实例化GameObject时会调用一个,但我们将在以后的文章中进行介绍)。 另一个方法称为每个游戏循环-在这里我们实际上可以使玩家角色(或立方体)四处移动。 不过,有一个小细节,有多种与Update相关的方法,在这种情况下,我将使用FixedUpdate() ,因为它用于Unity Engine中的物理计算。

由于游戏中的移动将基于Unity Engine物理系统,因此我需要使物理系统真正起作用的东西。 称为Rigidbody组件,我们可以简单地将其添加到播放器多维数据集:

注意新的刚体吗?

现在,可以通过使用GetComponent()调用在代码中使用该组件。 这就是Start()方法的用处,因为这使我们可以确保在首次使用Player对象时抓取组件(在Update()调用中进行此调用相当昂贵)。 我将Rigidbody组件对象存储在局部变量中,以备后用。

 使用System.Collections;使用System.Collections.Generic;使用UnityEngine;公共类PlayerMotor:MonoBehaviour {Rigidbody rb; 无效开始(){rb = GetComponent ();  } void FixedUpdate(){}} 

现在,我们可以在收集用户输入以移动Player时开始使用此对象。 有多种方法可以从用户那里获取输入,例如指定键盘键码,使用各种键的别名(例如“ Jump”通常是空格键等),或者,我选择的选项是使用Input.GetAxis("Vertical")直接与游戏轴协同工作Input.GetAxis("Vertical")Input.GetAxis("Horizontal") ,返回值从-1到1,具体取决于所按下的按钮(或操纵杆的移动方式)。 这使我们能够在更改Input.GetKey(...)的速度时使用返回值,并通过省略与Input.GetKey(...)调用的if语句来降低代码的复杂性。

  var vertical = Input.GetAxis(“ Vertical”); var horizo​​ntal = Input.GetAxis(“ Horizo​​ntal”); 

这两个值现在允许我们构造一个新的Vector3值,该值对应于3D中的用户输入。 我们称这个速度。

  Vector3速度= Vector3.zero;速度+ =(transform.forward * Vertical);  //向前移动+ =(transform.right *水平);  //扫射 

要完成此操作,我们需要某种Speed修饰符和一个特殊的参数Time.FixedDeltaTime来标准化各个系统之间的矢量值(因为与Update相关的方法与与最终用户机器相关的帧有关)。 另外,我们通常将向量的y轴值设置为原始的Rigidbody y轴值,因为我们通常不希望直接与之混淆,除非您要实现飞行或类似操作。 然后,我们可以将其添加到我们的原始刚体对象和Voila中! -我们有运动。 最终结果如下所示:

 使用UnityEngine;公共类PlayerMotor:MonoBehaviour { 
公共浮球速度= 200f; 刚体rb;
无效开始(){rb = GetComponent (); } void Update(){var vertical = Input.GetAxis(“ Vertical”); var horizo​​ntal = Input.GetAxis(“ Horizo​​ntal”); Vector3速度= Vector3.zero; 速度+ =(transform.forward * Vertical); //向前移动速度+ =(transform.right *水平); // Strafe速度* =速度* Time.fixedDeltaTime; //帧率和速度调整speed.y = rb.velocity.y; rb.velocity =速度; }}

这就是让您的3D角色(立方体)移动的一切! 最后要注意的是,当前,如果您继续进行,则运动可能看起来很奇怪,并且立方体正在倒塌。 那是因为随着刚体物理学的来临而产生摩擦。 可以使用无摩擦的物理材料将其固定,也可以将立方体的旋转锁定在xz轴上来固定。 我推荐第二个选项,因为这样您以后就可以使用摩擦了(旋转锁可以很容易地在需要时在代码中暂时禁用)

建设愉快!

聚苯乙烯

最终的代码和项目设置可以在我的Gitlab页面上找到,网址为https://gitlab.com/kristapsstrals/medium-unity-blog