Как конвертировать клавиатуру в сенсорный контроллер - PullRequest
0 голосов
/ 16 апреля 2019

Добрый день, я новичок в Unity C #. Кто-нибудь знает, как преобразовать мой 2d сверху вниз сценарий контроллера автомобиля с клавиатуры на сенсорные кнопки. Мне нужно иметь сенсорные кнопки, которые имеют кнопки «Разрыв», «Назад», «Ускорение» и «Влево» вправо для моего 2-го автомобиля с верхом.

Мои коды основаны на автомобильной игре в стиле Аркады.

    float speedForce = 15f;
    float torqueForce = -200f;
    float driftFactorSticky = 0.9f;
    float driftFactorSlippy = 1;
    float maxStickyVelocity = 2.5f;
    float minSlippyVelocity = 1.5f; // <--- Exercise for the viewer

    // Use this for initialization
    void Start () 
    {

    }

    void Update() 
    {
        // check for button up/down here, then set a bool that you will use in FixedUpdate
    }

    // Update is called once per frame
    void FixedUpdate () 
    {
        Rigidbody2D rb = GetComponent<Rigidbody2D>();

        Debug.Log(RightVelocity().magnitude);

        float driftFactor = driftFactorSticky;
        if(RightVelocity().magnitude > maxStickyVelocity) {
            driftFactor = driftFactorSlippy;
        }

        rb.velocity = ForwardVelocity() + RightVelocity()*driftFactor;

        if(Input.GetButton("Accelerate")) {
            rb.AddForce( transform.up * speedForce );

            // Consider using rb.AddForceAtPosition to apply force twice, at the position
            // of the rear tires/tyres
        }
        if(Input.GetButton("Brakes")) {
            rb.AddForce( transform.up * -speedForce/2f );

            // Consider using rb.AddForceAtPosition to apply force twice, at the position
            // of the rear tires/tyres
        }

        // If you are using positional wheels in your physics, then you probably
        // instead of adding angular momentum or torque, you'll instead want
        // to add left/right Force at the position of the two front tire/types
        // proportional to your current forward speed (you are converting some
        // forward speed into sideway force)
        float tf = Mathf.Lerp(0, torqueForce, rb.velocity.magnitude / 2);
        rb.angularVelocity = Input.GetAxis("Horizontal") * tf;
    }

    Vector2 ForwardVelocity() 
    {
        return transform.up * Vector2.Dot( GetComponent<Rigidbody2D>().velocity, transform.up );
    }

    Vector2 RightVelocity() 
    {
        return transform.right * Vector2.Dot( GetComponent<Rigidbody2D>().velocity, transform.right );
    }
}

1 Ответ

0 голосов
/ 16 апреля 2019

вместо

if(Input.GetButton("Accelerate")) 
{
    rb.AddForce( transform.up * speedForce );
}
if(Input.GetButton("Brakes")) 
{
    rb.AddForce( transform.up * -speedForce/2f );
}

и

rb.angularVelocity = Input.GetAxis("Horizontal") * tf;

просто проверьте вместо некоторых bools и имейте соответствующие методы установки для них (Вы должны иметь те, чтобы иметь возможность вызывать их через UnityEvents):

private bool acceleratePressed;
private bool brakePressed;
private bool leftPressed;
private bool rightPressed;

public void SetAccelerate(bool pressed)
{
    acceleratePressed = pressed;
}

public void SetBrake(bool pressed)
{
    brakePressed = pressed;
}

public void SetRightPressed(bool pressed)
{
    rightPressed = pressed;
}

public void SetLeftPressed(bool pressed)
{
    leftPressed = pressed;
}

private void FixedUpdate()
{
    if(acceleratePressed) 
    {
        rb.AddForce( transform.up * speedForce );
    }
    if(brakePressed)
    {
        rb.AddForce( transform.up * -speedForce/2f );
    }

    var leftRight = 0;
    if(leftPressed && !rightPressed)
    {
        leftRight = -1;
    }
    else if(!leftPressed && rightPressed)
    {
        leftRight = 1;
    }

    // If you are using positional wheels in your physics, then you probably
    // instead of adding angular momentum or torque, you'll instead want
    // to add left/right Force at the position of the two front tire/types
    // proportional to your current forward speed (you are converting some
    // forward speed into sideway force)
    float tf = Mathf.Lerp(0, torqueForce, rb.velocity.magnitude / 2);
    rb.angularVelocity = leftRight * tf;
}

К сожалению, у Unity UI.Button нет способа переадресации кнопки вниз или вверх ... только onClick.

Но вы можете очень легко реализовать дополнительные события самостоятельно!Вы можете использовать IPointerDownHandler и IPointerUpHandler & IPointerExitHandler интерфейсы и пользовательские UnityEvents

Мне не нравится делать наследоватьиз UI.Button (некоторые люди могут предпочесть это), но вместо этого добавьте дополнительное поведение в отдельный компонент.

Есть другие способы, как точно реализовать это, но мне нравится сохранять вещи многократно используемыми, поэтому я бы использовал их как

[RequireComponent((typeof(Button)))]
public class DownUpButtonEnhancement : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
    private Button _button;

    public UnityEvent OnButtonDown;
    public UnityEvent OnButtonUp;

    private void Awake()
    {
        _button = GetComponent<Button>();
    }

    //Detect current clicks on the GameObject (the one with the script attached)
    public void OnPointerDown(PointerEventData pointerEventData)
    {
        if (!_button.interactable) return;

        OnButtonDown?.Invoke();
    }

    //Detect if clicks are no longer registering
    public void OnPointerUp(PointerEventData pointerEventData)
    {
        OnButtonUp?.Invoke();
    }

    // Detect if pointer leaves the object
    public void OnPointerExit(PointerEventData eventData)
    {
        // additionally reset if pointer leaves button while pressed
        OnButtonUp?.Invoke();
    }
}

Наденьте это на два интерфейса пользователя Buttons и настройте соответствующий обратный вызов OnButtonDown и OnButtonUp точно так же, как вы это сделали бы с onClick из Button:

  1. Перетащите GameObject со своим сценарием движения в
  2. Выберите соответствующий метод, который должен вызываться при каждом нажатии кнопки.
  3. Для OnButtonDown передать в true (установите флажок) для OnButtonUp передать в false.

enter image description here

Тогда в игре вы можете видеть, что теперь соответствующая строка скрипта MoveController включена, пока кнопка нажата, и дополнительно сбрасывается, если пинтер покидает кнопку при нажатии

enter image description here

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