Why does the FreezeRotation constraint still allow the rotation to be modified?
I have a very basic script attached to a cube in my scene.
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody))]
public class NewBehaviourScript : MonoBehaviour
{
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
rb.useGravity = false;
rb.constraints = RigidbodyConstraints.FreezeAll;
}
void FixedUpdate()
{
Quaternion deltaRotation = Quaternion.Euler(Vector3.up * 20f * Time.fixedDeltaTime);
rb.MoveRotation(rb.rotation * deltaRotation);
Vector3 deltaPosition = transform.TransformDirection(Vector3.up * 20f) * Time.fixedDeltaTime;
rb.MovePosition(rb.position + deltaPosition);
}
}
The cube is visibly rotated each time FixedUpdate
is called, however it's position is not updated until the constraints are removed.
Why does FreezeRotation
allow updates while rotation constraints are enabled, but FreezePosition
really does prevent position updates?
I tried with both direct assignment to rotation and position properties, and using MoveRotation
and MovePosition
methods.
I'm still on day 0 of playing with Unity, so forgive me if there's an obvious explaination. I can't find it!
I'm pretty sure that the Freeze options only concern "behind the scenes" movement and rotation of the RigidBody object, done by the Physics simulation engine. Directly affecting position and rotation ignores such constraints.
@Cherno hence the question, it's inconsistent. After freezing everything, the rotation can be directly manipulated but the movement cannot. I just wondered if there was a specific reason why.
$$anonymous$$ight not be 100% correct, but rotations are stored as Quaternions, position is not. $$anonymous$$aybe that could be the reason
Answer by Owen-Reynolds · May 02, 2016 at 09:30 PM
Because the rule is always if you don't want your script to change something, then write your script that way. You never have or need a special command to lock a script variable. It would seem bizarre to programmers if a Unity command ever did that.
In other words, you need a special command to freeze physics-based rotation. But everyone knows you never need a special command to lock transform.rotation. You can just write if(myNoSpinVar==false) // change rotate here
. Or write a small rotation class with a lock() function you write yourself.
Another way of thinking of it -- what if you need to freeze physics-based rotation, but want to rotate in code? It's better to have freezing only affect physics-based.
Your answer
Follow this Question
Related Questions
How do i use the MathF.Clamp Function correctly? 1 Answer
Record and replay movement 0 Answers
moving an object continuously between waypoints 0 Answers