[Unity] 클릭(터치)한 화면 좌표로 캐릭터 이동 시키기

2022. 2. 1. 18:28Game Development/Unity

 

모바일 게임에서 캐릭터 이동 방식에는 여러 가지가 있다. 조이스틱(Joystick)을 사용하기도 하지만, 조작감이 불편해서 화면 터치를 많이 사용하고 있는 추세라고 한다. PC 게임에서도 LOL이나 스타크래프트 같은 경우, 마우스를 통해 화면의 원하는 지점으로 캐릭터를 이동 시키는 방식을 쓴다.

 

원리

 

  • 카메라가 보여주는 영역에 터치를 하면, Raycast처럼 가상의 광선을 쏜다.
  • 광선에 닿은 바닥의 좌표값을 받아내서, 캐릭터를 해당 좌표로 이동 시킨다.
  • 즉, 스크린 좌표계에서 월드 좌표계로의 값 변환 과정이 필요하다.
  • 바닥에 콜라이더(Collider) 컴포넌트가 있어야 광선에 부딪히므로 반드시 넣어줘야 한다.
  • 장애물이 존재한다면, 길찾기 알고리즘을 추가로 적용해줘야 한다. 아니면 네비게이션을 사용하는 방법이 있다.
  • 씬 내에 있는 아이템 클릭 시 이벤트가 발생하게 하는 등에도 응용해서 적용할 수 있다.

 

보고 있는 방향을 나타내기 위해, 구체를 달아줬다.

 

스크립트(Script)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float moveSpeed;
    private bool isMove;
    private Vector3 destination;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            
            if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
            {
                Debug.Log($"충돌된 물체 이름 : {hit.transform.name}, Position : {hit.point}");
                destination = hit.point;
                isMove = true;
            }
        }
        Move();
    }


    private void Move()
    {
        if (isMove)
        {
            bool isAlived = Vector3.Distance(destination, transform.position) <= 0.1f;
            if (isAlived)
            {
                isMove = false;
            }
            else
            {
                Vector3 direction = destination - transform.position;
                transform.forward = direction;
                transform.position += direction.normalized * moveSpeed * Time.deltaTime;
            }
        }
    }

}

 

 

 

 

728x90
반응형