如何通过脚本围绕其旋转GameObject?

时间:2019-05-16 17:13:04

标签: c# unity3d

经过无数次搜索,我不知道如何做到这一点,在Unity编辑器窗口中,这非常简单。

如何旋转世界上任何地方存在的物体,使其完全围绕其自身的中心点旋转?

我不想添加“父”游戏对象,也不必依赖于该对象的MeshRenderer。 (由于命名约定不匹配)

这是我尝试过的最新代码。 (我在此方面获得了最大的成功)

public float deg = 0;
public GameObject go;
public Vector3 center;
public Rigidbody rb;

void Start ()
{
    deg = 0;
    go = this.gameObject;

    rb = go.GetComponent<Rigidbody>();
    center = go.GetComponent<BoxCollider>().center;
}

private void FixedUpdate()
{
    deg += 1f;

    if (deg >= 360f) deg = 0;


    Vector3 cen = go.transform.position; // + center;

    go.transform.RotateAround(cen, Vector3.up, deg);


}

我看到的行为是它绕对象的一角旋转,或者绕中心旋转,但将对象移动到整个屏幕上。在上面的代码修订版中,它绕着拐角旋转。

1 个答案:

答案 0 :(得分:2)

问题是center = go.GetComponent<BoxCollider>().center;为您提供了中心在本地空间中的位置 (中心相对于go的位置和旋转度的位置),但是如果您使用RotateAround,第一个参数需要为在全局空间中(中心相对于原点的位置,不能旋转)。

因此,要解决此问题,我们需要从本地空间转换为全局空间。我们可以使用Transform.TransformPoint来做到这一点:

public float deg = 2f;
public GameObject go;
public Vector3 cenLocal;
public Rigidbody rb;

void Start ()
{
    go = this.gameObject;

    rb = go.GetComponent<Rigidbody>();
    cenLocal = go.GetComponent<BoxCollider>().center; // Center (local space)
}


private void FixedUpdate()
{    
    Vector3 cenGlobal = go.transform.TransformPoint(cenLocal); // Center (global space)

    go.transform.RotateAround(cenGlobal , Vector3.up, deg);
}

顺便说一句,您可能已经知道这一点,但是如果始终go == this.gameObject,则可以使用transform.xyz代替go.transform.xyz。简单地使用transform是引用this.gameObject.transform的更常规的方式。