본문 바로가기
유니티 개발일지

유니티 조이스틱 구현

by 곰스타일 2023. 4. 14.
728x90
반응형
SMALL

캔버스에서 이미지 UI 2개 생성 (1개는 조이스틱 및 배경, 1개는 조이스틱 레버)

각각 크기 조절 및 이미지 지정한 이후

조이스틱 오브젝트에 아래 스크립트 컴포넌트함

컴포넌트된 스크립트에 Lever 오브젝트 연결하면 끝

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; // 키보드, 마우스, 터치를 이벤트로 오브젝트에 보낼 수 있는 기능을 지원
//using UnityEngine.UI;

public class JoystickController : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    [SerializeField]
    private RectTransform lever;
    private RectTransform rectTransform;
    [SerializeField, Range(10f, 150f)]
    private float leverRange;
   
    private Vector2 inputVector;    // 추가
    private bool isInput;    // 추가

    private void Awake()
    {
        rectTransform = GetComponent<RectTransform>();
    }
   
    public void OnBeginDrag(PointerEventData eventData)
    {
        // var inputDir = eventData.position - rectTransform.anchoredPosition;
        // var clampedDir = inputDir.magnitude < leverRange ? inputDir
        //     : inputDir.normalized * leverRange;
        // lever.anchoredPosition = clampedDir;

        ControlJoystickLever(eventData);  // 추가
        isInput = true;    // 추가
    }
       
    // 오브젝트를 클릭해서 드래그 하는 도중에 들어오는 이벤트
    // 하지만 클릭을 유지한 상태로 마우스를 멈추면 이벤트가 들어오지 않음    
    public void OnDrag(PointerEventData eventData)
    {
        // var inputDir = eventData.position - rectTransform.anchoredPosition;
        // var clampedDir = inputDir.magnitude < leverRange ? inputDir
        //     : inputDir.normalized * leverRange;
        // lever.anchoredPosition = clampedDir;
       
        ControlJoystickLever(eventData);    // 추가
        isInput = false;    // 추가
    }
   
    // 추가
    public void ControlJoystickLever(PointerEventData eventData)
    {
        var inputDir = eventData.position - rectTransform.anchoredPosition;
        var clampedDir = inputDir.magnitude < leverRange ? inputDir
            : inputDir.normalized * leverRange;
        lever.anchoredPosition = clampedDir;
        inputVector = clampedDir / leverRange;
    }
   
    public void OnEndDrag(PointerEventData eventData)
    {
        lever.anchoredPosition = Vector2.zero;
    }

    public CharacterController characterController;
    private void InputControlVector()
    {    // 캐릭터에게 입력벡터를 전달
   
     if (characterController)
        {
            Debug.Log(inputVector.x + inputVector.y);                  
        }
    }

    void Update()
    {
        if(isInput)
        {
            InputControlVector();
        }
    }

}
728x90
반응형
LIST

댓글