조이스틱

김태완·2023년 2월 23일
0

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();
    }
}

}

profile
hello world

0개의 댓글