모바일 가상 조이스틱 구현하기(3)
앞에서 했던 모바일 가상 조이스틱을 이용해서
캐릭터를 움직이는 것을 적용해보려고 한다
비어있는 씬에 바닥과 컨트롤 하기 위한 오브젝트를 하나 생성해준다
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
public class VirtualJoystick : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
[SerializeField]
private RectTransform leverTransform;
private RectTransform rectTransform;
public Vector2 inputVector;
[SerializeField] private float leverRange = 120f;
private void Awake()
{
rectTransform = GetComponent<RectTransform>();
}
public void OnBeginDrag(PointerEventData eventData)
{
DragEvent(eventData);
}
public void OnDrag(PointerEventData eventData)
{
DragEvent(eventData);
}
public void OnEndDrag(PointerEventData eventData)
{
isDrag = false;
leverTransform.anchoredPosition = Vector2.zero;
}
private void DragEvent(PointerEventData eventData)
{
isDrag = true;
var inputPos = eventData.position - rectTransform.anchoredPosition;
var rangeDir = inputPos.magnitude < leverRange ? inputPos : inputPos.normalized * leverRange;
leverTransform.anchoredPosition = rangeDir;
inputVector = rangeDir.normalized;
Debug.Log("inputVector : " + inputVector);
}
}
캐릭터를 움직이기 위해서
조이스틱으로 받은 inputVector의 값을 Player안에 적용시켜주어야한다.
public CharacterController Player_ctrl;
public bool isDrag;
//플레이어 컨트롤
private void PlayerCtrl()
{
if(isDrag)
{
Player_ctrl.Move(inputVector);
}
}
private void Update()
{
PlayerCtrl();
}
Player 오브젝트를 쉽게 이동시켜주기 위해서
CharacterController 를 사용할 것 이다
Player안에 Character Controller 컴포넌트를 추가해준다.
그리고 스크립트안에 플레이어가 움직일 수 있도록
DragEvent()에서 구한 InputVector 값을 넣어주면
PlayerCtrl 함수를 만들어준다
해당 캐릭터를 조이스틱으로 움직였을 때 즉각적으로 이동시켜주기 위해서
bool 값으로 드래그 중 인지 아닌지를 파악하고
드래그 중 일 경우, CharatorController 컴포넌트의 Move속성을 사용해서
캐릭터를 움직이도록 만들어 줄 생각이다
Move속성의 매개변수로 Vector의 값이 들어가기 때문에
여기안에 위에서 만들었던 조이스틱의 InputVector 값을 넣어준다.
private void PlayerCtrl()
{
if(isDrag)
{
Player_ctrl.Move(inputVector);
}
}
이렇게 하고 동작을 하면 왼쪽 오른쪽으로 이동하면 정상적으로 이동하는데
위 아래로 조이스틱을 움직였을 때 z축으로 이동한다.
Player_ctrl.Move(new Vector3(inputVector.x, 0,inputVector.y));
다음과 같이 수정하면 우리가 원하는 방식대로 앞,뒤,좌,우로 움직이는 것을 볼 수 있다
Player_ctrl.Move(new Vector3(inputVector.x, 0,inputVector.y)*Time.deltaTime*10);
캐릭터가 너무 빠르다 싶으면 Vector3 위에 Time.deltaTime *(원하는 속도)를 적어주면 된다.