Перемещение игрового объекта с помощью кнопок пользовательского интерфейса - PullRequest
2 голосов
/ 04 ноября 2019

Я пытаюсь настроить управление игровым объектом Player с помощью кнопок пользовательского интерфейса. 2d вид сверху вниз.

Я хочу плавно переместить объект Player на фиксированное расстояние (0,8 для Axix X для направления влево-вправо и 2,4 для вверх-вниз), когда я отпускаю интерфейс влево / вправо / вверх / внизКнопки.

Здесь я нашел код для плавного движения, но там игрок движется все время, пока нажата кнопка пользовательского интерфейса.

Можете ли вы помочь мне заставить ее двигаться вверх (указатель вверх)и для перемещения на public x= 0.8f влево / вправо и public y = 2.4f для вверх / вниз

И в то же время я хочу использовать разную скорость (peblic) для движений по осям x и y

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class PlayerControl : MonoBehaviour
{

    float movX;
    float movY;
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        movX = CrossPlatformInputManager.GetAxisRaw("Horizontal");
        movY = CrossPlatformInputManager.GetAxisRaw("Vertical");

          rb.velocity = new Vector2(movX * 1, movY * 1);

    }
}

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Этот скрипт можно перемещать клавишами WASD. Это должно переместить ваш gameObject на запрошенную сумму за x промежуток времени (скорость). В настоящее время его можно перемещать, только когда он достиг своего описания, но вы можете легко изменить это :), остановив сопрограмму

using System.Collections;
using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    // We gonna move by WASD keys

    [Header("Speed & Movement settings")]
    [SerializeField]
    float Speed = 2.0f;
    [SerializeField]
    float movSpeedX = 0.8f;
    [SerializeField]
    float movSpeedY = 2.4f;

    bool ReachedTarget = true;

    void Update()
    {
        if (ReachedTarget)
        {
            Vector2 dest = Vector2.zero;
            Vector2 currentPos = transform.position;
            if (Input.GetKeyUp(KeyCode.W))
            {
                dest = currentPos + (Vector2.up * movSpeedY);
                StartCoroutine(moveTo(dest, Speed));
            }
            else if (Input.GetKeyUp(KeyCode.S))
            {
                dest = currentPos + (Vector2.down * movSpeedY);
                StartCoroutine(moveTo(dest, Speed));
            }
            else if (Input.GetKeyUp(KeyCode.D))
            {
                dest = currentPos + (Vector2.right * movSpeedX);
                StartCoroutine(moveTo(dest, Speed));
            }
            else if (Input.GetKeyUp(KeyCode.A))
            {
                dest = currentPos + (Vector2.left * movSpeedX);
                StartCoroutine(moveTo(dest, Speed));
            }
        }
    }

    // Time to take is in seconds
    IEnumerator moveTo(Vector2 TargetPosition, float TimetoTake)
    {
        Vector2 originalPosition = transform.position;
        float Time_taken = 0f;
        ReachedTarget = false;
        while (Time_taken < 1)
        {
            Time_taken += Time.deltaTime / TimetoTake;
            // Interpolating between the original and target position this basically provides your "speed"
            transform.position = Vector2.Lerp(originalPosition, TargetPosition, Time_taken);
            yield return null;
        }
        Time_taken = 0;
        transform.position = TargetPosition;
        ReachedTarget = true;
    }
}
0 голосов
/ 04 ноября 2019

Я не могу найти документацию CrossPlatformInputManager, и я ничего не знаю об этом. Но если вам нужно получить событие «отпустить ключ» вместо «нажать клавишу», попробуйте следующее: Input.GetKeyUp .

Описание

Возвращает значение true во время кадра, в течение которого пользователь отпускает ключ, идентифицированный по имени.

Эту функцию необходимо вызывать из функции обновления, так как состояние сбрасывается каждый разРамка. Он не вернет true, пока пользователь не нажмет клавишу и не отпустит ее снова.

Список идентификаторов клавиш см. В разделе «Обычный ввод игры». При работе с вводом рекомендуется использовать Input.GetAxis и Input.GetButton, поскольку это позволяет конечным пользователям настраивать ключи.

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyUp("space"))
        {
            print("Space key was released");
        }
    }
}

Если вы хотите остановить твердое тело, вынужно сбросить его скорость до нуля. Или вы можете использовать Rigidbody2D.MovePosition , чтобы переместить его на определенное расстояние.

Параметры

position Новая позиция для объекта Rigidbody.

Описание

Перемещает жесткое тело в положение.

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

Поскольку эта функция позволяет быстро перемещать твердое тело в указанное положение по всему миру, любые коллайдеры, прикрепленные кТвердое тело будет реагировать, как и ожидалось, т.е. будет вызывать столкновения и / или триггеры. Это также означает, что, если коллайдеры производят столкновение, то это повлияет на движение твердого тела и потенциально остановит его от достижения указанной позиции во время следующего обновления физики. Если твердое тело является кинематическим, то любые столкновения не будут влиять на само твердое тело и будут влиять только на любые другие динамические коллайдеры.

2D твердые тела имеют фиксированный предел скорости, с которой они могут двигаться, поэтому они пытаются перемещаться на большие расстояния по короткимвременные шкалы могут привести к тому, что твердое тело не достигнет указанной позиции во время следующего обновления физики. Рекомендуется использовать это только для относительно небольших перемещений на расстояние.

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

Примечание. MovePosition предназначено для использования с кинематическими жесткими телами.

// Move sprite bottom left to upper right.  It does not stop moving.
// The Rigidbody2D gives the position for the cube.

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
    public Texture2D tex;

    private Vector2 velocity;
    private Rigidbody2D rb2D;
    private Sprite mySprite;
    private SpriteRenderer sr;

    void Awake()
    {
        sr = gameObject.AddComponent<SpriteRenderer>();
        rb2D = gameObject.AddComponent<Rigidbody2D>();
    }

    void Start()
    {
        mySprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f);
        velocity = new Vector2(1.75f, 1.1f);
        sr.color = new Color(0.9f, 0.9f, 0.0f, 1.0f);

        transform.position = new Vector3(-2.0f, -2.0f, 0.0f);
        sr.sprite = mySprite;
    }

    void FixedUpdate()
    {
        rb2D.MovePosition(rb2D.position + velocity * Time.fixedDeltaTime);
    }
}

Оба документа имеют пример,Или вы не хотите использовать пользовательскую клавиатуру, а только кнопки пользовательского интерфейса, попробуйте следующее: IPointerDownHandler и IPointerUpHandler

Описание Интерфейс, который нужно реализовать, если вы хотите получать обратные вызовы OnPointerDown.

Обнаруживает продолжающиеся щелчки мыши до отпускания кнопки мыши. Используйте IPointerUpHandler для обработки нажатия кнопки мыши.

//Attach this script to the GameObject you would like to have mouse clicks detected on
//This script outputs a message to the Console when a click is currently detected or when it is released on the GameObject with this script attached

using UnityEngine;
using UnityEngine.EventSystems;

public class Example : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    //Detect current clicks on the GameObject (the one with the script attached)
    public void OnPointerDown(PointerEventData pointerEventData)
    {
        //Output the name of the GameObject that is being clicked
        Debug.Log(name + "Game Object Click in Progress");
    }

    //Detect if clicks are no longer registering
    public void OnPointerUp(PointerEventData pointerEventData)
    {
        Debug.Log(name + "No longer being clicked");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...