使用C#统一运动的3D运动
#c #visualization

开发游戏时,运动通常是项目开始时实现的主要功能之一。对于使用Unity的开发人员,有多种方法可以通过使用C#编程语言编写的代码来实现此功能。本文将通过显示代码示例简要总结各种方法。

能够通过任何列出的方式有效地实施运动,知道如何使用两个特定的统一类是最重要的:转换和僵化的类别。

转型简介

转换类包含游戏对象的位置,旋转和比例。 Unity可以使用它来操纵和存储游戏对象的位置,旋转和比例。默认情况下,Unity中的所有游戏对象都带有转换组件。

有一些转换类具有的属性和方法,其中一些将在下面讨论。

特性

  • Transform.rotation:存储一个quaternion,Unity可以用来操纵游戏对象的旋转或产生当前旋转。
  • Transform.position:用于获取游戏对象的转换组件的位置并操纵其在3D世界空间中移动对象。
  • Transform.localScale:允许开发人员更改3D世界空间中的游戏对象的大小。
  • Transform.localPosition:返回游戏对象的转换组件相对于其父对象的位置。
  • Transform.forward:返回一个标准化向量,代表3D世界空间中的Z轴。可以更改其值以使游戏对象在z轴上移动,同时也考虑游戏对象的旋转。

公共方法

  • Transform.SetParent():设置转换的父,但与父属性不同,它允许转换保持其本地方向。
  • Transform.Translate():移动游戏对象的转换在指定的方向和距离上。
  • Transform.TransformDirection():将方向(x,y,z)从本地空间转换为世界空间。
  • Transform.Rotate():用于以多种方式旋转游戏对象。产生的旋转是欧拉角,而不是四个角度。
  • Transform.RotateAround():旋转游戏对象的变换组件在固定点上。

有关及其所有属性和方法的转换类别的更多信息,请参见Unity Scripting API reference on Transforms

刚性介绍

添加到游戏对象的刚体组件将其置于Unity的物理引擎的影响下,该引擎模拟了游戏项目中的现实生活。一旦将组件添加到统一的游戏对象中,它就会被重力向下拉。只要存在适当的对撞机组件,它就会对与其他对象的任何碰撞做出反应。刚体类可以使开发人员以看起来真实的方式将力施加到游戏对象上。此外,刚体类具有很多属性和方法,包括以下内容:

特性

  • Rigidbody.drag:设置游戏对象的阻力。
  • Rigidbody.isKinematic:确定游戏对象上附加的刚性体是否受物理影响。
  • Rigidbody.mass:指定刚体组件的质量。
  • Rigidbody.rotation:允许程序员使用Unity的物理引擎获得并设置刚体的旋转。
  • Rigidbody.velocity:代表刚体的速度向量。它用于改变世界空间中刚体位置的变化率。

方法

  • Rigidbody.AddExplosiveForce() 用于应用模拟爆炸的力量。
  • Rigidbody.AddForce():沿指定轴连续施加力。
  • Rigidbody.AddTorque():将扭矩应用于刚体组件。
  • Rigidbody.Sleep():迫使一个刚性体睡觉至少一帧。
  • Rigidbody.MovePosition():使刚性机体移至3D世界空间中的指定位置。

有关刚体及其所有属性和方法的更多信息,请参见Unity Scripting API Reference on Rigidbody

刚性vs。变换

尽管刚体似乎与变换相似,因为它们的某些方法和属性执行相同的功能,但假定它们是相同的功能是错误的。刚体使用内置的统一物理引擎来模拟现实生活中的物理学,并考虑到了游戏对象上的任何对撞机。转换不使用物理引擎;它是游戏对象的位置,大小和旋转的游戏内表示。

编码运动的五种方法

Unity可以使用转换或刚性类别类中的五种方法或属性之一来实现游戏对象的运动。

transform.translate()

正如我们上面学到的那样,此方法将在指定的方向和距离上移动游戏对象的变换。本节将讨论如何在代码块中使用它。

宣言

public void Translate(Vector3 translation);

datatype Vector3的参数翻译指定了游戏对象需要移动的方向。通过将该参数乘以Time.deltaTime,我们将能够在指定方向上随时间沿指定方向实现恒定的变化。请注意,PC的帧速率决定了这次。

使用翻译函数对简单的运动脚本进行编程,让我们开始声明四个变量:速度的浮点,两个浮子以存储控件的垂直和水平运动,以及一个方向的vector3。速度变量调整了游戏对象在游戏世界中移动的速度:

private float speed = 10.0f;
private float horizontalInput;
private float verticalInput;
private Vector3 movedirection;

接下来,我们通过将输入分配给更新方法中的每个变量来初始化说明:

horizontalInput = Input.GetAxis(“Horizontal”);
verticalInput = Input.GetAxis(“Vertical”);

现在,让我们将水平和垂直变量分配给movedirection变量:

movedirection = new Vector3(horizontalInput , 0 ,verticalInput);

我们调用翻译方法并分配参数:

transform.Translate(movedirection * speed * Time.deltaTime);

整个代码块都是如此:

using UnityEngine;
using System.Collections;

public class TestClass : MonoBehaviour
{
private float speed = 10.0f;
private float horizontalInput;
private float verticalInput;
private Vector3 movedirection;

   Void Update()
   {
        horizontalInput = Input.GetAxis(“Horizontal”);
        VerticalInput = Input.GetAxis(“Vertical”);
        movedirection = new Vector3(horizontalInput , 0 ,verticalInput);
        transform.Translate(movedirection * speed * Time.deltaTime);|
   }
}

Save to Pieces

转换。位置

该位置属性用于指定游戏对象在3D世界空间中的位置,并且可以在Unity编辑器和脚本中访问。通过稳步改变该值,我们可以实现运动机械师。

宣言

public Vector3 position;

要在代码中实现此信息,我们将按照Transform.Translate()section的前三个步骤进行操作,然后在Update()Method中添加以下代码:

transform.position += movedirection * speed * Time.deltaTime;

这是整个代码块:

using UnityEngine;
using System.Collections;

public class TestClass : MonoBehaviour
{
private float speed = 10.0f;
private float horizontalInput;
private float verticalInput;
private Vector3 movedirection;

    Void Update()
    {
         horizontalInput = Input.GetAxis(“Horizontal”);
         VerticalInput = Input.GetAxis(“Vertical”);
         movedirection = new Vector3(horizontalInput , 0 ,verticalInput);
         transform.position += movedirection * speed * Time.deltaTime;

    }
}

Save to Pieces

刚性body.addforce()

上一节向我们表明,这种方法使用内置的统一物理引擎将力适用于游戏对象。接下来,我们将通过将输入与此方法集成并调整使用变量施加的力量来实现受控运动。

宣言

public void AddForce(Vector3 force, Force mode mode);

力参数用于指定在该方向上添加的力的方向和量,而力模式决定要施加哪种类型的力。要使用此方法,我们需要从声明和初始化几个变量以及存储rigidbody的变量开始。重要的是要注意,在编写有关rigidbody的任何代码之前,必须首先将rigidbody组件添加到unity编辑器中的游戏对象中:

private float force = 5.0f;
private float horizontalInput;
private float verticalInput;
private Vector3 movedirection;
private Rigidbody objRb;

rigidbody是在类中的Start()方法中初始化的:

Start()
{
     objRb = GetComponent<Rigidbody>();
}

上面的GetComponent<Rigidbody>()代码从附加到的游戏对象中获取了刚体。初始化后,我们将在FixedUpdate()方法中调用AddForce方法:

    void FixedUpdate()
    {
         objRb.AddForce(movedirection * force);
    }

整个代码块看起来像这样:

using UnityEngine;
using System.Collections;

public class TestClass : MonoBehaviour
{

     private float force = 5.0f;
     private float horizontalInput;
     private float verticalInput;
     private Vector3 movedirection;
     private Rigidbody objRb;

     void Start()
     {
          objRb = GetComponent<Rigidbody>();
     }

     void Update()
     {
          horizontalInput = Input.GetAxis(“Horizontal”);
          verticalInput = Input.GetAxis(“Vertical”);
          movedirection = new Vector3(horizontalInput , 0 ,verticalInput);
     }

     void FixedUpdate()
     {
          objRb.AddForce(movedirection * force);
     }
}

Save to Pieces

僵化的车身

此属性代表刚体位置的变化率。它比刚体类中的其他列出的方法具有更快的动作。

就像“刚性”类中的所有其他属性或方法一样,我们必须在项目中使用的游戏对象中添加一个刚体组件。

让我们开始在我们创建的脚本文件中声明以下变量:

  private float horizontalInput;
  private float verticalInput;
  private Vector3 movedirection;
  private Rigidbody objRb;
  public float speed ;

接下来,我们将初始化输入,刚体和移动方向。

  void Start()
  {
       objRb = GetComponent<Rigidbody>();
  }

  void Update()
  {
       horizontalInput = Input.GetAxis(“Horizontal”);
       verticalInput = Input.GetAxis(“Vertical”);
       movedirection = new Vector3(horizontalInput , 0 ,verticalInput);
  }

最后,让我们将以下代码添加到reciedupdate()方法:

objRb.velocity = movedirection * speed;

在Unity编辑器中,我们可以调整脚本完成编译后的速度值。

整个代码块看起来像这样:

using UnityEngine;
using System.Collections;

public class TestClass : MonoBehaviour
{
     private float horizontalInput;
     private float verticalInput;
     private Vector3 movedirection;
     private Rigidbody objRb;
     public float speed ;

     void Start()
     {
          objRb = GetComponent<Rigidbody>();
     }

     void Update()
     {
          horizontalInput = Input.GetAxis(“Horizontal”);
          verticalInput = Input.GetAxis(“Vertical”);
          movedirection = new Vector3(horizontalInput , 0 ,verticalInput);
     }
     void FixedUpdate()
     {
          objRb.velocity = movedirection * speed;
     }
}

Save to Pieces

刚体。MovePosition()

统一运动的另一种方法是使用此方法调用。它将运动学刚性机体移动到指定位置,考虑插值,从而在帧之间形成平稳的过渡。

宣言

public void MovePosition(Vector3 position);

位置参数为刚体对象提供了新的位置。为了说明这种编码运动的替代方法,让我们查看下面的一个快速示例:

using UnityEngine;
using System.Collections;

public class TestClass : MonoBehaviour
{
     Vector3 movedirection;
     float horizontalInput;
     float verticalInput;
     Rigidbody m_Rigidbody;
     public float speed = 5f ;

     void Start()
     {
          objRb = GetComponent<Rigidbody>();
     }

     void FixedUpdate()
     {
          horizontalInput = Input.GetAxis(“Horizontal”);
          verticalInput = Input.GetAxis(“Vertical”);
          movedirection = new Vector3(horizontalInput , 0 ,verticalInput);
          m_Rigidbody.MovePosition(transform.position + movedirection * Time.deltaTime * speed);
     }
}

Save to Pieces

结论

本文泄露了几种与C#团结的运动机械师编码的方法。但是请记住,一个不一定要优于另一个。这完全取决于您想实现的运动类型,以及您是否希望将Unity的内置物理引擎用于互动或具有自定义物理系统。