1. 리소스 메니저 생성 2. 풀 매니저 생성 3. 조이스틱 생성 - 조이스틱 이미지 잘 움직이는것도 확인 함 To-Do 1. 조이스틱과 플레이어 캐릭터를 연결하는 로직 2. 몬스터 이동 로직을 고민해서 구현해보기
82 lines
4.6 KiB
C#
82 lines
4.6 KiB
C#
// C# 스크립트에서 Unity UI와 터치 이벤트를 사용하기 위해 꼭 필요한 네임스페이스들입니다.
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.UI;
|
|
|
|
// IPointerDownHandler: 터치가 시작될 때 OnPointerDown 함수를 호출합니다.
|
|
// IDragHandler: 터치한 채로 드래그할 때 OnDrag 함수를 호출합니다.
|
|
// IPointerUpHandler: 터치가 끝났을 때 OnPointerUp 함수를 호출합니다.
|
|
public class VirtualJoystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
|
|
{
|
|
// --- 내부 변수 선언 ---
|
|
private Image _background; // 조이스틱의 배경 이미지를 저장할 변수입니다.
|
|
private Image _controller; // 조이스틱의 핸들(컨트롤러) 이미지를 저장할 변수입니다.
|
|
private Vector2 _touchPosition; // 터치된 위치를 저장할 변수입니다.
|
|
|
|
// --- 외부 공개 변수 선언 ---
|
|
// PlayerController 같은 다른 스크립트에서 이 값들을 가져가서 사용합니다.
|
|
// { get; private set; }은 이 스크립트 안에서만 값을 바꿀 수 있다는 의미입니다.
|
|
public float Horizontal { get; private set; } // 조이스틱의 수평 위치 값 (-1 ~ 1)
|
|
public float Vertical { get; private set; } // 조이스틱의 수직 위치 값 (-1 ~ 1)
|
|
|
|
// 게임이 시작될 때 한번만 호출되는 함수입니다.
|
|
void Start()
|
|
{
|
|
// 이 스크립트가 붙어있는 오브젝트의 자식 중에서 "Background"를 찾아 Image 컴포넌트를 가져옵니다.
|
|
_background = transform.Find("Background").GetComponent<Image>();
|
|
// "Background" 오브젝트의 자식 중에서 "Controller"를 찾아 Image 컴포넌트를 가져옵니다.
|
|
_controller = _background.transform.Find("Controller").GetComponent<Image>();
|
|
}
|
|
|
|
// 조이스틱 영역을 처음 터치했을 때 호출되는 함수입니다.
|
|
public void OnPointerDown(PointerEventData eventData)
|
|
{
|
|
// 드래그 로직을 그대로 실행해서, 터치만 해도 컨트롤러가 바로 움직이게 합니다.
|
|
OnDrag(eventData);
|
|
}
|
|
|
|
// 조이스틱 영역을 터치한 채로 드래그할 때 계속 호출되는 함수입니다.
|
|
public void OnDrag(PointerEventData eventData)
|
|
{
|
|
// RectTransformUtility.ScreenPointToLocalPointInRectangle 함수는
|
|
// 스크린(화면)에서의 터치 좌표(eventData.position)를
|
|
// 특정 UI 요소(_background.rectTransform)를 기준으로 하는 로컬(내부) 좌표로 변환해주는 유용한 기능입니다.
|
|
// 변환된 로컬 좌표는 _touchPosition에 저장됩니다.
|
|
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
|
|
_background.rectTransform,
|
|
eventData.position,
|
|
eventData.pressEventCamera,
|
|
out _touchPosition))
|
|
{
|
|
// 조이스틱 배경 이미지의 넓이를 기준으로 반지름을 계산합니다.
|
|
float backgroundRadius = _background.rectTransform.sizeDelta.x / 2;
|
|
|
|
// 터치 위치(_touchPosition)의 길이가 반지름보다 크면,
|
|
// 즉, 터치가 배경 이미지 밖으로 벗어났다면,
|
|
if (_touchPosition.magnitude > backgroundRadius)
|
|
{
|
|
// 방향은 그대로 유지한 채, 길이를 반지름 크기로 고정시켜서 컨트롤러가 밖으로 나가지 않게 합니다.
|
|
_touchPosition = _touchPosition.normalized * backgroundRadius;
|
|
}
|
|
|
|
// 계산된 위치(_touchPosition)로 _controller 이미지의 위치를 실제로 움직여줍니다.
|
|
_controller.rectTransform.anchoredPosition = _touchPosition;
|
|
|
|
// PlayerController가 사용하기 쉽도록, 현재 컨트롤러의 위치를 -1에서 1 사이의 값으로 정규화합니다.
|
|
// 예를 들어, 컨트롤러가 배경 오른쪽 끝에 있으면 Horizontal은 1, 왼쪽 끝에 있으면 -1이 됩니다.
|
|
Horizontal = _touchPosition.x / backgroundRadius;
|
|
Vertical = _touchPosition.y / backgroundRadius;
|
|
}
|
|
}
|
|
|
|
// 조이스틱 영역에서 터치를 뗐을 때 호출되는 함수입니다.
|
|
public void OnPointerUp(PointerEventData eventData)
|
|
{
|
|
// 컨트롤러(핸들) 이미지를 다시 조이스틱의 정중앙으로 되돌립니다.
|
|
_controller.rectTransform.anchoredPosition = Vector2.zero;
|
|
|
|
// 플레이어가 계속 움직이는 것을 방지하기 위해, 수평/수직 값을 0으로 초기화합니다.
|
|
Horizontal = 0;
|
|
Vertical = 0;
|
|
}
|
|
} |