Есть ли способ остановить игрока, когда я перестаю касаться виртуального джойстика? - PullRequest
1 голос
/ 23 февраля 2020

Я новичок в Unity и пытаюсь сделать изометрию c 3D-игру, но у меня есть некоторые проблемы, я хотел бы, чтобы игрок прекратил движение, когда я перестаю использовать виртуальный джойстик. Вот мои 2 сценария для движения. Первый находится в виртуальном джойстике, чтобы заставить его двигаться, а второй - в плеере и заставляет его двигаться в направлении джойстика.

Сценарий джойстика:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;

public class VirtualJoystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{

private Image bgImg;
private Image joystickImg;
private Vector3 inputVector;

private void Start()
{
    bgImg = GetComponent<Image>();
    joystickImg = transform.GetChild(0).GetComponent<Image>();
}

public virtual void OnDrag(PointerEventData ped)
{
    Vector2 pos;
    if (RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos))
    {
        pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);
        pos.y = (pos.y / bgImg.rectTransform.sizeDelta.x);

        inputVector = new Vector3(pos.x * 2 + 1, 0, pos.y * 2 - 1);
        inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;

        // Move joystickImg
        joystickImg.rectTransform.anchoredPosition =
            new Vector3(inputVector.x * bgImg.rectTransform.sizeDelta.x / 3
                , inputVector.z * (bgImg.rectTransform.sizeDelta.y / 3));

    }
}

public virtual void OnPointerDown(PointerEventData ped)
{
    OnDrag(ped);
}

public virtual void OnPointerUp(PointerEventData ped)
{
    inputVector = Vector3.zero;
    joystickImg.rectTransform.anchoredPosition = Vector3.zero;
}

public float Horizontal()
{
    if (inputVector.x != 0)
        return inputVector.x;
    else
        return Input.GetAxis("Horizontal");
}

public float Vertical()
{
    if (inputVector.x != 0)
        return inputVector.z;
    else
        return Input.GetAxis("Vertical");
}
}

Player Скрипт:

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

public class Move : MonoBehaviour
{
public float moveSpeed = 20f;
public VirtualJoystick moveJoystick;

private void Update()
{
    Vector3 dir = Vector3.zero;

    dir.x = moveJoystick.Horizontal();
    dir.z = moveJoystick.Vertical();

    GetComponent<Rigidbody>().AddForce(dir * moveSpeed);
}

}

1 Ответ

0 голосов
/ 23 февраля 2020

Для остановки игрока, когда вы отпускаете go виртуального джойстика, мы можем сказать жесткому телу игрока спать. Это заставит игрока остановиться до тех пор, пока к нему не будет добавлена ​​другая сила.

Обновите ваш скрипт игрока следующим образом:

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

public class Move : MonoBehaviour
{
    public float moveSpeed = 20f;
    public VirtualJoystick moveJoystick;
    public Rigidbody rb;

    private Vector3 dir = Vector3.zero;
    private bool wasMoving = false;

    private void Update()
    {
        dir.x = moveJoystick.Horizontal();
        dir.z = moveJoystick.Vertical();

        if (dir.magnitude > 0)
        {
            wasMoving = true;
        }
    }

    private void FixedUpdate()
    {
        if (wasMoving && dir.magnitude == 0f)
        {
            wasMoving = false;
            rb.Sleep();
        }

        rb.AddForce(dir * moveSpeed);
    }

}

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

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