버그 해결을 위한 모든 질문을 던져
0 votes
200 views
조이스틱과 화면에서 드래그로 움직이는 오브젝트가 있습니다

조이스틱과 게임 오브젝트는 하나씩 터치하면 제대로 작동합니다

근데 두개를 동시에 조작하려고 하면 게임 오브젝트가 조이스틱을 조작하는 터치의 영향을 받습니다

구글에 검색해봐도 제가 원하는 답은 없더라고요 벌써 이 문제로 2주일 넘게 해결 못하고 있습니다 고수분들 도와주세요

 

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;
    }
}
asked (4 point) , 200 views

Touch.fingerId 로 각 터치를 구분해주면 안되나요?

1 답변

0 votes

조이스틱의 OnPointerDown 함수 파라미터안에 PointerEventData.pointerId를 저장해놓고

드래그로 터치이벤트를 받을 때 저장해놓은 pointerId를 비교해 OnFingerDown, OnDrag를 실행시키지 않으면 되지 않을까요?

 

answered (26 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

239 질문
367 answers
376 댓글
470 users