Unity 3D - вращающийся игровой объект без вращающейся оси - PullRequest
0 голосов
/ 21 ноября 2018

Надеюсь, мой заголовок обобщает мою проблему.У меня есть ракета в 2d игре, которая движется только горизонтально по экрану.Я хочу, чтобы он вращался в направлении пальца игрока (направление движения), но не могу найти способ повернуть объект, не поворачивая всю ось, по которой он движется.Мне просто нужно, чтобы он казался повернутым, но он должен продолжать двигаться вдоль оси х.Как я могу пойти по этому поводу?

void Start () {
    //scoreT = GetComponent<TextMeshProUGUI> ();
    gameSpeed = 1;
    score = 0;
    Rigidbody2D rb2d = GetComponent<Rigidbody2D> ();
}

// Update is called once per frame
void Update () {
    float MoveHorizontal = Input.GetAxis ("Horizontal");
    Vector2 Movement = new Vector2 (MoveHorizontal, 0.0f);

    rb2d.rotation = Quaternion.Euler (0.0f, 0, 0f, rb2d.velocity.x * -tilt);
    transform.Translate (MoveHorizontal * speed, 0, 0);

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Одна вещь, которую вы можете сделать, это изменить rigidbody.rotation вашей ракеты, чтобы она наклонялась, когда она движется, в одном направлении или в другом.Например:

float tilt - 0.3f;
//In case you prefer the rotation in another axis you just need to modify the position of the rigidbody.velocity.x * -tilt
rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);

Поскольку вы не добавили никакого кода, я не уверен, как вы двигаете свою ракету, поэтому я опубликую общий код, который вам нужно будет адаптировать в зависимости от вашего собственного проекта:

public class PlayerController : MonoBehaviour
{
    public float speed;
    //The tild factor
    public float tilt;
    //The limit within the spaceship can move
    public Boundary boundary;

    void FixedUpdate ()
    {
        //You will need to capture the screen touchs of the user for the inputs
        float moveHorizontal = Input.GetAxis ("Horizontal");
        float moveVertical = Input.GetAxis ("Vertical");

        //Applying the movement to the GameObject
        Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
        rigidbody.velocity = movement * speed;

        //To ensure the GameObject doesnt move outside of the game boundary
        rigidbody.position = new Vector3 
        (
            Mathf.Clamp (rigidbody.position.x, boundary.xMin, boundary.xMax), 
            0.0f, 
            Mathf.Clamp (rigidbody.position.z, boundary.zMin, boundary.zMax)
        );

        //Here is where you apply the rotation 
        rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
    }
}

Кроме того, вы играете в космическую 2D-игру, вам может быть интересно проверить этот урок:

https://unity3d.com/learn/tutorials/s/space-shooter-tutorial

0 голосов
/ 21 ноября 2018

Вы должны перемещать свой объект относительно мира и вращаться локально.Поэтому используйте Transform.position для перемещения вашего объекта и Transform.LocalRotation для его поворота.

Или вы можете поместить часть, которая должна вращаться, как дочерние элементы объекта, который переводится, и повернуть дочерние элементы.

0 голосов
/ 21 ноября 2018

Вы можете сделать спрайт / рендерер дочерним по отношению к GameObject, который является вашей ракетой.Затем вы можете свободно вращать спрайт / рендерер без изменения поворота, перемещаемого родительским GameObject.

Это хакерское решение, но оно достигает желаемого результата.

0 голосов
/ 21 ноября 2018

То, что вы хотите, это переместить ваш объект в глобальном / мировом пространстве.Как кажется, движение вашей ракеты в настоящее время происходит в локальном пространстве.Поэтому, когда вы вращаете ракету, ее локальные координаты также вращаются.Мировые космические координаты фиксированы и никогда не будут вращаться, когда вы меняете ракету. Здесь является еще одним объяснением этого.

Вы также можете взглянуть на Transform.localPosition и Transform.position и посмотреть, как ваша ракетаведет себя при использовании одного или другого.

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