Вращение дочернего игрового объекта относительно непосредственного родителя - PullRequest
0 голосов
/ 06 февраля 2020

enter image description here

Привет всем, я пытаюсь повернуть дочерний игровой объект относительно другого дочернего игрового объекта. Например, как показано в этой иерархии ниже, я пытаюсь повернуть PA_DroneBladeLeft (и PA_DroneBladeRight) относительно их непосредственных родителей PA_DroneWingLeft (и PA_DroneWingRight) соответственно. Я хочу, чтобы эти лезвия вращались на месте. Вместо этого я заставляю их вращаться глобально в направлении y относительно основного родителя (Air Drone). Я думаю, что строка в методе Обновления, которую я закомментировал, должна была работать, и она работала, но она все еще вращалась относительно Air Drone, а не на месте. Вторая строка, метод RotateAround. Я попытался создать пустой игровой объект с именем Left Pivot и поместить его примерно в центр левого крыла, чтобы левое лезвие вращалось вокруг него, но это было бесполезно.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LeftBladeRotation : MonoBehaviour
{
  GameObject leftBlade;
  private float speed;
  private float angle;
  GameObject leftPivot;

// Start is called before the first frame update
void Start()
{
    speed = 10f;
    leftBlade = transform.Find("PA_DroneBladeLeft").gameObject;
    angle = 0f;
    leftPivot = GameObject.FindGameObjectWithTag("Air Drone").transform.Find("PA_Drone").transform.Find("PA_DroneWingLeft").transform.Find("Left Pivot").gameObject;
}

// Update is called once per frame
void Update()
{
    angle += speed * Time.deltaTime;
    Quaternion rotation = Quaternion.Euler(new Vector3(0f, angle, 0f));

    //leftBlade.transform.localRotation = rotation;
    leftBlade.transform.RotateAround(leftPivot.transform.localPosition, Vector3.up, angle);

}

}

1 Ответ

0 голосов
/ 07 февраля 2020

Это ваш скрипт с небольшими изменениями. Это на самом деле работает, когда я прикрепил его к лезвию gameObject.

using UnityEngine;

public class BladeRotate : MonoBehaviour
{
    private float _speed;
    private float _angle;

    private void Start()
    {
        _speed = 400f;
        _angle = 0f;
    }

    private void Update()
    {
        _angle += _speed * Time.deltaTime;
        var rotation = Quaternion.Euler(new Vector3(0f, _angle, 0f));
        transform.localRotation = rotation;
    }
}

Вторая строка не работает, потому что вы вращаете лезвие вокруг глобальной оси y на Vector3.up

Вот альтернатива. Прикрепите следующий скрипт к своим лезвиям.

using UnityEngine;

public class BladeRotate : MonoBehaviour
{
    [SerializeField] private int speed = 400;
    private Transform _transform;

    private void Start()
    {
        _transform = transform;
    }

    private void Update()
    {
        transform.RotateAround(_transform.position, _transform.up, speed * Time.deltaTime);
    }
}
...