最近打王者荣耀的时候偶然发现 当我们在换皮肤的时候
场景中的很多东西会同时换 如果我们在开发的时候一个一个把他们放入场景中
这是很耗时间的 我们完全可以把他们分类在一个文件夹中 动态加载出来

比如王者荣耀中每换一款皮肤 很多东西都会改 比如模型 背景 动画等还有就是大量的UI(金额 说明等等)
开发的时候一个一个弄到场景中 想想就头大

动态加载的实现

我们的思路还是使用Resources的load

我们事先把文件分类 场景中物体分为一类 UI分为一类

unity3d动态加载地形 unity动态加载模型_unity3d动态加载地形


这是我的分类 我们的代码是要获取路径的

代码

public  string HeroName;
 public void LoadFolderObject(string FolderName)//加载文件夹中所有场景中游戏物体
    {
        GameObject[] ObjectInfo = Resources.LoadAll<GameObject>("Prefebs/Hero/" + FolderName + "/Object");
        foreach (var a in ObjectInfo)
        {
            GameObject t = Instantiate(a);
            t.name = a.name;//正常实例化出来的带有(clone),消除(clone)
        }
    }
    public void LoadFolderUI(string FolderName)//加载文件夹路径中所有的UI文件
    {
        GameObject canvas = GameObject.Find("Canvas");
        GameObject[] UIInfo = Resources.LoadAll<GameObject>("Prefebs/Hero/"+ FolderName+ "/UI");
        foreach (var a in UIInfo)
        {
            GameObject t = Instantiate(a);
            t.transform.parent = canvas.transform;
            t.name = a.name;
        }
    }

上边是两个我写的主要的方法 我们可以看到路径
我把名字弄成在unity可以调用的 这样比较方便使用
当然写成单例模式 就可以在其他脚本中动态调用了

public  string HeroName;
    private static Hero instance;
    public static Hero Instance { get => instance; set => instance = value; }
    private void Awake()
    {
        instance = this;
    }
    public void LoadFolderObject(string FolderName)//加载文件夹中所有场景中游戏物体
    {
        GameObject[] ObjectInfo = Resources.LoadAll<GameObject>("Prefebs/Hero/" + FolderName + "/Object");
        foreach (var a in ObjectInfo)
        {
            GameObject t = Instantiate(a);
            t.name = a.name;//正常实例化出来的带有(clone),消除(clone)
        }
    }
    public void LoadFolderUI(string FolderName)//加载文件夹路径中所有的UI文件
    {
        GameObject canvas = GameObject.Find("Canvas");
        GameObject[] UIInfo = Resources.LoadAll<GameObject>("Prefebs/Hero/"+ FolderName+ "/UI");
        foreach (var a in UIInfo)
        {
            GameObject t = Instantiate(a);
            t.transform.parent = canvas.transform;
            t.name = a.name;
        }
    }

经过测试没啥问题 大家可以作参考 希望对大家有用

public class HeroTest : MonoBehaviour
{
    private void Start()
    {
        Hero.Instance.LoadFolderObject("LiBai");
        Hero.Instance.LoadFolderUI("LiBai");
    }
}

unity3d动态加载地形 unity动态加载模型_UI_02


unity3d动态加载地形 unity动态加载模型_游戏_03


上边是scene没运行和运行之后的对比