最近打王者荣耀的时候偶然发现 当我们在换皮肤的时候
场景中的很多东西会同时换 如果我们在开发的时候一个一个把他们放入场景中
这是很耗时间的 我们完全可以把他们分类在一个文件夹中 动态加载出来
比如王者荣耀中每换一款皮肤 很多东西都会改 比如模型 背景 动画等还有就是大量的UI(金额 说明等等)
开发的时候一个一个弄到场景中 想想就头大
动态加载的实现
我们的思路还是使用Resources的load
我们事先把文件分类 场景中物体分为一类 UI分为一类
这是我的分类 我们的代码是要获取路径的
代码
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");
}
}
上边是scene没运行和运行之后的对比