유니티의 Asset을 이름으로 얻고 싶은 거.

13644 단어 AssetBundleUnityC#

부가 또 떨어졌어요.


Play On Mac에서 예전의 Railload Tycoon2를 플레이하면 컴퓨터까지 떨어지는 경우가 많습니다.
그래도
아까 같이 결성한 유니티도 동반자로 떨어졌어요.
그 영향인지 부착이 완전히 떨어져 엉망진창이 되었다.
아무리 조심해도 부착이 떨어지는 경우가 있다.사람이요?

뭐 공부 해요?


예를 들어, Sprite와 Prefab을 많이 했다면

나는 이런 느낌으로 List로 추가할 것이라고 생각하지만, 나는 이것을 멈추고 싶다.
인덱스로 뭘 지정해도 치안이 안 좋아요.
이 근처에 어떻게 붙어있으면 QoL이 올라갈 것 같아요.

썼어


AutoAssetLoader.cs
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;



#if UNITY_EDITOR

using UnityEditor;

public class AutoAssetLoader<T> where T : UnityEngine.Object
{
    private readonly Dictionary<string, T> _assets = new Dictionary<string, T>();

    private string GetFilter()
    {
        if (typeof(T) == typeof(GameObject)) return "t:Prefab t:GameObject";
        else if (typeof(T) == typeof(Sprite)) return "t:Sprite";
        throw new Exception("とりあえずprefabとspriteのみ対応");
    }

    public AutoAssetLoader(string dir)
    {
        var assetPaths = AssetDatabase
            .FindAssets(GetFilter(), new string[] { "Assets/Editor/" + dir } )
            .Select(AssetDatabase.GUIDToAssetPath);

        foreach (var path in assetPaths)
        {
            var asset = AssetDatabase.LoadAssetAtPath<T>(path);
            _assets.Add(asset.name, asset);
        }
    }


    public T Get(string name)
    {
        var f = _assets.TryGetValue(name, out var o);
        return f ? o : null;
    }

    public IEnumerable<string> Names() => _assets.Keys;
}

#else

public class AutoAssetLoader<T> where T : UnityEngine.Object
{
    private readonly AssetBundle _assetBundle;
    private readonly Dictionary<string, T> _assets = new Dictionary<string, T>();

    public AutoAssetLoader(string path)
    {
        _assetBundle = AssetBundle.LoadFromFile("AssetBundleData/" + path);

    }


    public T Get(string name)
    {
        var f = _assets.TryGetValue(name, out var asset);
        if (f) return asset;
        asset = _assetBundle.LoadAsset<T>(name);
        _assets.Add(name, asset);
        return asset;
    }

    public IEnumerable<string> Names() => _assetBundle.GetAllAssetNames().Select(str=>
        {
            var from = str.LastIndexOf("/", StringComparison.Ordinal) + "/".Length;
            var to = str.LastIndexOf(".", StringComparison.Ordinal);
            var len = to < from ? (str.Length - from) : (to - from);
            return str.Substring(from, len);
        });
}


#endif
디렉터리의prefab와sprite 등 모든 내용을 읽습니다.
AssetDatabase는 UnityEditor 이름 공간에 있습니다. 즉, 구축할 때 사용할 수 없습니다.
사전 프로세서 명령을 사용하여 전환합니다.
개발할 때 편집기 폴더에 Prefab 또는 Sprite를 배치합니다.
나올 때 Asset Bundle을 잘 만들어야 돼요.
루트 디렉토리 바로 아래에 있는 AssetBundleData에 놓습니다.
UnityProject/
├ Assets/
│└ Editor/
│ ├ Prefabs/
│ └ Sprites/
└ AssetBundleData/

사용 방법


usage.cs
        AutoAssetLoader<GameObject> prefabs = new AutoAssetLoader<GameObject>("Prefabs");
        foreach (var name in prefabs.Names())
        {
            Instantiate(prefabs.Get(name));
        }


        AutoAssetLoader<Sprite> sprites = new AutoAssetLoader<Sprite>("Sprites");
        image.sprite = sprites.Get("Cat");

보충하여 기록하다


2019/9/22
AssetDatabase를 구축할 때 사용할 수 없음을 발견하여 AssetBundle로 전환하기로 결정했습니다.

좋은 웹페이지 즐겨찾기