通过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)时,旋转点在创建时未正确放置。

Pivot Creation

我怎样才能正确地创建这个支点,有一个正确的位置,即使门被(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

有多种可能的解决方案。以下是我所了解的优先顺​​序:

  1. 您可以使用Transform.RotateAround()
  2. 您可以像使用层次结构一样对其进行旋转。旋转“枢轴”父母将产生“围绕枢轴旋转儿童”的预期效果。
  3. 可以计算出左右旋转枢轴 “手动”:
    • 如何:rotation * (vector - pivot) + pivot
    • 其中:
      • rotation = Quaternion代表你的旋转。
      • (vector - pivot)将您的对象放在“原点”以应用旋转(与使用层次结构方法相同的逻辑)。
      • + pivot =重新应用对象和主轴之间的偏移量,旋转之后做它的事情。
      • 重要:使用Quaternion小号应用旋转时,Quaternion应该永远是第一个操作数(做到这一点:(vector - pivot) * rotation)。
  4. 如果要创建一个三维网格,特别是在建模应用程序,你可以简单地调整那里的支点。
    • 奖励:在这种情况下,如果您的3D应用程序支持动画(它可能会),您甚至可以在那里执行打开/关闭动画。
  5. 无论您的3D模型的关键点如何,您都可以使用(Unity)动画。