I’m struggling to find a way to store rotation data, and need them to be stored individually and changed individually.

something like

transform.rotation.y

would be useful.

I’m struggling to find a way to store rotation data, and need them to be stored individually and changed individually.

something like

transform.rotation.y

would be useful.

Transform.rotation is a Quaternion…a 4D construct that is not intuitive to use. The reference warns against modifying or using the individual components. You can use transform.eulerAngles, but the values you read will not necessarily be the ones you expect. For example if you set the rotation to (180,0,0), and immediately read it back, you might get (0,180,180). There are multiple eulerAngle representations for any one ‘physical’ representation.

One solution is to maintain your own Vector3 and treat eulerAngles as write-only. If you need a rotation value, you read it from your own Vector3. When you want to change them, change the Vector3 and then assign it to transform.eulerAngles.

The problem is, nothing to do with Unity, thinking in terms of x/y/z rotation just doesn’t work. There are always two ways to spin to the same direction which give contradictory x/y/z’s for it. If x/y/z rotations did work properly, we wouldn’t bother with quaternions.

If you have a physical system, with strict limits, storing your own rotations as floats does work (Vector3 as robertu suggests, or just floats.) For example, a tank turret with a motor for turning and another for elevation, which correspond to y/x rotation.

For applying your own floats, `rotation = Quaternion.Euler(xRot, yRot, zRot)`

works. It applies y, then x as local, then z as local. y/x/z is the most obvious order, and usually what you want, like the tank turret. If you need some other order, can use: `Quaternion.Euler(xRot,0,0) * Quaternion.Euler(0,yRot,0);`