에또 이건 오즈라엘이 제공한 예제를 분석한 글입니다.
분석하는 이유는 내가 잊을까봐
그러므로 이자리를 빌어
잘생긴 오즈라엘찡에게
찬사를 보냅니다.
====================절취선
모 프로젝트를 진행할때 기능을 만들 필요가 있어서 시작한 겁니다. 선택한 오브젝트의 모든 하위까지 뒤지면서 옵션을 바꾸는 기능입니다.
일단 풀코드부터. 이 기능은 선택한 하위 물체를 돌면서 모두 꺼버리는 기능입니다. 이 기능을 바탕으로 다른 기능을 응용하면서 만들 수 있겠죠
using UnityEditor;
using UnityEngine;
namespace Editor
{
public class SuperOz
{
[MenuItem("Edit/Super/Awesome/OZ")]
private static void SuperAwesomeOz()
{
var selection = Selection.objects;
if (selection == null)
{
Debug.Log("Nothing selected, idiot!");
return;
}
foreach (var t in selection)
{
GameObject go = t as GameObject;
if (go != null)
{
Debug.Log("Selection is : " + go.name);
ToggleGameObjects( go);
}
else
{
Debug.Log("What do you want to do, idiot ?");
}
}
}
private static void ToggleGameObjects(GameObject go)
{
if (go == null) return;
//ToggleGameObject(go);
//Debug.Log("toggle : " + go.name);
var children = go.GetComponentsInChildren<Transform>();
foreach (var child in children)
{
ToggleSingleGameObject(child.gameObject);
Debug.Log("toggle : " + child.gameObject.name);
}
}
private static void ToggleSingleGameObject(GameObject go)
{
if( go.activeSelf == true)
go.SetActive(false);
else
go.SetActive(true);
}
}
}
이걸 바탕으로 , 기능을 만들어 보겠습니다.
우선 새로 만든 스크립트에서 시작합니다.
using UnityEditor;
로 에디터를 사용할 수 있게 하고 ,
[MenuItem("Edit/Super/Awesome/OZ")]
로 메뉴를 만들어 줍니다. 메뉴가 만들어 졌습니다. 여기 이름은 자기 맘대로..
그리고 private 로 static 함수를 하나 만들어 줍니다.
그리고 더이상 MonoBehaviour를 상속받지 않아도 됩니다.
using System.Collections;
using System.Collections.Generic;
도 필요 없게 됩니다.
그러면 이렇게 되죠
using UnityEngine;
using UnityEditor;
public class selectChange
{
[MenuItem("Tools/jptest")]
private static void jptest()
{
}
}
여기서 시작을 합니다.
우선 선택한 녀석을 저장해야겠죠
var selection = Selection.objects;
if (selection == null)
{
Debug.Log("Nothing selected, idiot!");
return;
}
형식은 암거나 받을 수 있는 var 로. Selection.objects로 선택된 놈을 전부 selection 으로 저장합니다
아무것도 없을때 메세지를 출력하게 해 놓습니다. (하지만 아무것도 선택되지 않은 것이란 조건이 나오지 않습니다. 빈 오브젝트라도 선택은 되는듯?
그럼 여기까지 하면 이렇게 됩니다. 이 상태는 일단 맨 아래 있는 녀석까지 갑니다.
using UnityEngine;
using UnityEditor;
public class selectChange
{
[MenuItem("Tools/jptest")]
private static void jptest()
{
var selection = Selection.objects;
if (selection == null)
{
Debug.Log("nothing selected");
return;
}
Debug.Log("something selected");
}
}
이제 여기까지 했으면, 다음엔 foreach 문이 등장할 차례입니다. selection 안에 넣은 것이 하나일지 여러 개일지 모르니까 일일히 돌아가면서 하겠다는 겁니다.
아래처럼 foreach 문을 추가해서, 일단 선택된 오브젝트의 이름들을 나열하게 해서 테스트 해 봅시다.
이름을 보려면 게임오브젝트여야 하므로 GameObject 로 캐스팅하였습니다.
using UnityEngine;
using UnityEditor;
public class selectChange
{
[MenuItem("Tools/jptest")]
private static void jptest()
{
var selection = Selection.objects;
if (selection == null)
{
Debug.Log("nothing selected");
return;
}
foreach (var t in selection)
{
GameObject go = t as GameObject;
if (go != null)
{
Debug.Log("Selection is : " + go.name);
}
else
{
Debug.Log("What do you want to do, idiot ?");
}
}
}
}
위와 같이 하면, 이제 선택된 오브젝트의 이름을 전부 나열해 줍니다.
여러 개가 선택되어 있으면 여러 개를 말이죠
이제 하위를 돌면서 게임오브젝트를 끄는 함수를 추가하여 코드를 완성해 봅시다.
using UnityEditor;
using UnityEngine;
namespace Editor
{
public class SuperOz
{
[MenuItem("Edit/Super/Awesome/OZ")]
private static void SuperAwesomeOz()
{
var selection = Selection.objects;
if (selection == null)
{
Debug.Log("Nothing selected, idiot!");
return;
}
foreach (var t in selection)
{
GameObject go = t as GameObject;
if (go != null)
{
Debug.Log("Selection is : " + go.name);
ToggleGameObjects( go);
}
else
{
Debug.Log("What do you want to do, idiot ?");
}
}
}
private static void ToggleGameObjects(GameObject go)
{
if (go == null) return;
//ToggleGameObject(go);
//Debug.Log("toggle : " + go.name);
var children = go.GetComponentsInChildren<Transform>();
foreach (var child in children)
{
ToggleSingleGameObject(child.gameObject);
Debug.Log("toggle : " + child.gameObject.name);
}
}
private static void ToggleSingleGameObject(GameObject go)
{
if( go.activeSelf == true)
go.SetActive(false);
else
go.SetActive(true);
}
}
}
'유니티 엔진' 카테고리의 다른 글
Asset Review - Polygon : Nature Pack (1) | 2019.10.06 |
---|---|
Asset Review - Toony Colors Pro 2 (0) | 2019.09.26 |
Post Process V2 sample texture issue : 포스트 프로세스 샘플 텍스쳐 접근 문제에 대해서 (2) | 2019.08.24 |
HDRP for Artist (0) | 2019.07.25 |
유니티 엔진 파이프라인 선택 가이드라인 (0) | 2019.07.15 |
댓글