Возможно ли целевое преобразование «LookAt» с использованием «RotateAround»? - PullRequest
0 голосов
/ 08 января 2019

У меня есть «Шар», «Направление съемки» и «Центральная цель» в моей сцене. «Shoot Direction» является дочерним объектом игрового объекта «Ball», как показано на рисунке. Я могу вращать «Shoot Direction» вокруг моего «Ball», используя встроенный в Unity метод «RotateAround».

https://imgur.com/a/FifaNOr

То, чего я хочу достичь, это;

  1. Поверните «Shoot Direction» вокруг «Ball», используя встроенный в Unity метод «RotateAround».
  2. Сохраняйте «Shoot Direction», смотря на «Center Target», независимо от положения и поворота «Ball» одновременно.
  3. Не изменять собственное вращение "Шара" при выполнении чисел 1 и 2.

То, что у меня есть в ShootDirection.cs, прикрепленном к игровому объекту «Shoot Direction»:

    void FixedUpdate () {
        if (canRotate && rotationSpeed != 0f) {
            RotateAroundCenter ();
            LookAtCenter ();
        }
    }

    public void SetDistanceFromCenter () {
        //Set distance from the Ball's Vector3.zero
        thisTransform.localPosition = thisTransform.localPosition.normalized * distanceFromCenter;
    }

   public void LookAtCenter () {
        //Look at the Ball's Vector3.zero
        Vector3 dir = Vector3.zero - thisTransform.localPosition;
        float angle = Mathf.Atan2 (dir.y, dir.x) * Mathf.Rad2Deg;
        thisTransform.rotation = Quaternion.AngleAxis (angle + 90, Vector3.forward);
    }

   public void RotateAroundCenter () {
        thisTransform.RotateAround (rotateAroundTransform.position, Vector3.back, rotationSpeed * Time.fixedDeltaTime * rotationDirection);
   }

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Исходя из ответа @ colin-young, я смог достичь желаемого результата.

Ожидаемое и достигнутое поведение можно увидеть здесь

    void FixedUpdate () {
        RotateTowardsTarget (LevelManager.Instance.CurrentLevel.GetPlayer ().centerTarget.transform);
        LookAtCenter ();
    }

    public void LookAtCenter () {
        //Look at the Ball's Vector3.zero
        Vector3 dir = Vector3.zero - thisTransform.localPosition;
        float angle = Mathf.Atan2 (dir.y, dir.x) * Mathf.Rad2Deg;
        thisTransform.rotation = Quaternion.AngleAxis (angle + 90, Vector3.forward);
    }

    public void RotateTowardsTarget (Transform targetTransform) {
        if (targetTransform != null) {
            thisTransform.position = Vector3.MoveTowards (rotateAroundTransform.position, targetTransform.position, distanceFromCenter);
        }
        LookAtCenter ();
    }
0 голосов
/ 08 января 2019

Это должно дать вам вектор distanceToBall от мяча и указывать на centerTarget:

public void LookAtCenter () {
    this.Transform.position = Vector3.MoveTowards(ball, centerTarget, -distanceToBall)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...