Moving Objects in Unity: Unterschied zwischen den Versionen

Aus hyperdramatik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(6 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Unity : How to move a GameObject in 3D space?'''
== Unity : How to move a GameObject in 3D space? ==


There are different ways to move an object within 3D space with code. Here we go over 5 options:
There are different ways to move an object within 3D space with code. Here we go over 5 options:
   
   
[[A) transform.position]]
=== A) - Transform.position ===
'''Transform:''' a Class which contains the information of position, rotation and scale of an object. 


[[B) transform.Translate]]
'''transform.position:''' The position property of a GameObject's Transform. Assigns the object a new position.


[[C) RigidBody.AddForce]]
'''Vector:''' A Class refering to a mathematical entity commonly drewn as an arrow in two or three dimensional space, which has a a magnitude (size or length) and a direction (angle θ).  


[[D) RigidBody.MovePosition]]
'''Vector3:''' is a Unity C# struct with given x, y & z components, representing points and vectors in 3D space. In other words, a group of Vectors.  


[[E) RigidBody.Velocity]]
example 1)
private void Update()
    {
        transform.position += transform.forward * Time.deltaTime;
    }


'''E) RigidBody.Velocity'''
* the “f” is there to state that the variable 0.01 is of type float.
 
example 2)
    void Update()
    {
      transform.position += new Vector3(0, 0, 0.01f);
    }
 
*Vector3.forward is the unit vector defined by (0, 0, 1)
*Time.deltaTime is a variable used so velocity is consistent across different frame  rates.
 
===B) transform.Translate===
 
Similar to transform.position, but instead of assigning the GameObject a new position, it gives the GameObject an amount to move, data contained in a Vector3 struct.
 
  private void Update()
    {
        transform.Translate(Vector3.forward * Time.deltaTime);
 
===C) RigidBody.AddForce===
 
'''RigidBody:''' Adding a Rigidbody component to a GameObject will put its motion under the control of Unity's physics engine, which is a long list of physical properties such as acceleration, mass, gravity, inertia, etc, as well as the capacity to react to other rigid bodies (for instance, collide).
 
'''RigidBody.AddForce:''' Adds a force vector to the class Rigidbody. Force can be applied only to an active Rigidbody. If a GameObject is inactive, AddForce has no effect. Specifying the ForceMode mode allows the type of force to be changed to an Acceleration, Impulse or Velocity Change.
 
public class RigidBodyAddForce : MonoBehaviour
{
    public float forceMult = 200; //velocity float multiplier
    private Rigidbody rb; //declarate Class Rigidbody
    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }
    private void Update()
    {
        rb.AddForce(transform.up * forceMult * Time.deltaTime);
    }
}
* The effect of the float forceMult (multiplier) over the RigidBody’s  velocity  is acceleration, it´s adding force every frame. A divider would be deceleration (transform.up / forceDiv).
* GameObject is activated in private void Awake();
* transform.up  is the unit vector defined by (0, 0, 1).
 
===D) RigidBody.MovePosition===
Similar to transform.position but applied to a RigidBody, it sets the new position of the GameObject. Recommended to use with kinematic rigid bodies. When a RigidBody is marked as Kinematic, it will not be affected by collisions, forces, or any other part of Unity´s phisics engine.
 
public class RigidBodyMovePosition : MonoBehaviour
{
  public float forceMult = 100;
    private Rigidbody rb;
    private void Awake()
   
        {
            rb = GetComponent<Rigidbody>();
        } 
    private void Update()
    {
        rb.MovePosition(transform.position + (transform.forward * Time.deltaTime));
    }
}
 
 
===E) RigidBody.Velocity===


The velocity vector of the rigidbody. It represents the rate of change of the Rigidbody position.
The velocity vector of the rigidbody. It represents the rate of change of the Rigidbody position.

Aktuelle Version vom 2. März 2021, 09:20 Uhr

Unity : How to move a GameObject in 3D space?

There are different ways to move an object within 3D space with code. Here we go over 5 options:

A) - Transform.position

Transform: a Class which contains the information of position, rotation and scale of an object.

transform.position: The position property of a GameObject's Transform. Assigns the object a new position.

Vector: A Class refering to a mathematical entity commonly drewn as an arrow in two or three dimensional space, which has a a magnitude (size or length) and a direction (angle θ).

Vector3: is a Unity C# struct with given x, y & z components, representing points and vectors in 3D space. In other words, a group of Vectors.

example 1)

private void Update()
   {
       transform.position += transform.forward * Time.deltaTime; 
   }
  • the “f” is there to state that the variable 0.01 is of type float.

example 2)

    void Update()
   {
     transform.position += new Vector3(0, 0, 0.01f);
   }
  • Vector3.forward is the unit vector defined by (0, 0, 1)
  • Time.deltaTime is a variable used so velocity is consistent across different frame rates.

B) transform.Translate

Similar to transform.position, but instead of assigning the GameObject a new position, it gives the GameObject an amount to move, data contained in a Vector3 struct.

  private void Update()
   {
       transform.Translate(Vector3.forward * Time.deltaTime);

C) RigidBody.AddForce

RigidBody: Adding a Rigidbody component to a GameObject will put its motion under the control of Unity's physics engine, which is a long list of physical properties such as acceleration, mass, gravity, inertia, etc, as well as the capacity to react to other rigid bodies (for instance, collide).

RigidBody.AddForce: Adds a force vector to the class Rigidbody. Force can be applied only to an active Rigidbody. If a GameObject is inactive, AddForce has no effect. Specifying the ForceMode mode allows the type of force to be changed to an Acceleration, Impulse or Velocity Change.

public class RigidBodyAddForce : MonoBehaviour
{
   public float forceMult = 200; //velocity float multiplier
   private Rigidbody rb; //declarate Class Rigidbody

   private void Awake()
   {
       rb = GetComponent<Rigidbody>();
   }

   private void Update()
   {
       rb.AddForce(transform.up * forceMult * Time.deltaTime);
   }
}
  • The effect of the float forceMult (multiplier) over the RigidBody’s velocity is acceleration, it´s adding force every frame. A divider would be deceleration (transform.up / forceDiv).
  • GameObject is activated in private void Awake();
  • transform.up is the unit vector defined by (0, 0, 1).

D) RigidBody.MovePosition

Similar to transform.position but applied to a RigidBody, it sets the new position of the GameObject. Recommended to use with kinematic rigid bodies. When a RigidBody is marked as Kinematic, it will not be affected by collisions, forces, or any other part of Unity´s phisics engine.

public class RigidBodyMovePosition : MonoBehaviour
{ 
  public float forceMult = 100;
   private Rigidbody rb;

   private void Awake()
    
       {
           rb = GetComponent<Rigidbody>();
       }  
   private void Update()
   {
       rb.MovePosition(transform.position + (transform.forward * Time.deltaTime));
   }
}


E) RigidBody.Velocity

The velocity vector of the rigidbody. It represents the rate of change of the Rigidbody position.

public class RigidBodySetVelocity : MonoBehaviour
{
   public float forceMult = 200;
   private Rigidbody rb;

   private void Awake()
   {
       rb = GetComponent<Rigidbody>();
   }

   // Update is called once per frame
   private void Update()
   {
       rb.velocity = transform.forward * Time.deltaTime * forceMult;
   }