C# 在Unity中通过代码创建轴心点

C# 在Unity中通过代码创建轴心点,c#,unity3d,C#,Unity3d,在Unity中创建门脚本时,必须设置轴点。使门成为此轴点的子对象。打开门时,轴点将旋转,门将自动相对于轴点旋转 我知道你可以在编辑器中创建一个空的游戏对象,但我想通过代码来实现 [SerializeField] Vector3 pivotPosition; // the spawn position of the pivot point Transform pivot; void Start() { pivot= new GameObject().transform; //

在Unity中创建门脚本时,必须设置轴点。使门成为此轴点的子对象。打开门时,轴点将旋转,门将自动相对于轴点旋转

我知道你可以在编辑器中创建一个空的游戏对象,但我想通过代码来实现

[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
}
因此,在inspector中,当门旋转(0,0,0)时,这可以很好地工作

旋转门(例如(0,-30,0)时,创建门时未正确放置轴点


如何通过执行
pivot.position=pivotPosition,在门旋转(x,y,z)

的情况下正确创建此枢轴点,并具有正确的位置将轴放置在对象的中心

我在这里看到3种可行的选择:

1-如果要制作门的模型,可以使其中心位于枢轴位置,也可以位于地面上,以帮助定位门的高度

2-在枢轴位置使用带有父对象的门预制件。(实际上可以使用该父级作为轴心,而不是通过脚本创建它)


3-如果门的游戏对象中心位于其中心,并且您无法更改它,则可以手动或使用进行计算。

通过执行
pivot.position=pivotPosition将轴放置在对象的中心

我在这里看到3种可行的选择:

1-如果要制作门的模型,可以使其中心位于枢轴位置,也可以位于地面上,以帮助定位门的高度

2-在枢轴位置使用带有父对象的门预制件。(实际上可以使用该父级作为轴心,而不是通过脚本创建它)


3-如果门的游戏对象中心在其中心,而您无法更改它,则可以手动或使用进行计算。

您可以使用
变换。旋转

范例

using UnityEngine;

public class RotateAround : MonoBehaviour {

    public Transform pivot;
    public float degreesPerSecond;

    void Update () {
        transform.RotateAround(pivot.position, Vector3.up, degreesPerSecond * Time.deltaTime);
    }
}

您可以使用
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);
    }
}

有多种可能的解决方案。以下是我所知道的,按我的偏好顺序排列:

  • 您可以使用
    Transform.RotateAround()
  • 您可以像现在这样使用层次结构来透视它。旋转“枢轴”父对象将获得所需的“围绕枢轴旋转子对象”效果
  • 您可以“手动”计算围绕枢轴的旋转:
    • 方式:
      rotation*(向量-轴)+pivot
    • 其中:
      • 旋转
        =
        表示旋转的四元数
      • (vector-pivot)
        将对象置于“原点”以应用旋转(与使用层次方法的逻辑相同)
      • +pivot
        =旋转完成后,重新应用对象和轴之间的偏移
      • 重要提示:使用
        四元数
        s应用旋转时,
        四元数
        应始终是第一个操作数(不要执行此操作:
        (向量-轴)*旋转
  • 如果要创建三维网格,特别是在建模应用程序中,只需在其中调整轴即可。
    • 好处:在这种情况下,如果您的3D应用程序支持动画(它可能支持),您甚至可以在那里执行打开/关闭动画
  • 无论三维模型的轴如何,都可以使用(Unity)动画

  • 有多种可能的解决方案。以下是我所知道的,按我的偏好顺序排列:

  • 您可以使用
    Transform.RotateAround()
  • 您可以像现在这样使用层次结构来透视它。旋转“枢轴”父对象将获得所需的“围绕枢轴旋转子对象”效果
  • 您可以“手动”计算围绕枢轴的旋转:
    • 方式:
      rotation*(向量-轴)+pivot
    • 其中:
      • 旋转
        =
        表示旋转的四元数
      • (vector-pivot)
        将对象置于“原点”以应用旋转(与使用层次方法的逻辑相同)
      • +pivot
        =旋转完成后,重新应用对象和轴之间的偏移
      • 重要提示:使用
        四元数
        s应用旋转时,
        四元数
        应始终是第一个操作数(不要执行此操作:
        (向量-轴)*旋转
  • 如果要创建三维网格,特别是在建模应用程序中,只需在其中调整轴即可。
    • 好处:在这种情况下,如果您的3D应用程序支持动画(它可能支持),您甚至可以在那里执行打开/关闭动画
  • 无论三维模型的轴如何,都可以使用(Unity)动画