개발을 하다보면 리소스가 수시로 변경되고 추가되고 해당 리소스를 Scene 에 붙어있는 script 상에서 사용한다고 하는 경우가 있습니다.

이때 자동화 기능을 통해 폴더의 리소스들을 script 변수에 값을 할당하는 방법입니다.


ResourceScene 이라는 이름의 scene 을 열고 /Assets/_ResourceScene/ 하위의 폴더들에서 prefab 과 png 파일을 가져온 후 해당 파일을 ResourcePool 의 container 에 담아두는 코드입니다.


ResourcePoolEditor.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
using System.IO;
 
public class ResourcePoolEditor : MonoBehaviour {
 
    [MenuItem("Build/SetResourcePool")]
    public static void SetResourcePool()
    {
        Scene scene = EditorSceneManager.OpenScene("Assets/__Scene/ResourceScene.unity");
 
        ResourcePool pool = GameObject.Find("ResourcePool").GetComponent<ResourcePool>();
 
        
        pool.objects.Clear();
        pool.UIs.Clear();
        pool.sprites.Clear();
 
        string[] arr = Directory.GetFiles(Directory.GetCurrentDirectory() + "/Assets/_ResourceScene/Object/""*.prefab", SearchOption.AllDirectories);
        foreach (string FullPath in arr)
        {
            if (!FullPath.Contains(".meta"))
            {
                int index1 = FullPath.IndexOf("Assets/_ResourceScene/");
 
                string path = FullPath.Substring(index1);
                path = path.Replace("\\""/");
#if UNITY_EDITOR
                GameObject temp = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
                if (temp != null)
                    pool.objects.Add(AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject);
#endif
            }
        }
 
        arr = Directory.GetFiles(Directory.GetCurrentDirectory() + "/Assets/_ResourceScene/Sprite/""*.png", SearchOption.AllDirectories);
        foreach (string FullPath in arr)
        {
            if (!FullPath.Contains(".meta"))
            {
                int index1 = FullPath.IndexOf("Assets/_ResourceScene/");
 
                string path = FullPath.Substring(index1);
                path = path.Replace("\\""/");
#if UNITY_EDITOR
                Sprite spr = AssetDatabase.LoadAssetAtPath(path, typeof(Sprite)) as Sprite;
                if (spr != null)
                    pool.sprites.Add(AssetDatabase.LoadAssetAtPath(path, typeof(Sprite)) as Sprite);
#endif
            }
        }
 
        EditorSceneManager.SaveScene(scene);
 
    }
}
 
cs


ResourcePool.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using UnityEngine;
using JaykayFramework;
using System.Collections.Generic;
 
public class ResourcePool : MonoBehaviour
{
    public List<GameObject> objects;
    public List<GameObject> UIs;
    public List<Sprite> sprites;
    void Awake ()
    {
        foreach(GameObject obj in objects)
            ObjectMgr.instance.AddToDicObject(obj.name, obj);
 
        foreach (GameObject obj in UIs)
            BuildUI.Instance.AddToDicUIPrefabs(obj.name, obj);
 
        foreach (Sprite obj in sprites)
            DataMgr.instance.AddToDicSprite(obj.name, obj);
    }
    
}
 
cs


+ Recent posts