using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class VirtualJoystick : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{ c#
[SerializeField]
private RectTransform lever;
private RectTransform rectTransform;
//레버가 움직일 수 있는 거리를 조이스틱의 중심으로부터 일정거리로 제한시키기 위해서 float으로 네버레인지 라는 변수를 추가
// 에디터에서 수정할 수 있도록 , 거리는 10에서 150사이
[SerializeField, Range(10, 150)]
float leverRange;
private Vector2 inputDirection;
private bool isInput;
[SerializeField]
private TPSCharacterController controller;
private void Awake()
{
rectTransform = GetComponent<RectTransform>();
}
public void OnBeginDrag(PointerEventData eventData)
{
ControllJoystickLever(eventData);
//구한 포지션을 넣어줌
}
// 오브젝트를 클릭해서 드래그 하는 도중에 들어오는 이벤트
// 하지만 클릭을 유지한 상태로 마우스를 멈추면 이벤트가 들어오지 않음
public void OnDrag(PointerEventData eventData)
{
// 터치한 위치는 이벤트함수의 매개변수로 받는 eventData.position으로 가져올 수 있음
// 조이스틱 게임오브젝트를 빼주면 =>레버가 있어야 할 위치
ControllJoystickLever(eventData);
//구한 포지션을 넣어줌
isInput = true;
}
public void OnEndDrag(PointerEventData eventData)
{
lever.anchoredPosition = Vector2.zero;
isInput = false;
controller.Move(Vector2.zero);
}
private void ControllJoystickLever(PointerEventData eventData)
{ // 터치한 위치는 이벤트함수의 매개변수로 받는 eventData.position으로 가져올 수 있음
// 조이스틱 게임오브젝트를 빼주면 =>레버가 있어야 할 위치
var inputPos = eventData.position - rectTransform.anchoredPosition;
//입력방향의 값을 0에서 1사이 값으로 만들어서 정규화된 값으로 캐릭터에 전달
// 캐릭터는 이렇게 전달받은 정규화돈 이동 벡터에 이동속도를 곱해서 일정한 속도로 이동
//inputPos의 길이와 leverRange를 비교해한 뒤
// leverRange보다 짧으면 inputPos를 바로주고
// 뒤면 inputpos를 leverRange를 곱하는 방식으로
//inputPos의 거리를 제한하여 레버 앵커드 포지션에 넣어둠
var inputVector = inputPos.magnitude < leverRange ? inputPos : inputPos.normalized * leverRange;
lever.anchoredPosition = inputVector;
inputDirection = inputVector / leverRange;
}
// 구해낸 입력 백터를 캐릭터에 전달하기 위한 함수
private void InputControlVector()
{
controller.Move(inputDirection);
//Debug.Log(inputDirection.x + " / " + inputDirection.y);
}
void Start()
{
}
// 인풋컨트롤벡터를 연속적으로 호출하기 위해
// 업데이트 함수에서
void Update()
{
// isInput일때 인풋컨트롤벡터함수를 호출
if(isInput)
{
InputControlVector();
}
}
}