move_object.gif

객체 또는 플레이어를 이동 시키기 위해 키보드 또는 마우스의 입력을 받아 위치 값을 변경합니다. 이번 글에서는 마우스를 입력으로 받아 객체를 이동시키는 것을 해보려고 합니다! 👍

🚀 Raycast

마우스 입력 받기 위해 먼저 생각해 보아야 할 것이 마우스 클릭했을 때의 시점과 그 시점에 포인터가 가리키는 곳이 필요합니다.

해당 정보는 Raycast를 사용하면 아주 간편하게 정보를 얻어올 수 있습니다!

💡 Raycast 는 레이저 광선을 쏘는 것을 의미합니다! 😎

마우스 클릭했을 때 레이저를 쏘고 해당 레이저가 콜라이더에 닿았을 때 이를 감지하여 정보를 불러올 수 있습니다.

객체 생성

💡 저는 STUDY 라는 프로젝트를 만들고, Scene으로 구분하여 유니티의 여러 기능을 공부하려고 합니다!

create_object.png

scene.png

우선 땅과 플레이어(Capsule) 을 생성했습니다. 그리고 Scripts 폴더를 만들고 Capsule 이라는 스크립트 파일을 생성했습니다.

스크립트

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using UnityEngine;

public class Capsule : MonoBehaviour
{
    private Vector3 destination;

    private void Awake()
    {
        destination = new Vector3();
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray origin = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit = new RaycastHit();
            if (Physics.Raycast(origin, out hit))
            {
                Debug.Log($"hit: ({hit.point.x}, {hit.point.y}, {hit.point.z})");

                destination = hit.point;
            }
        }
    }

    private void FixedUpdate()
    {
        if ((transform.position - destination).magnitude > 0.1)
            transform.position = Vector3.MoveTowards(transform.position, destination, Time.deltaTime);
    }
}

14: if (Input.GetMouseButtonDown(0)) 마우스 입력이 있다면

16: Camera.main.ScreenPointToRay(Input.mousePosition); 메인 카메라 현재 포인터의 위치에 광선을 만들고

18: Physics.Raycast(origin, out hit) 발사하고 맞은 지점을 hit로 반환

22: destination = hit.point; 클릭한 지점을 목적지로 설정

29: if ((transform.position - destination).magnitude > 0.1) 현재 객체의 위치와 레이저가 콜라이더에 충돌한 곳과의 차이의 백터 크기가 0.1 보다 크다면 (현재 위치와 목적지와의 차이가 있다면)

30: transform.position = Vector3.MoveTowards(transform.position, destination, Time.deltaTime); 목적지로 이동! 😄

💡 FixedUpdate 함수 Fixed Timestep에 설정된 값에 따라 일정한 간격으로 호출됩니다. 물리 효과가 적용된(Rigidbody) 오브젝트를 조정할 때 사용됩니다(Update는 불규칙한 호출임으로 물리엔진 충돌검사 등이 제대로 안될 수 있음). - Developug