본문 바로가기
C#

[C#][Unity] 마우스 클릭으로 유닛 이동시키기

by teamnova 2021. 12. 12.
728x90

이번에는 마우스 클릭으로 유닛을 이동시켜보도록 하겠습니다.

 

 

실행 환경

개발 툴: Unity 2019.4.21f1

IDE : vscode

 

먼저 바닥과 유닛을 만들어보겠습니다.

 

작업전에 오브젝트 위치를 초기화 시키겠습니다.

Hierarchy 창에서 방금 만든 Plane 과 Capsule 을 ctrl 을 눌른 상태에서 클릭해서 동시에 선택한 다음

오른쪽 Inspector 창에서 Transform 을 우클릭해서 나온 메뉴의 Reset 을 클릭해주세요.

 

클릭하시면 Transform 아래 숫자들이 (0,0,0) 으로 초기화 된것을 볼 수 있습니다.

 

 

다음으로 생성한 캡슐을 움직이기 위해서 캡슐에 캐릭터 컨트롤러를 추가해보겠습니다.

캡슐 클릭 후 Inspector 에서 가장 밑으로 이동하시면 Add Component 가 있습니다.

클릭하시고 'character controller'를 입력해주세요.

클릭하시면 캐릭터 컨트롤러가 추가된걸 볼 수 있습니다.

 

다음으로 유닛 이동 로직을 짜기 위해서 스크립트를 만들어보도록 하겠습니다.

 

Project 폴더 창에서 Assets 파일을 우클릭 후 새폴더를 생성하고 이름을 Scripts 라고 지어주세요.

 

그리고 Scripts 폴더 안에 새로운 스크립트를 만들어줍니다.

 

이름은 마음대로 지어주세요. 저는 MyUnit 이라고 하겠습니다.

더블 클릭해서 스크립트를 열어주세요

 

코드를 아래처럼 만들어주세요

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

public class MyUnit : MonoBehaviour
{
    public float speed;      // 캐릭터 움직임 스피드
    public CharacterController characterController; // 캐릭터 컨트롤러
    public Vector3 movePoint; // 이동 위치 저장
    public Camera mainCamera; // 메인 카메라
    
    void Start()
    {
        speed = 4.0f;
        mainCamera = Camera.main;
        characterController = GetComponent<CharacterController>();
    }
    
    void Update()
    {
    
        // 좌클릭 이벤트가 들어왔다면
        if (Input.GetMouseButtonUp(0))
        {
            // 카메라에서 레이저를 쏜다.
            Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            // Scence 에서 카메라에서 나오는 레이저 눈으로 확인하기
            Debug.DrawRay(ray.origin, ray.direction * 10f, Color.red, 1f);
    
            // 레이저가 뭔가에 맞았다면
            if (Physics.Raycast(ray, out RaycastHit raycastHit))
            {
                // 맞은 위치를 목적지로 저장
                movePoint = raycastHit.point;
                Debug.Log("movePoint : " + movePoint.ToString());
                Debug.Log("맞은 객체 : " + raycastHit.transform.name);
    
            }
        }
    
        // 목적지까지 거리가 0.1f 보다 멀다면
        if (Vector3.Distance(transform.position, movePoint) > 0.1f)
        {
            // 이동
            Move();
        }
        
    }
    
    void Move()
    {
        // thisUpdatePoint 는 이번 업데이트(프레임) 에서 이동할 포인트를 담는 변수다.
        // 이동할 방향(이동할 곳-현재 위치) 곱하기 속도를 해서 이동할 위치값을 계산한다.
        Vector3 thisUpdatePoint = (movePoint - transform.position).normalized * speed;
        // characterController 는 캐릭터 이동에 사용하는 컴포넌트다.
        // simpleMove 는 자동으로 중력을 계산해서 이동시켜주는 메소드다.
        // 값으로 이동할 포인트를 전달해주면 된다.
        characterController.SimpleMove(thisUpdatePoint);
    }
}

 

 

스틱코드를 사용하신다면 아래 링크로 이동해서 즐겨찾기 하신 후 'mouseMove' 자동완성을 사용해주세요.

https://stickode.com/detail.html?no=2644 

 

스틱코드

 

stickode.com

 

ctrl+s 를 눌러 파일을 저장하시고 다시 Unity 로 돌아와서 Hierarchy 의 캡슐을 클릭해주세요.

그리고 Inspector 의 AddComponent 를 누르고 MyUnit( 위에서 만든 스크립트 ) 를 추가해주세요.

 

추가된 MyUnit 스크립트 컴포넌트를 보시면 여러 값들이 보이실텐데요.

스크립트에서 public 으로 선언한 변수들이 보이는 것을 볼 수 있습니다.

여기서도 초기 값들을 설정해줄 수 있지만 현재는 제가 스크립트가 실행될 때 값을 설정하도록 해두었기 때문에 따로 값을 설정하실 필요 없습니다.

 

이제 가장 위쪽 ▶ 버튼을 눌러 게임을 실행시킨 다음 게임 화면에 바닥을 클릭해주세요

캡슐이 이동하는 것을 볼 수 있습니다.

 

메인 카메라를 기준으로 레이저를 쏴서 동작하기 때문에 카메라를 위로 이동시키면 좀 더 정확히 이동시키실 수 있습니다.