오늘은 마우스로 대상을 클릭하면 대상 게임 오브젝트의 색깔이 바뀌도록 해 보겠습니다.

씬에 구체 생성

제일 먼저 유니티 에디터를 열고 Hierarchy 창에서 오른쪽 클릭하여 3D Object > Sphere를 선택하여 구체를 추가하세요.

씬에 구체를 하나 생성한다

그리고 Inspector 창에서 Transform을 사용하여 구체의 위치를 (0, 0, 0)으로 설정하세요.

구체를 선택하고 위치를 (0,0,0)으로 지정한다

스크립트 작성

Project 창의 Assets 폴더에서 오른쪽 클릭하여 Create > C# Script를 선택하고 이름을 “ColorChanger”로 변경하세요.

스크립트 파일을 생성한다

스크립트가 생성되면 이를 더블 클릭하여 “ColorChanger” 스크립트를 열고 이제부터 코드를 작성합니다. 이 클래스는 오브젝트의 색상을 변경하는 역할을 합니다. 기본 형태의 클래스는 다음과 같을 것입니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    private void Start()
    {
    }

    private void Update()
    {
    }
}

이제 클래스에 Renderer 컴포넌트를 참조하는 private 변수 _renderer를 추가합니다. 이 변수는 오브젝트의 렌더링 속성을 제어하기 위해 사용됩니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    private Renderer _renderer;

    private void Start()
    {
    }

    private void Update()
    {
    }
}

Start() 메소드에서 GetComponent로 Renderer 컴포넌트를 가져옵니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    private Renderer _renderer;

    private void Start()
    {
        _renderer = GetComponent<Renderer>();
    }

    private void Update()
    {
    }
}

이제 Update() 메소드 안에 마우스 왼쪽 버튼이 눌렸을 때 조건문을 실행하는 코드를 작성합니다. Input.GetMouseButtonDown(0)을 사용하여 마우스 왼쪽 버튼이 눌렸는지 확인합니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    private Renderer _renderer;

    private void Start()
    {
        _renderer = GetComponent<Renderer>();
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
        }
    }
}

레이캐스트 생성

조건문 안에서, 마우스 위치에 대한 레이캐스트를 생성합니다. 이를 위해 Camera.main.ScreenPointToRay() 메소드를 사용하고, 입력된 마우스 위치를 전달합니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    ...

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        }
    }
}

위에 추가한 코드를 조금 더 상세하게 설명해 보겠습니다.

RaycastHit hit;

이 부분에서는 RaycastHit이라는 변수 타입의 ‘hit’이라는 이름의 변수를 선언합니다. RaycastHit은 레이캐스트가 물체와 충돌했을 때 해당 충돌 정보를 담고 있는 클래스입니다. 이 변수를 통해 레이캐스트가 어떤 오브젝트와 충돌했는지, 충돌한 위치와 같은 정보를 알 수 있습니다.

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

이 부분에서는 레이(Ray)라는 변수 타입의 ray라는 이름의 변수를 선언하고, 값을 할당합니다. Camera.main.ScreenPointToRay(Input.mousePosition) 메소드는 현재 화면에서 마우스 포인터의 위치를 기준으로 레이(Ray)를 생성합니다.

이 레이는 3D 공간에서 카메라 위치부터 마우스 포인터 방향으로 나아가는 무한한 직선을 나타냅니다. 이렇게 생성된 레이를 사용하여 물체와의 충돌 여부를 확인할 수 있습니다.

간단하게 다시 설명하면, 이 구문은 마우스 포인터가 가리키는 방향으로 무한한 직선(레이)을 생성하고, 해당 레이가 3D 공간에서 어떤 물체와 충돌하는지 확인하기 위한 변수들을 선언하는 것입니다. 이를 통해 게임 내에서 마우스 포인터로 물체를 선택하거나 상호작용하는 기능을 구현할 수 있습니다.

오브젝트와 충돌한 지점 검사

이제 레이캐스트를 사용해 오브젝트와 충돌한 지점을 검사합니다. Physics.Raycast() 메소드를 사용하고, 생성된 레이와 RaycastHit 변수를 전달합니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    ...

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit))
            {                
            }
        }
    }
}

이 메소드는 레이(ray)와 충돌한 물체가 있을 때 true를 반환하고, 그렇지 않으면 false를 반환합니다. 또한, 메소드의 두 번째 인자인 out hit를 통해 충돌 정보를 RaycastHit 타입의 hit 변수에 저장합니다. 이 조건문은 레이가 어떤 물체와 충돌했는지를 검사하는 역할을 합니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    ...

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit))
            {
                if (hit.transform.gameObject == this.gameObject)
                {
                    ChangeColor();
                }
            }
        }
    }
}

이 조건문은 충돌한 물체가 현재 스크립트가 적용된 게임 오브젝트와 동일한지 확인합니다. hit.transform.gameObject는 레이와 충돌한 게임 오브젝트를 나타내며, this.gameObject는 현재 스크립트가 적용된 게임 오브젝트를 나타냅니다. 두 게임 오브젝트가 동일하다면, 이 조건문이 true가 되어 ChangeColor() 메소드가 호출됩니다.

ChangeColor() 메소드 작성

이제 ChangeColor() 메소드를 작성합니다. 이 메소드에서는 랜덤한 색상을 생성한 후, _renderer의 material.color 속성에 랜덤한 색상을 할당하여 오브젝트의 색상을 변경합니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    ...

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit))
            {
                if (hit.transform.gameObject == this.gameObject)
                {
                    ChangeColor();
                }
            }
        }
    }

    private void ChangeColor()
    {        
    }
}

우선 다음과 같이 랜덤한 색상을 생성합니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    ...

    private void ChangeColor()
    {
        Color randomColor = new Color(Random.value, Random.value, Random.value);        
    }
}

위의 코드에서 Random.value는 0과 1 사이의 랜덤한 실수값을 반환합니다. 새로운 Color 객체를 생성할 때, 이 랜덤한 값들을 각각 R, G, B 색상 요소에 할당합니다. 이렇게 하면 랜덤한 색상이 생성됩니다.

이제 생성된 랜덤 색상을 오브젝트에 적용하는 코드를 작성하겠습니다. 이를 위해 _renderer.material.color 속성에 랜덤 색상을 할당합니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    ...

    private void ChangeColor()
    {
        Color randomColor = new Color(Random.value, Random.value, Random.value);
        _renderer.material.color = randomColor;
    }
}

위의 코드에서 _renderer는 Renderer 컴포넌트를 참조하며, 이 컴포넌트를 통해 오브젝트의 머티리얼 및 색상 속성에 접근할 수 있습니다. 색상을 변경하면 해당 오브젝트의 표면 색상이 랜덤 색상으로 바뀝니다.

완성된 전체 코드

이제 완성된 전체 코드의 내용은 다음과 같습니다.

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    private Renderer _renderer;

    private void Start()
    {
        _renderer = GetComponent<Renderer>();
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit))
            {
                if (hit.transform.gameObject == this.gameObject)
                {
                    ChangeColor();
                }
            }
        }
    }

    private void ChangeColor()
    {
        Color randomColor = new Color(Random.value, Random.value, Random.value);
        _renderer.material.color = randomColor;
    }
}

스크립트 적용

이제 코드 작성이 다 끝났습니다. 에디터로 돌아가서 “ColorChanger” 스크립트를 구체에 드래그 앤 드롭하여 적용하세요.

스크립트를 구체에 붙인다

카메라 조정

이제 카메라의 위치를 조정해서 게임 실행시 구체가 좀 더 가까이 보이게 하겠습니다. 우선 Hierarchy 창에서 Main Camera를 선택하고, Inspector 창에서 Transform을 사용하여 카메라의 위치를 (0, 1, -5)로 설정하세요.

카메라의 위치 값을 조정한다

데모 실행 및 테스트

유니티 에디터 상단의 Play 버튼을 눌러 데모를 실행해 보겠습니다. 마우스로 구체를 클릭하면 색상이 다음과 같이 변경될 것입니다.

마우스로 클릭할 때마다 색깔이 변한다