336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



- 유니티 버전 : 5.3.4f -



니티3D 에디터(Editor) 하위 폴더 순회하기(Recursion)


특정 폴더가 있고 그 하위 게임오브젝트에 어떠한 스크립트를 추가 할 일이 생겼습니다.


그런데 너무 많다보니 수작업으로는 안되겠더라구요.


그래서 에디터를 이용해서 추가하였습니다.


(실제 코드는 아래쪽에 작성하겠습니다.)


상단 메뉴로 Util을 만들고 하위에 두개의 메뉴를 만들었습니다.


하나는 스크립트 붙이는거, 다른 하나는 스크립트 제거하는거.




아래 그림에 있는 설명처럼 루트 폴더를 선택하고, 메뉴를 통해 스크립트를 붙여주면, 


프리팹 게임오브젝트에만 스크립트가 붙는걸 볼 수 있습니다.




다시 루트에서 제거하기 메뉴를 누르면


스크립트가 제거되는 걸 볼 수 있습니다.



< 에디터 코드 >


using UnityEditor;
using UnityEngine;
using System.Collections;
using System.IO;

public class PedtAutoAttachScript : Editor{
    [MenuItem("Util/AttachReApplyShaders")]
    public static void AttachReApplyShaders()
    {
        Object[] selectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

        foreach(Object obj in selectedAsset)
        {            
            GameObject gObj = obj as GameObject;
            if (gObj != null)
            {
                string str = AssetDatabase.GetAssetPath(gObj);
                // Skip FBX 
                string strExtension = Path.GetExtension(str);
                Debug.Log(strExtension);
                if (strExtension.ToLower().CompareTo(".prefab") == 0)
                {
                    // 이미 추가 되어있는지 검사.
                    PcAutoAttatch script = gObj.GetComponent();
                    if(script == null)
                    {
                        // 없으면 추가.
                        gObj.AddComponent();
                        Debug.Log("Asset name : " + obj.name + " Type : " + obj.GetType());
                    }                    
                }                
            }
        }
    }

    [MenuItem("Util/RemoveReApplyShaders")]
    public static void RemoveReApplyShaders()
    {
        Object[] selectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

        foreach (Object obj in selectedAsset)
        {            
            GameObject gObj = obj as GameObject;
            if (gObj != null)
            {               
                PcAutoAttatch script = gObj.GetComponent();
                if (script != null)
                {
                    Debug.Log("Asset name : " + obj.name + " Type : " + obj.GetType());
                    DestroyImmediate(script, true);
                }
            }
        }
    }
	
}


에디터를 통해 자동화가 된다면 최대한 사용해야겠죠?


도움 되셨길 바랍니다.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



유니티 버전 : 5.3.4f


유니티3D 5.x (Unity3d 5) 어셋번들 매니저(AssetBundle Manager)


어셋번들(AssetBundle) 관련 사항들이 유니티 4.x와 5.x가 많이 달라졌습니다.


그래서 간단한 테스트로 정리해봅니다.


AssetBundle 빌드하는건 에셋스토어나 유니티 사이트에 있으니 미리 다운 바랍니다.


에셋스토어 링크 : https://www.assetstore.unity3d.com/kr/#!/content/45836



우선 저는 다음과 같은 구조로 만들었습니다.


DataForCDN이라는 폴더 내에 있는 데이터들을 어셋번들로 만들 계획입니다.


테스트를 위해 두 종류로 만들것입니다.


1. GoblinsB 폴더.


2. Beholders에 있는 Prefabs폴더에 있는 프리팹 한개.




그리고 Script에 있는 ReApplyShaders가 스크립트가 있는데 (NonCachingLoad는 신경쓰지마세요)


하는 역할은 머테리얼에 있는 쉐이더를 재적용 해주는 스크립트 입니다.


유니티5 로 어셋번들(assetbundle)을 묶어서 로드하게 되면


쉐이더가 적용 안되는 버그가 있습니다. 그래서 저렇게 (우선은..) 하고 있습니다.


저는 미리 로드할 프리팹(아래보이는 화면)에 저 스크립트 붙여놨습니다. 


< ReApplyShaders 코드 >


using UnityEngine;
using System.Collections;

public class ReApplyShaders : MonoBehaviour {

    Renderer[] renderers;
    Material[] materials;
    string[] shaders;

    void Awake()
    {
        renderers = GetComponentsInChildren();
    }

    void Start()
    {
        foreach (var rend in renderers)
        {
            materials = rend.sharedMaterials;
            shaders = new string[materials.Length];

            for (int i = 0; i < materials.Length; i++)
            {
                shaders[i] = materials[i].shader.name;
            }

            for (int i = 0; i < materials.Length; i++)
            {
                materials[i].shader = Shader.Find(shaders[i]);
            }
        }
    }
}




GoblinsB를 어셋번들로 만들기 위해 폴더 선택을 하고 다음처럼 이름을 써 줍니다.


확장자는 쓰지 않으셔도 되고 써도 됩니다.


그리고 저는 지금 대/소문자로 막 썼는데, 실제 대문자는 인식되지 않습니다.


(대문자로 써도 소문자로 바뀝니다. 보기 쉽게 저렇게 썼습니다)




두번째 AssetBundle로 BeholderGreen을 만들어 줍니다.




이제 마우스 오른쪽(또는 상단메뉴)를 통해 Build AssetBundles를 해줍니다.




그러면 다음처럼 진행이 됩니다.




Assetbundle Manager를 유니티에서 제공한 것을 사용했다면, 


프로젝트 폴더에 AssetBundles라고 폴더가 생기고 플렛폼이름 하위로


다음처럼 번들들이 생겼을 것입니다.


시간이 되신다면 manifest파일 한번씩 열어보시기 바랍니다.




실제 로드 테스트를 위해 위의 파일들을 다른 경로로(저는 E드라이브로) 옮겨줍니다.




이제 다음 코드를 붙여서 테스트를 해보도록 하겠습니다.


< 어셋번들 로드 하는 코드 >


using UnityEngine;
using System.Collections;

public class NonCachingLoad : MonoBehaviour {
    
    public string URL = "file:///E:/Android/";

	// Use this for initialization
	void Start () {
        
	}
	
	// Update is called once per frame
	void Update () {
	    if(Input.GetKeyDown(KeyCode.A))
        {
            StartCoroutine(Down());
        }
	}

    IEnumerator Down()
    {        
        WWW www = new WWW(URL + "Android");

        yield return www;

        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.error);
            yield break;
        }

        // 메니페스트 얻기
        AssetBundle bundleManifest = www.assetBundle;
        www.Dispose();
        AssetBundleManifest assetBundleManifest = bundleManifest.LoadAsset("AssetBundleManifest");
        // 메니페스트가 가지고 있는 모든 어셋번들 이름을 가져옵니다.
        // 여기에서는 두개가 나오겠죠.
        string[] assetBundleNames = assetBundleManifest.GetAllAssetBundles();
        // 어셋번들 갯수만큼 돌면서 게임오브젝트를 만들겠습니다.
        for (int i = 0; i < assetBundleNames.Length; i++)
        {            
            string assetBundleName = assetBundleNames[i];
            // 이미 캐쉬되어있는지 확인
            bool bCaching = Caching.IsVersionCached(URL + assetBundleName, assetBundleManifest.GetAssetBundleHash(assetBundleName));
            // 로그 찍어본다.
            Debug.Log(assetBundleName + " Cash : " + bCaching.ToString());

            // 어셋번들을 다운로드 합니다.
            // 저는 URL과 해쉬값으로 로드하겠습니다.(해쉬값은 메니페스트에 있습니다.)
            www = WWW.LoadFromCacheOrDownload(URL + assetBundleName, assetBundleManifest.GetAssetBundleHash(assetBundleName));
            yield return www;
            AssetBundle bundle = www.assetBundle;

            string[] names = bundle.GetAllAssetNames();
            for (int j = 0; j < names.Length; j++)
            {
                // 하나의 어셋번들이 가지고 있는 리스트롤 로그에 찍을꺼에요.
                Debug.Log(names[j]);
                // GameObject인 것만 생성(여기에서는 프리팹만 나오겠죠)
                GameObject gObj = bundle.LoadAsset(names[j]);
                if (gObj != null)
                    Instantiate(gObj);
            }
           
            // 번들을 언로드해줍니다.
            bundle.Unload(false);
            www.Dispose();
        }      
    }
}


스크립트를 아무대나 링크시키고 실행을 해보면


다음처럼 로드가 됩니다. 사실 끝난거죠.




이제 버전관리를 위해(패치는 해야하니까) 고블린 중에 하나 이름을 바꾸겠습니다.




그리고 다시 AssetBundle build를 하고 아까 그 폴더로 복사/붙여넣기 합니다.


그리고 다시 플레이를 해보세요.


아래 로그 보이시나요?


고블린 어셋번들이 캐쉬에 저장이 안된 상태로 되어있습니다.


좀전에 이름을 바꿨으니깐요.



실제 버전관리, 암호화 등을 하려면 관리자를 만들어야 합니다.


현재 포스팅은 기본적인 개념을 위해 작성한 것이니 


여러 테스트를 해보시고 잘 만드시길 바랍니다.



참고 : http://dev.suriyun.com/bay/technical/unity-asset-bundle-part-2/



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



- NGUI 버전 : 3.9.8 -


NGUI 스프라이트 기초 및 응용


유니티 5.x 가 들어오기 전부터 NGUI를 사용해서 


UGUI보다는 NGUI가 편하네요. 그리고 얼마전에 최신버전으로 업그레이드 했습니다.


기능이 좀 추가된 것 같네요.


우선 Sprite는 버튼, 스크롤뷰, 토글 등 을 사용하기 위해 기본적으로 필요한 요소입니다.


그래서 간략하게 정리 하려고 합니다.


아무것도 없는 상태에서 상단 메뉴 NGUI -> Create -> 2D UI를 만들어 줍니다.


NGUI를 사용하기 위해서는 무조껀 필요합니다.




스프라이트를 넣을 빈 게임 오브젝트를 하나 만듭니다.


메뉴를 통해서도 생성할 수 있지만, 


단축키가 빠르고 편하니 단축키를 눌러줍니다.


그러면 하단처럼 GameObject가 생성됩니다.




이제 스프라이트를 넣으려고 합니다.


Add Component를 눌러 uisprite를 치면 다음처럼 스크립트가 나옵니다.


선택해서 집어넣어 줍니다.




이제 이미지 세팅을 해 줍니다.


아틀라스를 선택하여 그 안에 이미지를 선택만 하면 됩니다.


저는 NGUI 샘플에 있는 Wooden Atlas를 선택하겠습니다.


(샘플이 없으신 분은 아틀라스를 만드셔서 해야합니다.)




이미지나 생겼네요. 기본 사이즈로 100 x 100으로 잡혀있습니다.




우측에서 Type을 보시면 아래 그림처럼 리스트가 나타납니다.


아래 설명을 읽어보시면 이해하는데 조금 도움이 될것 같네요.


제 경험으로는 Sliced가 가장 많이 사용되네요. 이것 저것 바꿔보시면 이해가 빨리 되실꺼에요.




NGUI를 업데이트 했더니 Sprite에 Gradient 기능이 생겼더라구요.


항상 이미지 새로 만들어서 했었는데


기능이 생겨서 다행이네요.




전체적인 색상도 바꿀 수 있습니다.


코드로 바꾸는 걸 간단히 해보도록 할께요.


C# 스크립트를 만들고 (이름은 원하는대로) 다음 코드를 넣어 줍니다.



using UnityEngine;
using System.Collections;

public class ChangeSpriteColor : MonoBehaviour {

    // 대상 스프라이트
    public UISprite sprite;
    // 변경할 색상    
    public Color color;
	// Use this for initialization
	void Start () {
	    // 기본값으로 white
        color = Color.white;
	}
	
	// Update is called once per frame
	void Update () {
        // 실시간 색상변경
        sprite.color = color;
	}
}


그리고 아까만든 GameObject에 연결해주고 링크 시켜줍니다.


실행시키고 Color를 눌러서 색상을 변경해보세요.


다음처럼 변경이 됩니다.



NGUI의 스프라이트(Sprite)는 정말 간단하지만 가장 중요하지 않나 싶네요.


다음에는 버튼을 만들고 버튼 이벤트와 트윈효과 등을 넣어보겠습니다.


'게임 프로그래밍 > NGUI' 카테고리의 다른 글

[NGUI] 토글버튼(Toggle) 제어  (0) 2016.07.13
[NGUI] 토글버튼(Toggle)  (0) 2016.07.02
[NGUI] 버튼과 레이블  (0) 2016.06.07

+ Recent posts