- 플레이어 이동 코드는 예시로 작성하였습니다. 플레이어 이동 코드는 stick_direction 변수를 사용하여 만드시면 됩니다.

 


[전체 코드]

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

public class Joy_Stick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{
    public Transform stick;
    public Transform player;

    private Vector3 stick_offset_position;
    private Vector3 stick_direction;
    private float joy_stick_radius;

    void Start()
    {
        Set_Radius();
    }

    private IEnumerator Move_Player()
    {
        while (true)
        {
            player.Translate(stick_direction * Time.deltaTime * 10.0f);

            yield return null;
        }
    }

    private void Set_Radius()
    {
        joy_stick_radius = GetComponent<RectTransform>().sizeDelta.y * 0.5f;

        float canvas_radius = transform.parent.GetComponent<RectTransform>().localScale.x;
        joy_stick_radius *= canvas_radius;
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector3 touch_position = Camera.main.ScreenToWorldPoint(eventData.position);
        touch_position.z = 0;

        stick_direction = (touch_position - stick_offset_position).normalized;

        float touch_distance = Vector3.Distance(touch_position, stick_offset_position);

        if (touch_distance < joy_stick_radius)
        {
            stick.position = stick_offset_position + stick_direction * touch_distance;
        }
        else
        {
            stick.position = stick_offset_position + stick_direction * joy_stick_radius;
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        stick_offset_position = stick.transform.position;

        StartCoroutine(Move_Player());
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        StopAllCoroutines();

        stick.position = stick_offset_position;
        stick_direction = Vector3.zero;
    }
}

    public void OnPointerDown(PointerEventData eventData)
    {
        stick_offset_position = stick.transform.position;

        StartCoroutine(Move_Player());
    }​

- 조이스틱을 터치 하였을 때 스틱의 초기 위치를 설정.

- 플레이어 이동 코루틴 실행

 


    public void OnPointerUp(PointerEventData eventData)
    {
        StopAllCoroutines();

        stick.position = stick_offset_position;
        stick_direction = Vector3.zero;
    }

- 조이스틱을 누른 후 손가락을 화면에서 때었을 때 실행.

- 모든 코루틴을 정지

- 스틱을 초기 위치에 설정.

- 조이스틱 방향 초기화

 


    public void OnDrag(PointerEventData eventData)
    {
        Vector3 touch_position = Camera.main.ScreenToWorldPoint(eventData.position);
        touch_position.z = 0;

        stick_direction = (touch_position - stick_offset_position).normalized;

        float touch_distance = Vector3.Distance(touch_position, stick_offset_position);

        if (touch_distance < joy_stick_radius)
        {
            stick.position = stick_offset_position + stick_direction * touch_distance;
        }
        else
        {
            stick.position = stick_offset_position + stick_direction * joy_stick_radius;
        }
    }

        Vector3 touch_position = Camera.main.ScreenToWorldPoint(eventData.position);
        touch_position.z = 0;

- 터치 한 곳의 위치값을 받아온 후 z값을 0으로 변경.


        stick_direction = (touch_position - stick_offset_position).normalized;

- 현재 터치 중인 위치와 스틱의 초기 위치를 사용하여 현재 터치 위치의 방향을 받아옴.


        float touch_distance = Vector3.Distance(touch_position, stick_offset_position);

        if (touch_distance < joy_stick_radius)
        {
            stick.position = stick_offset_position + stick_direction * touch_distance;
        }
        else
        {
            stick.position = stick_offset_position + stick_direction * joy_stick_radius;
        }

- 터치 중인 위치와 스틱의 초기 위치에 비례한 거리와 조이스틱의 반지름 크기를 비교하여 더 작다면 스틱을 현재 터치 중인 곳으로, 더 크다면 위치를 조이스틱의 반지름 크기에 비례하여 이동.

 

 


    private void Set_Radius()
    {
        joy_stick_radius = GetComponent<RectTransform>().sizeDelta.y * 0.5f;

        float canvas_radius = transform.parent.GetComponent<RectTransform>().localScale.x;
        joy_stick_radius *= canvas_radius;
    }

 

Set_Radius()

- 조이스틱의 크기와 캔버스의 크기에 비례해서 반지름을 계산.

- 인 게임 중에서는 처음에 한 번만 불러오기 때문에 Awake나 Start에서 사용.

 

 

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

[Unity] 유니티 가장 가까운 몬스터 찾기  (0) 2023.11.10

+ Recent posts