에또 이건 오즈라엘이 제공한 예제를 분석한 글입니다. 

분석하는 이유는 내가 잊을까봐  

 

그러므로 이자리를 빌어 

잘생긴 오즈라엘찡에게

찬사를 보냅니다. 

 

 

 

 

 

 

====================절취선 

 

모 프로젝트를 진행할때 기능을 만들 필요가 있어서 시작한 겁니다. 선택한 오브젝트의 모든 하위까지 뒤지면서 옵션을 바꾸는 기능입니다. 

일단 풀코드부터. 이 기능은 선택한 하위 물체를 돌면서 모두 꺼버리는 기능입니다. 이 기능을 바탕으로 다른 기능을 응용하면서 만들 수 있겠죠 

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);
        }
    }
    
}
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 캬오 대마왕J 2019.09.17 09:27 신고  댓글주소  수정/삭제  댓글쓰기

    https://www.dropbox.com/s/5hgr609ukjry8gh/%EC%B2%AD%EA%B0%95%20%ED%81%AC%EB%A1%9C%EB%8B%88%ED%81%B4%2020th.pptx?dl=0