Как переместить игровой объект в Unity нажатием кнопки пользовательского интерфейса, когда в противном случае мне понадобится функция обновления, чтобы проверить наличие новых входов? - PullRequest
0 голосов
/ 18 января 2019

У меня небольшие проблемы с пониманием следующего. Я работаю над простой игрой, где игрок может перемещать игровой объект, нажимая влево или вправо на клавиатуре. Достаточно просто:

void Update()
{
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.position += Vector3.left * movementSpeed * Time.deltaTime;
    }
    if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.position += Vector3.right * movementSpeed * Time.deltaTime;
    }
    if (Input.GetKey(KeyCode.UpArrow))
    {
        transform.position += Vector3.up * jumpHeight * Time.deltaTime;
    }
    if (Input.GetKey(KeyCode.DownArrow))
    {
        transform.position += Vector3.down * movementSpeed * Time.deltaTime;
    }
}

Однако у меня также есть две кнопки на экране, которые также должны перемещать игрока так же, как и ключевые события. Что я не понимаю, так это то, что мне нужна функция обновления для проверки каждого кадра, если нажата новая кнопка, верно? Итак, теперь у меня есть кнопка и я назначаю ей скрипт, где я могу прикрепить кнопку к определенной функции этого скрипта. Но я не могу просто назначить кнопку новой функции «обновления», которая проверяет различные входы этой кнопки. Как мне заставить кнопку Ui также управлять плеером ПРОСТО, как функция обновления здесь?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Проверьте Снимок экрана сцены . Просто создайте пользовательский интерфейс с EventSystem. Создайте кнопку в вашем пользовательском интерфейсе. Присоедините EventTrigger к вашей кнопке. Теперь создайте два события на вашем EventTrigger: (1) Указатель вниз (вызывается, когда кнопка нажата.) (2) Указатель вверх (вызывается при отпускании кнопки.)

Прикрепите сценарий в конце этого ответа в качестве компонента к вашему игроку или кубу или тому, что вы хотите переместить. Теперь вы можете видеть на скриншоте, что открытый метод MoveCube.MoveLeft get вызывается при каждом нажатии MoveLeftButton. Всякий раз, когда он выпущен, вызывается MoveCube.StopMovingLeft. Шутка о буле, который будет переключаться с ложного на истинный и обратно. Фактическое движение происходит в обновлении, которое по существу следует той же логике, что и предоставленный вами скрипт. Надеюсь, это поможет.

private bool moveLeft, moveRight;

void Start ()
{
    // Get Rigidbody or CC or whatever you use to move your object.
}

void Update ()
{
    if (moveLeft)
    {
        // Move Left
        Debug.Log("Moving Left");
    }
}

public void MoveLeft()
{
    moveLeft = true;
}

public void StopMovingLeft()
{
    moveLeft = false;
}

РЕДАКТИРОВАТЬ: Очень важно - я только что увидел, что вы используете transform.position + = Vector3 для перемещения объекта. У вас будут большие проблемы с точным столкновением, так как ваша функция буквально телепортирует ваш игровой объект на новую позицию. Чтобы избежать плохого столкновения, вы должны использовать Rigidbody.AddForce или, если вы хотите использовать transform, вы можете легко использовать transform.Translate:

Из документов Unity: transform.Translate (Vector3.forward * Time.deltaTime);

РЕДАКТИРОВАТЬ 2: Вот код, который вы запросили в комментарии к этому ответу. Просто скопируйте скрипт, он должен работать нормально.

private bool moveLeft, moveRight;

// Create the rigidbody and the collider
private Rigidbody rb;
private Collider col;

// Create a variable you can change in inspector window for speed
[SerializeField]
private float speed;

void Start ()
{
    // You can either use a CC (Character Controller) or a Rigidbody. Doesn't make that much of a difference.
    // Important thing is, if you use a rigidbody, you will need a collider as well. Collider detect collision
    // but rigidbodies do the actual work with regards to physics. In this case we use rigidbody/collider

    // Get the rigidbody
    // If you are making a 2D game, you should use Rigidbody2D
    // The rigidbody will simulate actual physics. I tested this script, the 
    // rigibody will accelerate and will need time to slow down upon breaking
    // You can change it's mass and stuff
    rb = GetComponent<Rigidbody>();

    // Now in this case we just get any collider. You can be more specific, if you know which collider your gameobjects has
    // e.g. BoxCollider or SphereCollider
    // If you are making a 2D game, you should use Collider2D
    col = GetComponent<Collider>();
}


void Update ()
{
    if (moveLeft)
    {
        // If you make a 2D game, use Vector2
        rb.AddForce(Vector3.left * speed);
    }
}

public void MoveLeft()
{
    moveLeft = true;
}

public void StopMovingLeft()
{
    moveLeft = false;
}
0 голосов
/ 18 января 2019

Вы могли бы сделать что-то вроде этого. В вашем скрипте, прикрепленном к кнопке:

using UnityEngine.EventSystems; // Required when using Event data.

public class ExampleClass : MonoBehaviour, IPointerDownHandler // required interface when using the OnPointerDown method.
{
    bool moveLeft = false;

    // Do this when the mouse is clicked over the selectable object this script is attached to.
    public void OnPointerDown(PointerEventData eventData)
    {
        moveLeft = true;
        Debug.Log(this.gameObject.name + " was clicked.");
    }

    public void OnPointerUp(PointerEventData eventData) 
    {
        moveLeft = false;
        Debug.Log(this.gameObject.name + " was released.");
    }

    void Update() 
    {
        if (moveLeft)
             // Move left code
    }
}

Это довольно тупой пример, но он должен быть хотя бы чем-то, что вы можете расширить.

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