Направление движения объекта глюк в единстве 2d - PullRequest
0 голосов
/ 14 марта 2019

Я создаю игру в Unity 2D.У меня есть Драконы, которых я добавляю на сцену.Предполагается, что драконы могут двигаться только в 1 из 4 направлений: вверх, вниз, влево и вправо.драконы, которые двигаются влево и вправо, движутся точно так, как задуманоОднако у драконов, которые движутся вверх и вниз, есть проблема в том, что они движутся под углом.Все драконы, которые движутся вверх, двигаются вверх и вправо под углом 45 градусов.Все драконы, которые движутся вниз, двигаются вниз и влево под углом 45 градусов.сначала я подумал, что это проблема с аниматором, перемещающим дракона в другое место, но я удалил компонент аниматора из сборного дома, и проблема все еще сохраняется.

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

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

public class DragonMovment : MonoBehaviour {
    public string Direction;    //needs to be set in the prefab

    public float DragonSpeed;   //speed of dragon

    Rigidbody2D rb; 

    public Transform Boundries;

    // Use this for initialization
    void Start ()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void FixedUpdate ()
    {
        float MoveRight = 1;
        float MoveLeft = -1;
        float MoveUp = 1;
        float MoveDown = -1;

        if (Direction== "R")
        {
            rb.velocity = new Vector3(DragonSpeed * MoveRight, rb.velocity.y);
        }
        if (Direction == "L")
        {
            rb.velocity = new Vector3(DragonSpeed * MoveLeft, rb.velocity.y);
        }
        if (Direction == "U")
        {
            rb.velocity = new Vector3(DragonSpeed * MoveUp, rb.velocity.x);
        }
        if (Direction == "D")
        {
            rb.velocity = new Vector3(DragonSpeed * MoveDown, rb.velocity.x);
        }


    }
}

Редактировать.Так почему же работает следующее:

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

public class PlayerControler : MonoBehaviour {
    // speed of movment 
    public float Speed;
    // rb
    Rigidbody2D rb;


    public Transform Boundries;

    // Use this for initialization
    void Start () {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        // get horizontal input
        float MoveSide = Input.GetAxis("Horizontal");
        //get vertical input
        float MoveVert = Input.GetAxis("Vertical");
        // move horizontal
        rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);
        // move vertical 
        rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);
    }
}

, а другой код не работает?

1 Ответ

1 голос
/ 14 марта 2019

У вас есть скорость x в y вектора 3

if (Direction == "U")
{
    rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveUp);
}
if (Direction == "D")
{
    rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveDown);
}

Это работает в вашем скрипте игрока, когда вы переопределяете значения в последующем утверждении.

    float MoveSide = Input.GetAxis("Horizontal"); //eg 1
    float MoveVert = Input.GetAxis("Vertical"); // eg 1

    // setting your x velocity incorrectly to the y (vert) velocity speed and keeping y the same velocity as start of frame
    rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);
    // Set the y to the x value of the statement above so it is now in the correct vector and set the x to the correct hoz velocity
    rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);

// effectively doing 
rb.velocity = new Vector3(Speed * MoveSide, Speed * MoveVert);

Вы также должны использовать MovePosition, поскольку он не влияет напрямую на физический движок (использование скорости может повлиять на столкновения и триггеры и создать неожиданную физику).Ваши игровые объекты должны быть помечены как кинематические, иначе нижеприведенное заставит их мгновенно телепортироваться на новую позицию.

var movementDirection = new Vector3(Speed * MoveSide, Speed * MoveVert);
rb.MovePosition(transform.position + movementDirection * Time.deltaTime);

А * Time.deltaTime гарантирует, что движение согласованно для разных частот кадров.Если вы запустите игру на машине со скоростью 30 кадров в секунду, игровые объекты будут двигаться медленнее, чем со скоростью 60 кадров в секунду.Time.deltaTime вычисляет физическое время, прошедшее с предыдущего кадра, и обеспечивает одинаковое пройденное расстояние независимо от частоты кадров.

например, скажем, gameObject перемещается 1 за обновление кадра.Через секунду на машине со скоростью 30 кадров в секунду объект переместился бы на 30. Через секунду на машине со скоростью 60 кадров в секунду объект переместился бы на 60.

Time.deltaTime=.2s on 30 fps so 1 movement * .2 = move .2 per frame * 30 frames in the second = 60 moved
Time.deltaTime=.1s on 60 fps so 1 movement * .1 = move .1 per frame * 60 frames in the second = 60 moved
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...