본문 바로가기
개발/C#

유니티 C# 2d 가상 조이스틱 간단 구현 joystick

by SPNK 2024. 3. 9.
반응형

코드 작성

using UnityEngine;

public class VirtualJoystick : MonoBehaviour
{
    public float joystickRadius = 50f; // 조이스틱의 반지름
    private RectTransform joystickBackground; // 조이스틱 배경 이미지의 RectTransform
    private RectTransform joystickHandle; // 조이스틱 핸들 이미지의 RectTransform
    private Vector2 joystickInput = Vector2.zero; // 정규화된 조이스틱 입력값

    private void Start()
    {
        // 조이스틱 배경과 핸들을 찾아서 할당
        joystickBackground = transform.Find("Background").GetComponent<RectTransform>();
        joystickHandle = transform.Find("Handle").GetComponent<RectTransform>();
    }

    private void Update()
    {
        // 사용자 입력 감지
        UpdateJoystickInput();

        // 조이스틱 핸들 이동
        MoveJoystickHandle();
    }

    private void UpdateJoystickInput()
    {
        // 마우스 혹은 터치 입력 감지
        if (Input.GetMouseButton(0))
        {
            // 마우스 입력일 경우
            Vector2 mousePosition = Input.mousePosition;
            joystickInput = (mousePosition - joystickBackground.position) / joystickRadius;
        }
        else if (Input.touchCount > 0)
        {
            // 터치 입력일 경우
            Vector2 touchPosition = Input.GetTouch(0).position;
            joystickInput = (touchPosition - joystickBackground.position) / joystickRadius;
        }
        else
        {
            // 입력이 없을 경우 조이스틱 입력 초기화
            joystickInput = Vector2.zero;
        }

        // 입력값을 정규화하여 최대 길이를 1로 유지
        joystickInput = Vector2.ClampMagnitude(joystickInput, 1f);
    }

    private void MoveJoystickHandle()
    {
        // 조이스틱 핸들 위치 업데이트
        joystickHandle.anchoredPosition = joystickInput * joystickRadius;

        // 조이스틱 핸들의 위치를 조이스틱 배경 내에서 유지
        float handleDistance = joystickInput.magnitude * joystickRadius;
        if (handleDistance > joystickRadius)
        {
            joystickHandle.anchoredPosition = joystickInput.normalized * joystickRadius;
        }
    }

    // 외부에서 조이스틱 입력값을 받을 수 있는 함수
    public Vector2 GetJoystickInput()
    {
        return joystickInput;
    }
}
반응형

댓글