Как повернуть GameObject вокруг его центра из скрипта? - PullRequest
2 голосов
/ 16 мая 2019

После бесчисленных поисков я не понимаю, как это возможно, в окне редактора 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 Ответ

2 голосов
/ 16 мая 2019

Проблема в том, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...