외곽선 쉐이더를 만들고 쉐이더를 사용하는 머티리얼을 편하게 오브젝트나 프리팹에 추가하거나 제거하는 툴을 제작하여 정리하였습니다.
💬 서론
- 이 글에서 사용할 외곽선 쉐이더는 아래 유튜브를 참고하여 만들었습니다.
- 이 글은 생성한 외곽선 머티리얼을 편리하게 관리하기위해 오브젝트에 쉽게 적용하고 제거하는 기능을 다룹니다.
✅ 사용예시
✅ 구현(스크립트 작성)
- 외곽선 머티리얼을 편리하게 관리하기위해 에디터 기능을 사용합니다.
더보기
using UnityEngine;
using UnityEditor;
public class AddRemoveMaterialToPrefab : EditorWindow
{
private Material mMaterialToAdd;
private Material mMaterialToRemove;
[MenuItem("Tools/Bonnate/Outline System/Material to Prefab")]
public static void ShowWindow()
{
GetWindow<AddRemoveMaterialToPrefab>("Material to Prefab");
}
private void OnGUI()
{
GUIStyle style = new GUIStyle();
style.richText = true;
GUILayout.Label("<color=white><b>선택한 오브젝트</b>에 <b>머티리얼</b>을 추가하거나 제거합니다.\n\n</color>", style);
GUILayout.BeginHorizontal();
mMaterialToAdd = (Material)EditorGUILayout.ObjectField("추가할 머티리얼", mMaterialToAdd, typeof(Material), false);
if (GUILayout.Button("추가"))
{
AddMaterial();
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
mMaterialToRemove = (Material)EditorGUILayout.ObjectField("제거할 머티리얼", mMaterialToRemove, typeof(Material), false);
if (GUILayout.Button("제거"))
{
RemoveMaterial();
}
GUILayout.EndHorizontal();
}
private void AddMaterial()
{
// 선택한 오브젝트들을 가져옴
foreach (GameObject prefab in Selection.gameObjects)
{
// 오브젝트에 포함된 모든 렌더러 컴포넌트 가져오기
foreach (Renderer renderer in prefab.GetComponentsInChildren<Renderer>(true))
{
// 머티리얼을 가져옴
Material[] materials = renderer.sharedMaterials;
bool materialExists = false; // 이미 해당 머티리얼이 있는가?
// 머티리얼을 모두 확인하면서 이미 등록되어있는지 확인
foreach (Material material in materials)
if (material == mMaterialToAdd)
{
materialExists = true;
break;
}
// 머티리얼이 없다면 머티리얼을 추가한 배열을 머티리얼에 등록
if (!materialExists)
{
ArrayUtility.Add(ref materials, mMaterialToAdd);
renderer.sharedMaterials = materials;
}
}
}
}
private void RemoveMaterial()
{
// 선택한 오브젝트들을 가져옴
foreach (GameObject prefab in Selection.gameObjects)
{
// 오브젝트에 포함된 모든 렌더러 컴포넌트 가져오기
foreach (Renderer renderer in prefab.GetComponentsInChildren<Renderer>(true))
{
// 머티리얼 가져오기
Material[] materials = renderer.sharedMaterials;
// 머티리얼들을 확인하여 해당 머티리얼이 있다면 제거
for (int i = 0; i < materials.Length; i++)
{
if (materials[i] == mMaterialToRemove)
{
ArrayUtility.RemoveAt(ref materials, i);
renderer.sharedMaterials = materials;
break;
}
}
}
}
}
}
private Material mMaterialToAdd;
private Material mMaterialToRemove;
- GUI 창에서 지정한 머티리얼을 저장합니다.
[MenuItem("Tools/Bonnate/Outline System/Material to Prefab")]
public static void ShowWindow()
{
GetWindow<AddRemoveMaterialToPrefab>("Material to Prefab");
}
- GUI창을 호출하기 위한 메뉴를 구현합니다.
- Tools / Bonnate / Outline System / Material to Prefab 항목에서 찾을 수 있도록 하였습니다.
· AddMaterial
private void AddMaterial()
- 머티리얼을 오브젝트에 추가하기위해 사용하는 함수입니다.
- 에디터의 기능인 Selection.gameObjects를 사용하여 현재 에디터에서 선택된 오브젝트들을 레퍼런스합니다.
- 선택한 오브젝트들을 하나씩 검사하여 Renderer 컴포넌트를 가져오고 머티리얼을 검사합니다.
// 머티리얼을 모두 확인하면서 이미 등록되어있는지 확인
foreach (Material material in materials)
if (material == mMaterialToAdd)
{
materialExists = true;
break;
}
- 머티리얼을 모두 검사하여 현재 머티리얼이 추가하고자하는 머티리얼과 같다면 넘어가도록 합니다.
// 머티리얼이 없다면 머티리얼을 추가한 배열을 머티리얼에 등록
if (!materialExists)
{
ArrayUtility.Add(ref materials, mMaterialToAdd);
renderer.sharedMaterials = materials;
}
- 중복되는 머티리얼이 없다면 현재 머티리얼 배열에 외곽선 머티리얼을 추가한 배열을 생성하여 sharedMaterials에 지정합니다.
· RemoveMaterial
private void RemoveMaterial()
- 선택한 오브젝트에서 머티리얼을 제거하는 함수입니다.
- 오브젝트를 선택하고, 검사하는 과정은 AddMaterial과 동일합니다.
// 머티리얼들을 확인하여 해당 머티리얼이 있다면 제거
for (int i = 0; i < materials.Length; i++)
{
if (materials[i] == mMaterialToRemove)
{
ArrayUtility.RemoveAt(ref materials, i);
renderer.sharedMaterials = materials;
break;
}
}
- 머티리얼을 확인하여 해당 머티리얼이 제거하고자하는 머티리얼과 동일하다면 해당 머티리얼을 배열에서 제외하고 sharedMaterials를 새로 지정합니다.
✅ 사용 방법
- 스크립트를 작성 후 에디터의 Tools > Bonnate > Outline System > Material to Prefab을 눌러 창을 엽니다.
- 해당 경로는 스크립트의 MenuItem으로 결정됩니다.
- 추가하거나 제거하고싶은 머티리얼을 Asset에서 선택합니다.
- 적용하고싶은 오브젝트나 프리팹을 선택합니다.
- 복수선택이 가능합니다.
- 창에서 추가 또는 제거 버튼을 눌러 머티리얼을 추가하거나 제거합니다.
'unity game modules' 카테고리의 다른 글
[유니티] 환경 사운드 (Ambient Area) (0) | 2023.03.23 |
---|---|
[유니티] 자동 스크롤 (0) | 2023.03.22 |
[유니티] Skybox Blender (0) | 2023.03.09 |
[유니티] 검기 이펙트, VFX 관리 (0) | 2023.03.07 |
[유니티] 발소리 구현 (2) | 2023.03.04 |