본문 바로가기
PROGRAMING📚/Unity📑

[UNITY]모바일 가상 조이스틱 구현하기(3)

별찌루 2023. 7. 25.
728x90
반응형

모바일 가상 조이스틱 구현하기(3)

 

 

[UNITY] 모바일 가상 조이스틱 구현하기(1)

모바일 가상 조이스틱 구현하기(1) 가상 조이스틱을 구현하기 위해서 젤 처음으로 UI를 디자인 해주었다 Joystick(하얀 동그라미) 이미지에 자식으로 Lever(파란색 동그라미) 로 구현하였다. 조이스

j2su0218.tistory.com

 

 

[UNITY] 모바일 가상 조이스틱 구현하기(2)

모바일 가상 조이스틱 구현하기(2) [UNITY] 모바일 가상 조이스틱 구현하기(1) 모바일 가상 조이스틱 구현하기(1) 가상 조이스틱을 구현하기 위해서 젤 처음으로 UI를 디자인 해주었다 Joystick(하얀

j2su0218.tistory.com

앞에서 했던 모바일 가상 조이스틱을 이용해서

캐릭터를 움직이는 것을 적용해보려고 한다


 

비어있는 씬에 바닥과 컨트롤 하기 위한 오브젝트를 하나 생성해준다

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 *(원하는 속도)를 적어주면 된다.

728x90
반응형

댓글