본문 바로가기
유니티 엔진

유니티 엔진에서 선택한 물체의 자식 오브젝트까지 설정 바꾸기

by 대마왕J 2019. 9. 15.

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

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

 

그러므로 이자리를 빌어 

잘생긴 오즈라엘찡에게

찬사를 보냅니다. 

 

 

 

 

 

 

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

 

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

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

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);
        }
    }
    
}
반응형

댓글