在上一篇文章中我使用了MessagePack For C#在Unity中实现了场景的保存和加载,其中存储了物体的Transform信息。
这里其实有2个坑需要说一说
1.Transform中的Position,Rotation,Scale三个属性其实都是结构体类型的,也就是
IObj.transform.position = 10; 这样赋值是错误的
IObj.transform.position = new Vector3(0,0,0); 这样赋值才是正确的
Position和Scale使用New一个Vector3的形式赋值就行,但是Rotation却是不行
2.IObj.transform.rotation 其实是一个四元数,什么是四元数?简单解释就是4个数来表示物体的旋转
IObj.transform.rotation = new Quaternion(0,0,0,0); 所以说需要这样赋值
那你可能会问,明明图上面显示的是3个数字,怎么又冒出了第四个数?
其实上面的Rotaiton属性框里面的3个数是四元数转换成欧拉角的表示形式。
简单理解就是,欧拉角的表示方便观察,四元数的形式方便计算
那到底要怎么获取物体的Rotation以欧拉角表示的这三个数呢,很简单
gameObject.transform.rotation.eulerAngles.x;
gameObject.transform.rotation.eulerAngles.y;
gameObject.transform.rotation.eulerAngles.z;
eulerAngle就是欧拉角的英文。
那获取了之后要怎么赋值给物体呢?
因为rotaiton是一个四元数,那就是说必须要四个数了,但是我们才获得了三个数啊,这样就好了:
IObj.transform.rotation = Quaternion.Euler(new Vector3(itemData.rotation_x[i], itemData.rotation_y[i], itemData.rotation_z[i]));
使用Quaternion.Euler()方法把前面获取到的代表物体的旋转的Vector3类型的欧拉角转换成四元数就OK了。
可能又有小伙伴要问,rotation本来就是四元数,那我直接获取物体的这个四元数,然后就可以赋值了,根本不需要转换啊,就像这样:
gameObject.transform.rotation.x;
gameObject.transform.rotation.y;
gameObject.transform.rotation.z;
gameObject.transform.rotation.w;
很遗憾,四元数确实可以获取,也确实可以赋值,但是会发生角度错乱。这里博主也还没有深入了解为什么,只是觉得可能是局部坐标和世界坐标的原因。如果有知道的小伙伴可以在下面留言。
放一个链接,对四元数和欧拉角的测试:https://blog.csdn.net/tianhunyishui/article/details/89372526