Вращение в Unity3D - PullRequest
       23

Вращение в Unity3D

3 голосов
/ 17 февраля 2012

Это упрощенный код из того, что я пытаюсь сделать:

var angle = 1.57;
if ( this.transform.rotation.y > angle ){
  this.transform.rotation.y--;
} else if ( this.transform.rotation.y < angle ){
  this.transform.rotation.y++;
}

Я привык кодировать в AS3, и если я делаю это во флэш-памяти, он отлично работает, хотя в Unity3Dэто не так, и мне трудно понять, почему или как я могу получить этот эффект.

Кто-нибудь может мне помочь?Спасибо!

edit:

мой объект - автомобиль с твердым телом с двумя капсульными коллайдерами, едущий по «ухабистому» полу, и в какой-то момент он просто теряет точность направления, и я думаю, что это из-заэто иерархическая система вращения.

(спасибо kay за подсказку transform.eulerAngles)

Ответы [ 7 ]

11 голосов
/ 17 февраля 2012

transform.rotation возвращает кватернион . Попробуйте transform.rotation.eulerAngles.y вместо.

3 голосов
/ 11 мая 2012

Transform Rotation используется для установки угла, а не для поворота объекта, поэтому вам нужно получить вращение, добавить изменения и затем установить новое вращение.

Попробуйте вместо этого использовать transform.rotate.

Проверьте ссылку на сценарий Unity3d здесь: http://unity3d.com/support/documentation/ScriptReference/Transform.Rotate.html

1 голос
/ 03 августа 2012

Я вижу две проблемы до сих пор.Сначала иерархическая ротация Единства.Основываясь на том, чего вы пытаетесь достичь, вы должны манипулировать либо

transform.localEulerAngles
or
transform.eulerAngles

Во-вторых, вы не можете изменять углы Эйлера таким образом, поскольку все векторы передаются по значению:

transform.localEulerAngles.y--;

Вы должны сделать это следующим образом:

Vector3 rotation = transform.localEulerAngles;
rotation.y--;
transform.localEulerAngles = rotation;
0 голосов
/ 12 сентября 2014

Вот мой скрипт для поворота GameObject с помощью касания

//
//  RotateController.cs
//
//  Created by Ramdhan Choudhary on 12/05/13.
//

using UnityEngine;
using System;

public class RotateController
{

        private float RotationSpeed = 9.5f;
        private const float mFingerDistanceEpsilon = 1.0f;
        public float MinDist = 2.0f;
        public float MaxDist = 50.0f;
        private Transform mMoveObject = null;
        private bool isEnabledMoving = false;


        //************** Rotation Controller Constructor **************//
        public RotateController (Transform goMove)
        {
                isEnabledMoving = true;
                mMoveObject = goMove;
                if (mMoveObject == null) {
                        Debug.LogWarning ("Error! Cannot find object!");
                        return;
                }
        }

        //************** Handle Object Rotation **************//
        public void Update ()
        {
                if (!isEnabledMoving && mMoveObject != null) {
                        return;
                }

                Vector3 camDir = Camera.main.transform.forward;
                Vector3 camLeft = Vector3.Cross (camDir, Vector3.down);

                // rotate
                if (Input.touchCount == 1) {
                        mMoveObject.Rotate (camLeft, Input.touches [0].deltaPosition.y * RotationSpeed * Time.deltaTime, Space.World);
                        mMoveObject.Rotate (Vector3.down, Input.touches [0].deltaPosition.x * RotationSpeed * Time.deltaTime, Space.Self);
                }


        }
}
0 голосов
/ 12 августа 2013

Вы должны попробовать умножить свой коэффициент вращения на Time.deltaTime

Надеюсь, что это поможет

Peace

0 голосов
/ 22 июня 2012

Приведенное выше предложение использовать transform.Rotate () - это, вероятно, то, что вам нужно сделать, чтобы фактически заставить его вращаться, НО переменными transform.Rotate () являются скорость / скорость, а не направление, поэтому выполняйте преобразование.Rotate () должен будет использовать более одной оси, если вы хотите вращение под углом.Пример:

class Unity // Example is in C#
{
    void Update( )
    {
        gameObject.transform.Rotate(0, 1, 0);
    }
}

Это будет вращать объект вокруг его оси Y со скоростью 1.

Дайте мне знать, если это помогает - и если это мешает, я могу объяснить это по-другому.

0 голосов
/ 17 июня 2012

Вам необходимо создать новый объект Quaternion

transform.rotation = Quaternion.Euler (transform.rotation.x, transform.rotation.y ++, transform.rotation.z);

Вы также можете использовать функцию transform.Rotate.

...