[이전글]에서 카메라의 Culling Mask에 대해 소개하였습니다.

이 글에서는 script로 Culling Mask를 특정 상황에서 변경하는 것을 다룰 것입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
// CullingMask를 Everything으로 변경합니다.
Camera.main.cullingMask = -1;
// CullingMask를 Nothing으로 변경합니다.
Camera.main.cullingMask = 0;
// CullingMask에 "Group" Layer를 추가합니다.
Camera.main.cullingMask |= 1 << LayerMask.NameToLayer("Group");
// CullingMask에 "Group" Layer를 제거합니다.
Camera.main.cullingMask = Camera.main.cullingMask & ~(1 << LayerMask.NameToLayer("Group"));
// Nothing 상태인 CullingMask에서 Group Layer를 추가합니다.
Camera.main.cullingMask = 1 << LayerMask.NameToLayer("Group");
// Everything 상태인 CullingMask에서 Group Layer를 제거합니다.
Camera.main.cullingMask = ~(1 << LayerMask.NameToLayer("Group"));
cs

script에서 Culling Mask를 다루는 명렁어는 대략 이정도 있으며, 이를 활용하여 script를 구현합니다.

 

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ChangeCullingMask : MonoBehaviour
{
    void changeCullingMask(int idx)
    {
        if (idx == 0)
        {
            // CullingMask를 Everything으로 변경합니다.
            Camera.main.cullingMask = -1;
        }
        else if (idx == 1)
        {
            // CullingMask에 Group2를 추가하고 Group1을 제거합니다.
            Camera.main.cullingMask |= 1 << LayerMask.NameToLayer("Group2");
            Camera.main.cullingMask = ~(1 << LayerMask.NameToLayer("Group1"));
        }
        else
        {
            // CullingMask에 Group1을 추가하고 Group2를 제거합니다.
            Camera.main.cullingMask |= 1 << LayerMask.NameToLayer("Group1");
            Camera.main.cullingMask = ~(1 << LayerMask.NameToLayer("Group2"));
        }
    }
}
cs

위 코드는 ChangeCullingMask라는 이름의 script이며, 버튼이 눌러질 때마다 인덱스(idx)와 함께 호출될 메소드를 정의하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ButtonClick : MonoBehaviour
{
    public ChangeCullingMask changeCullingMask;
    public int idx;
    private void OnMouseDown()
    {
        changeCullingMask.Change(idx);
    }
}
cs

그 다음은 ButtonClick이라는 이름의 script입니다.

마우스 클릭 이벤트로 호출되는 OnMouseDown 메소드를 사용하였습니다.

이제 버튼을 클릭할 때마다 이 메소드가 호출됩니다.

 

이제 작성한 script들을 object에 적용시키는 일만 남았습니다.

우선 메인 카메라 밑에 버튼으로 사용하기 위해 Cube 3개를 생성합니다.

 

그리고 ChangeCullingMask.cs를 MainCamera에 적용시킵니다.

 

그리고 생성해놓은 Cube들에 ButtonClick.cs를 적용시킨 후에

ChangeCullingMask에 MainCamera를 넣고, 인덱스(idx)를 0 1 2로 각각 지정해줍니다.

 

 

이제 실행해봅니다.

먼저 첫번째 Cube를 클릭한 모습입니다.

idx = 0이며, CullingMask를 Everything으로 변경하여 모든 Object를 볼 수 있습니다.

 

두번째 Cube를 클릭한 모습입니다.

idx = 1이며, "Group1" Layer를 지정한 파란색 Cube들이 카메라에 보이지 않습니다.

 

세번째 Cube를 클릭한 모습입니다.

idx = 2이며, "Group1" Layer를 지정한 파란색 Cube들이 다시 카메라에 보이고 "Group2" Layer를 지정한 빨간색 Cube들이 카메라에 보이지 않습니다.

 

이런식으로 여러 상황에서 CullingMask를 변경하여 카메라에 특정 Object만 보이게 설정할 수 있습니다.

'Etc' 카테고리의 다른 글

React Web3로 Contract 함수 호출  (2) 2023.01.10
GitLab -> GitHub Mirroring  (0) 2022.06.12
Unity 카메라 Culling Mask  (0) 2021.10.29
TypeScript 실행  (0) 2021.08.30
TypeScript 설치  (0) 2021.08.30

Unity의 Culling Mask란 원하는 Layer를 가진 Object들만 카메라로 볼 수 있게 하는 기능입니다.

image

우선 여러개의 Cube를 생성하여 그룹을 나눕니다. (Group1, Group2)

구별을 위해 Group1에는 파란색, Group2에는 빨간색 Material을 넣었습니다.

 

그리고 그룹 간 구분을 위해 Layer -> Add Layer에서 Layer를 두개 만들어줍니다.
저는 "Group1"과 "Group2"를 생성하였습니다.

imageimage

 

그 다음 Group1에 "Group1" 이라는 Layer를, Group2에 "Group2" 라는 Layer를 추가해 넣어줍니다.

imageimage

이제 Culling Mask 사용을 위한 준비가 끝났습니다.

 

Main Camera의 Inspector -> Camera Component에 Culling Mask가 있습니다.
현재 Everything이 default로 지정이 되어있으며, 모든 Object를 카메라로 보여주고 있습니다.

image

그리고 현재 메인 카메라에 보이는 모습입니다.

 

이제 Culling Mask에서 Group1을 지우겠습니다.

Group1을 체크 해제하는 순간 Culling Mask는 Everything -> Mixed가 되는 것을 볼 수 있으며

Scene 창에서는 Group1이 보이지만 메인 카메라 화면에는 보이지 않는 것을 확인할 수 있습니다.

 

다만 카메라에는 안보이지만 실제로 존재하는 Object이므로 충돌 판정은 있습니다.

Collider를 없애서 그냥 통과하게 만들거나 하는 응용도 가능해보입니다.

'Etc' 카테고리의 다른 글

GitLab -> GitHub Mirroring  (0) 2022.06.12
Unity Script로 카메라 Culling Mask 기능 사용하기  (2) 2021.10.29
TypeScript 실행  (0) 2021.08.30
TypeScript 설치  (0) 2021.08.30
Windows 10 에서 WSL을 이용한 우분투 설치  (0) 2021.08.29

+ Recent posts