C# - Вращение и передвижение объекта в Unity3d

455
14 апреля 2017, 19:00

Есть код вращения:

using UnityEngine;
public class CubeFloat : MonoBehaviour
{
    public float speed, tilt;
    private Vector3 target = new Vector3(0, 1.39f, 0);
    void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * speed);
        if (transform.position == target && target.y != 0.1f)
            target.y = 0.1f;
        else if (transform.position == target && target.y == 0.1f)
            target.y = 1.39f;
        transform.Rotate(Vector3.up * tilt);
    }
}

Ожидаемый результат: вращение объекта только по оси Y и не делать смещения по Z.

Фактический результат:

...

UPD: Вращение во круг своей оси работает, необходимо двигать только по Y. Движение ограничено, то есть, когда position.Y дошло до определенного значения, оно должно изменить направление. Предполагается, что кубик должен вращаться вверх-вниз.

Answer 1

У меня есть следующие предположения:

У тебя обьект, видимо, находится в другом обьекте. И как следствие -- используются локальные оси вместо глобальных. Или же ты в коде намадрил(влом разбиратся, все равно не похоже на толковое решение)

....

Сделай просто смену угла через задавание нового Rotation. Все.

На вскидку код будет что-то вроде:

var oldRot =  transform.position.Rotation;
transform.position.Rotation = new Quanterion(oldRot.x, oldRot.y + Time.deltaTime * speed, oldRot.z, oldRot.w)

не проверял и юнити запускал давно, но должно заработать, думаю.

Или же сделай что-то вроде:

public class ExampleClass : MonoBehaviour {
    public Transform target;
    public float speed;
    void Update() {
        Vector3 targetDir = target.position - transform.position;
        float step = speed * Time.deltaTime;
        Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0F);
    }
}

код взял с https://docs.unity3d.com/ScriptReference/Vector3.RotateTowards.html

Answer 2

Логика должна быть какой-то такой

using UnityEngine;
public class CubeRotation : MonoBehaviour
{
    public float rotationSpeed = 6.5f, moveSpeed = 8f, range = 10f;
    Vector3 startPosition;
    Transform cube;
    void Start()
    {
        cube = GameObject.GetComponent<Transform>(); // получаем ссылку на компонент Trnasform
        startPosition = cube.position; // запоминаем стартовые координаты
    }
    void Update()
    {
        cube.Rotate(Vector3.up * rotationSpeed * Time.deltaTime); // вращаем куб вокруг своей оси
        if (cube.position.y == startPosition.y)
        {
            // двигаем куб вверх, если он только начал двигаться
            cube.Translate(Vector3.up * Time.deltaTime * moveSpeed);
        }
        if (cube.position.y > startPosition.y || cube.position.y == startPosition.y - range)
        {
            while (cube.position != startPosition.y + range)
            // двигаем куб вверх, пока он не достиг предела от начального положения до + range
            Translate(Vector3.up * Time.deltaTime * moveSpeed);
        }
        else if (cube.position.y < startPosition.y || cube.position.y == startPosition.y + range)
        {
            // двигаем куб вниз, пока он не достиг предела от начального положения до - range
            while (cube.position != startPosition.y - range)
            {
                Translate(Vector3.down * Time.deltaTime * moveSpeed);
            }
        }
    }
}
READ ALSO
Отследить изменение свойств объекта

Отследить изменение свойств объекта

Есть коллекция вида ObservableCollection<BaseClass> Project {get;set;}

229
Скрыть panel если курсор за ее пределами

Скрыть panel если курсор за ее пределами

Panel1 открывается по нажатию на buttonНужно чтобы panel1 скрылась когда курсор выходит за ее границы

213
С# WinForms. Обновить данные в форме

С# WinForms. Обновить данные в форме

Имеется 2 формы, form1 - картинки с названиями велосипедов, форма AddBicycle - для добавления нового велосипеда в магазинПроблема заключается в том,...

288