通过Unity中的代码创建枢轴点
问题描述:
在Unity中创建门脚本时,必须设置枢轴点。你让这扇门成为这个枢轴点的小孩。打开门时,枢轴点会旋转,门会自动相对旋转。通过Unity中的代码创建枢轴点
我知道你可以在编辑器中创建一个空的GameObject,但我想通过代码来完成。
[SerializeField]
Vector3 pivotPosition; // the spawn position of the pivot point
Transform pivot;
void Start()
{
pivot= new GameObject().transform; // create the pivot point
pivot.position = pivotPosition; // position the pivot point
transform.SetParent(pivot); // parenting
}
所以这工作正常,当在检查员有一个门旋转(0,0,0)。
例如,当旋转门(0,-30,0)时,旋转点在创建时未正确放置。
我怎样才能正确地创建这个支点,有一个正确的位置,即使门被(X,Y,Z)
答
旋转,通过这样做pivot.position = pivotPosition;
要放置枢轴在你的对象的中心。
我在这里看到3周可行的方案:
- 如果你正在门的模型,你可以把它的中心是在枢轴的位置也是在地面上,以帮助定位门的高度。
- 在枢轴的位置上使用具有父对象的门预制件。 (实际上可以使用,父为支点而不是通过脚本创建它的)
- 如果门的游戏对象中心在它的中心,你不能改变它,你可以手动或使用MeshRenderer.bounds计算。
答
你可以使用Transform.RotateAround
例
using UnityEngine;
public class RotateAround : MonoBehaviour {
public Transform pivot;
public float degreesPerSecond;
void Update() {
transform.RotateAround(pivot.position, Vector3.up, degreesPerSecond * Time.deltaTime);
}
}
https://docs.unity3d.com/ScriptReference/Transform.RotateAround.html
答
有多种可能的解决方案。以下是我所了解的优先顺序:
- 您可以使用
Transform.RotateAround()
。 - 您可以像使用层次结构一样对其进行旋转。旋转“枢轴”父母将产生“围绕枢轴旋转儿童”的预期效果。
- 可以计算出左右旋转枢轴 “手动”:
- 如何:
rotation * (vector - pivot) + pivot
- 其中:
-
rotation
=Quaternion
代表你的旋转。 -
(vector - pivot)
将您的对象放在“原点”以应用旋转(与使用层次结构方法相同的逻辑)。 -
+ pivot
=重新应用对象和主轴之间的偏移量,旋转之后做它的事情。 -
重要:使用
Quaternion
小号应用旋转时,Quaternion
应该永远是第一个操作数(不做到这一点:(vector - pivot) * rotation
)。
-
- 如何:
- 如果要创建一个三维网格,特别是在建模应用程序,你可以简单地调整那里的支点。
- 奖励:在这种情况下,如果您的3D应用程序支持动画(它可能会),您甚至可以在那里执行打开/关闭动画。
- 无论您的3D模型的关键点如何,您都可以使用(Unity)动画。