Moving Objects in Unity: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
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. | '''Transform:''' a Class which contains the information of position, rotation and scale of an object. | ||
Zeile 28: | Zeile 28: | ||
*Vector3.forward is the unit vector defined by (0, 0, 1) | *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. | *Time.deltaTime is a variable used so velocity is consistent across different frame rates. | ||
===B) transform.Translate=== | ===B) transform.Translate=== | ||
Zeile 63: | Zeile 62: | ||
* transform.up is the unit vector defined by (0, 0, 1). | * 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; | |||
} |
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; }