본문 바로가기
Unity/Base

프리펩(Prefab) ! Nested Prefab ? Prefab Varient !?

by Pretty Garbage 2022. 3. 7.

사실 저는 사용하면서 별 의문점도 갖지 않고 어 되네? 되는구나 하면서 썼던 기능이라 이게

 

Nested Prefab이 어쩌구 Prefab Varient가 어쩌고... 생각해본 적도 찾아볼 생각도 없었습니다.

 

사실 이걸 개념적으로 이해하고 있다보다는 본능적으로 이렇겠지 하고 쓰고 있던 것이라서 이참에

 

한번 정리하고 보고 가보자 싶어서 포스팅 하게 되었습니다.

 

다만, 아무리 봐도 제가 본능적으로 이해하고 있는 것이 맞는 것 같아서... 혹시 틀린 정보가 있다면

 

댓글로 남겨주시면 감사하겠습니다. (사실 이것 이외에도 사실과 다르다 잘못이해하고 있다면 지적 환영)

 

 

 

Prefab : 말그대로 유니티 개발자들이 이해하고 있는 가장 일반적인 프리펩... 이것을 정의하라고 하니까 뭐라 설명

해야할지 모르겠어서 유니티 도큐먼트 참조했더니 게임 오브젝트를 만들기 위한 일종의 템플릿 역할을 하는 것이라고

합니다. 

 

Nested Prefab : 프리펩 안에 다른 프리펩이 들어가있는 구조입니다.  

프리펩이라는 상자를 깠더니 또 다른 상자가!? 

 

Prefab Variant : 간단히 말하자면 원본에서 상속을 받은 자식 프리펩 정도로 생각하고 있습니다.

원본에서 바뀌는 내용은 똑같이 바뀌지만 이 녀석이 바뀌는 내용은 부모 프리펩에서 반영되지 않는다 정도..

 

 

 

스크립트로 접근하기

 

주의 : Using UnityEditor 안에 있는 기능들을 사용하는 것이며 당연히 에디터 폴더 안에 넣어줘야한다.

프리펩을 로드하면 언로드할 때까지 메모리상에 계속 살아있기 때문에 반드시 언로드를 해주자!

	//프리펩 자산을 로드하는 방법
        GameObject prefab = PrefabUtility.LoadPrefabContents("어셋의 경로");
        
        //여기서 프리펩에 관하여 무언가 동작한다
        
        //프리펩 언로드하는 방법
        PrefabUtility.UnloadPrefabContents(prefab);

 

	//우선 새로 게임오브젝트를 하나 생성한다.
        GameObject go = new GameObject();
        
        //게임 오브젝트를 프리펩화 시켜서 저장하기 out bool success에서 성공여부를 리턴함.
        GameObject prefab =
            PrefabUtility.SaveAsPrefabAssetAndConnect(go, "경로", InteractionMode.AutomatedAction, out bool success);
        
        //파괴 처리, 두번째 파라미터가 allowDestroyingAssets이므로 자산에서도 파괴해준다.
        DestroyImmediate(go,true);
        
        //로드되어있는 prefab 자산을 언로드해준다.
        PrefabUtility.UnloadPrefabContents(prefab);

 

스크립트 상에서 수정내용 정하고 저장하는 방법

	GameObject prefab = PrefabUtility.LoadPrefabContents("path");

        //무언가 무언가 수정을 한다.
        
        //기존 경로에 그대로 저장
        PrefabUtility.SavePrefabAsset(prefab, out bool success);
        //다른 경로에 저장
        PrefabUtility.SaveAsPrefabAsset(prefab, "savepath", out bool success2);

 

씬에 인스턴스를 만들기

	GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>("path");
        var instantiatePrefab = PrefabUtility.InstantiatePrefab(prefab) as GameObject;

핵심 키워드는 LoadAssetAtPath와  위에서 사용하던 LoadPrefabContents의 차이점일건데

간단히 이야기하자면

LoadPrefabContents는 에디터 전용으로 보이지 않는 씬에 인스턴스로서 로드가 됩니다.

LoadAssetAtPath는 메모리 위에 어셋으로서 로드됩니다.

 

Prefab Varient 만들기

	//위의 방식대로 똑같이 프리펩을 로드하고 이를 복제한다.
        GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Path/basePrefab.prefab");
        GameObject varient = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
        
        //Varient를 만든다
        PrefabUtility.SaveAsPrefabAsset(varient, "path/VarientPrefab.prefab");
        
        //씬에 남아있는 오브젝트를 해제
        Object.DestroyImmediate(varient, true);

그 외 정리

 

	GameObject prefabAssets = AssetDatabase.LoadAssetAtPath<GameObject>("Path");
        
        //어셋데이터에서 불러온 프리펩 자산 복제
        Object.Instantiate(prefabAssets);
        
        GameObject prefabInstance = PrefabUtility.InstantiatePrefab(prefabAssets) as GameObject;
        
        //Prefab Unpack하기
        PrefabUtility.UnpackPrefabInstance(prefabInstance, PrefabUnpackMode.OutermostRoot, InteractionMode.AutomatedAction);

 

Object.Instantiate는 뭐 알다시피 씬에서 프리펩이나 자산 복제해서 게임오브젝트로 만들어내는 것을 가리키고,

아래의 PrefabUtility.Instantiate는 에디터쪽 메서드라고 생각하면 편할 것 같다.

'Unity > Base' 카테고리의 다른 글

Unity 카메라 워크 ( Camera Work )  (0) 2022.03.08
프리펩(Prefab) 배경 표시  (0) 2022.03.06
유니티 기초. 유니티의 개발 방식에 관하여  (0) 2018.06.25