# 모바일 조이스틱
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Joystick : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerUpHandler, IPointerDownHandler
{
private float m_leverRange = 100f;
private bool m_isInput;
private Vector2 m_inputVector = new Vector2(-1f, 0f);
private RectTransform m_lever;
private RectTransform m_rectTransform;
private Vector2 m_startPosition;
public bool IsInput => m_isInput;
public Vector2 InputVector => m_inputVector;
private void Awake()
{
m_rectTransform = transform.GetChild(0).GetComponent<RectTransform>();
m_startPosition = m_rectTransform.anchoredPosition;
m_lever = transform.GetChild(0).GetChild(0).GetComponent<RectTransform>();
}
// 클릭했을 때
public void OnPointerDown(PointerEventData eventData)
{
Vector2 localPoint;
RectTransformUtility.ScreenPointToLocalPointInRectangle(GetComponent<RectTransform>(), eventData.position, eventData.pressEventCamera, out localPoint);
m_rectTransform.anchoredPosition = localPoint;
}
// 클릭땠을 때
public void OnPointerUp(PointerEventData eventData)
{
m_rectTransform.anchoredPosition = m_startPosition;
}
public void OnBeginDrag(PointerEventData eventData)
{
m_isInput = true;
Control_JoystickLever(eventData);
}
public void OnDrag(PointerEventData eventData)
{
Control_JoystickLever(eventData);
}
public void OnEndDrag(PointerEventData eventData)
{
m_rectTransform.anchoredPosition = m_startPosition;
m_lever.anchoredPosition = Vector2.zero;
m_isInput = false;
}
public void Control_JoystickLever(PointerEventData eventData)
{
Vector2 localPoint;
RectTransformUtility.ScreenPointToLocalPointInRectangle(m_rectTransform, eventData.position, eventData.pressEventCamera, out localPoint);
// rectTransform의 중심을 기준으로 inputDir을 계산
var inputDir = localPoint;
// 입력 벡터를 클램핑
var clampedDir = inputDir.magnitude < m_leverRange ? inputDir
: inputDir.normalized * m_leverRange;
// 레버의 위치를 설정
m_lever.anchoredPosition = clampedDir;
// 조이스틱의 입력 벡터를 저장
m_inputVector = clampedDir / m_leverRange;
}
}
- 참고 자료 : https://wergia.tistory.com/231
'Unity > Activities' 카테고리의 다른 글
[유니티] 캐릭터 상하좌우 애니메이션 (0) | 2025.01.27 |
---|---|
[유니티] 애니메이션 레이어/ 아바타 마스크 (0) | 2024.12.02 |
[유니티] 플레이어 상체 움직이기 (0) | 2024.12.02 |
[유니티] 스크롤뷰(ScrollView) (0) | 2024.12.02 |
[유니티] 런타임 실행 순서 변경 (0) | 2024.12.02 |