본문 바로가기
개발/Unity

Unity) 조이스틱 구현하기(JoyStick)

by 테샤르 2020. 9. 17.

조이스틱 구현하기(JoyStick)

 

유닛의 이동을 처리하기 위해서 작업하는 과정에서 

조이스틱을 작업하기로 구성을 했다.

 

 

조이스틱은 실질적으로 방향에 대한 입력만 구분을 하고 실제로는 속력을 처리했다.

물리에 대한 고려를 처리하지 않기 위해서 (Velocity)를 처리하지 않고 SetPosition으로 처리를 했다.

핵심 코드를 이루고 있는 요소는 입력이다.

IBeginDragHandler

IDragHandler

IEndDragHandler

 

에서 입력받은 순간

Vector2 inputDir = eventData.position - rectTransform.anchoredPosition;
                    this.m_vMoveDir = inputDir.magnitude < leverRange? inputDir : inputDir.normalized * leverRange;
                    lever.anchoredPosition = this.m_vMoveDir;

 

레버의 위치 포지션을 처리하고 LeverRange의 범위 밖으로 나가지 못하게 처리한다. 

그리고 실제 유닛은 레버의 Direction을 기준으로 speed를 계산해준다.

 

 

/*
*       작성일자 : 2020년 09월 14일 AM 10시 27분
*       작성자 : 
*       설명 : 
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine.EventSystems; // 키보드, 마우스, 터치를 이벤트로 오브젝트에 보낼 수 있는 기능을 지원
using UnityEngine;
using Game.Flow;
using Unit;

public class VirtualJoystick : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{

    enum eJOYSTICK_STATE
    {
        NONE,
        BEGIN,
        DRAG,
        END,
    }

    [SerializeField]
    private RectTransform lever;

    [SerializeField]
    private Player m_Player = null;

    private RectTransform rectTransform;

    [SerializeField, Range(10f, 150f)]
    private float leverRange;

    private Vector2 m_vMoveDir = Vector2.one;
    private eJOYSTICK_STATE m_eState = eJOYSTICK_STATE.NONE;
    #region Unity Method

    void Start()
    {
        rectTransform = this.GetComponent<RectTransform>();
    }

    void Update()
    {
        switch(this.m_eState){
            case eJOYSTICK_STATE.BEGIN:
            case eJOYSTICK_STATE.DRAG:{
                this.UpdatePlayerPosition(this.m_vMoveDir);
            }
            break;
        }
    }
    
    public void OnBeginDrag(PointerEventData eventData)
    {
        this.SetState(eJOYSTICK_STATE.BEGIN, eventData);
      
    }
    public void OnDrag(PointerEventData eventData)
    {
        this.SetState(eJOYSTICK_STATE.DRAG, eventData);
     
    }
    public void OnEndDrag(PointerEventData eventData)
    {
        this.SetState(eJOYSTICK_STATE.END, eventData);
        if (eGAME_FLOW.INGAME_PLAY != GameFlowManager.Instance.GetState())
        {
            return;
        }

        Logger.LogFormat("[End]");
    }


    #endregion

    #region Private Method
    private void UpdatePlayerPosition(Vector2 _dir)
    {
        if (null == this.m_Player)
        {
            return;
        }
        Vector3 changePosition = new Vector3(_dir.x, 0f, _dir.y) * 0.001f;
        Logger.LogFormat("[Player] :{0}",changePosition);
        this.m_Player.SetPosition(this.m_Player.GetPosition() + changePosition);

    }

    private void SetState(eJOYSTICK_STATE _state, PointerEventData eventData)
    {

        this.m_eState =_state;
        if (eGAME_FLOW.INGAME_PLAY != GameFlowManager.Instance.GetState())
        {
            return;
        }

        switch (_state)
        {
            case eJOYSTICK_STATE.BEGIN:
            case eJOYSTICK_STATE.DRAG:
                {
                    Vector2 inputDir = eventData.position - rectTransform.anchoredPosition;
                    this.m_vMoveDir = inputDir.magnitude < leverRange ? inputDir : inputDir.normalized * leverRange;
                    lever.anchoredPosition = this.m_vMoveDir;
                }
                break;
            case eJOYSTICK_STATE.END:
                {
                    lever.anchoredPosition = Vector2.zero;
                }
                break;
        }

    }

    #endregion
    #region Public Method

    #endregion

}

 

 

 

반응형

댓글