Чтобы не касаться друг друга - PullRequest
0 голосов
/ 02 ноября 2019

Существуют джойстики и игровые объекты.

Джойстик и игровой объект работают нормально, если работают по отдельности.

Но когда вы пытаетесь с ними работать одновременно, игровой объектtouch touch зависит от сенсорного джойстика.

Я пытался решить эту проблему более двух недель. Но я не смог.

Ниже приведены скрипты для джойстика и игрового объекта.

public class Crosshair : MonoBehaviour
{
    private Touch touch;
    private Vector3 screenSpace;
    private Vector3 offset;

    private void Update()
    {
        if(Input.touchCount > 0)
        {
            for (int i = 0; i < Input.touchCount; i++)
            {
                if (EventSystem.current.IsPointerOverGameObject(i) == false)
                {
                    touch = Input.GetTouch(i);
                    if (touch.phase == TouchPhase.Began)
                    {
                        OnFingerDown();
                    }
                    if (touch.phase == TouchPhase.Moved)
                    {
                        OnDrag();
                    }
                }
            }
        }
    }

    void OnFingerDown()
    {
        screenSpace = Camera.main.WorldToScreenPoint(transform.position);

        offset = transform.position - Camera.main.ScreenToWorldPoint
                 (new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));

    }

    void OnDrag()
    {
        if (Input.mousePosition.x > Screen.width / 2)
        {
            var curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
            var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;

            transform.position = curPosition;

            transform.position = new Vector3(Mathf.Clamp(transform.position.x, -18, 18),
                                             Mathf.Clamp(transform.position.y, -10, 10), transform.position.z);
        }
    }
}
public class JoystickController : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
    [SerializeField] private RectTransform rect_Background;
    [SerializeField] private RectTransform rect_Joystick;

    private float radius;

    [SerializeField] private GameObject player;
    [SerializeField] private float speed;

    public bool isTouch = false;
    private Vector3 touchPos;

    void Start()
    {
        radius = rect_Background.rect.width * 0.5f;
    }

    // Update is called once per frame
    void Update()
    {
        if (isTouch)
            player.transform.position += touchPos;
    }
    public void OnDrag(PointerEventData eventData)
    {
        Vector2 value = eventData.position - (Vector2)rect_Background.position;
        value = Vector2.ClampMagnitude(value, radius);
        rect_Joystick.localPosition = value;

        float disrance = Vector2.Distance(rect_Background.position, rect_Joystick.position) / radius;
        value = value.normalized;
        touchPos = new Vector3(value.x * speed * disrance * Time.deltaTime, value.y * speed * disrance * Time.deltaTime, 0);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        isTouch = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isTouch = false;
        rect_Joystick.localPosition = Vector2.zero;
        touchPos = Vector3.zero;
    }
}

ps.Я использовал переводчик. Таким образом, содержание может быть трудным для понимания, и мне жаль это.

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