public class L9 : MonoBehaviour
{
public AudioSource audioS;
private Texture tex;
// Start is called before the first frame update
void Start()
{
//Resources资源动态加载的作用
//一个工程当中可以有多个Resources文件夹,打包时Unity会自动打包到一起
//通过代码动态加载Resources文件夹下指定路径资源,避免繁琐的拖曳操作
//常用资源类型
//预设体对象 GameObject
//音效文件 AudioClip
//文本文件 TextAsset
//图片文件 Texture
//其他类型
//预设体对象加载需要实例化,其他资源一般加载之后直接使用
//资源同步加载 - 普通方法
//预设体对象 - 想要创建在场景上就必须要实例化
//第一步,加载预设体的资源文件,加载预设体的配置数据
Object obj = Resources.Load("Cube");
//第二部,创建预设体即在场景上实例化
Instantiate(obj);
//音效资源
Object obj2 =Resources.Load("Music/mfnf");
audioS.clip = obj2 as AudioClip;
audioS.Play();
//文本资源
//文本资源支持的格式 txt xml bytes json html csv
TextAsset ta = Resources.Load("TXT/Test") as TextAsset;
//文本内容
print(ta.text);
//字节数据组
print(ta.bytes);
//图片
tex = Resources.Load("Texture/1") as Texture;
//如果文件的名字相同,无法准确加载出你想要的内容
//解决方法
//加载指定类型的资源
tex = Resources.Load("TXT/Test",typeof(Texture)) as Texture;
//加载指定名字的所有资源
Object[] objs = Resources.LoadAll("TXT/Test");
foreach(Object item in objs)
{
if(item is Texture)
{
}
else if (item is TextAsset)
{
}
}
//资源同步加载的泛型方法
TextAsset ta2 = Resources.Load<TextAsset>("TXT/Test");
}
private void OnGUI()
{
GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
}
}
public class L10 : MonoBehaviour
{
private Texture tex;
// Start is called before the first frame update
void Start()
{
//异步加载就是内部新开一个线程进行资源加载,不会造成主线程卡顿
//异步加载不能马上得到加载的资源,至少要等一帧
//通过异步加载中的完成事件监听加载的完成
ResourceRequest rq = Resources.LoadAsync<Texture>("Texture/1");
//资源加载完成的事件函数监听,如果加载完成就会调用其中的事件
rq.completed += LoadOver;
//通过协程使用加载的资源
StartCoroutine(Load());
}
private void LoadOver(AsyncOperation rq)
{
//asser就是资源文件
tex = (rq as ResourceRequest).asset as Texture;
}
IEnumerator Load()
{
ResourceRequest rq = Resources.LoadAsync<Texture>("Texture/1");
//判断资源是否加载结束
while (!rq.isDone)
{
//打印当前加载进度
print(rq.progress);
yield return null;
}
//在得到该返回值之后,unity会自动判断资源是否加载完毕
yield return rq;
//在资源加载完毕之后就会执行后面的代码
tex = rq.asset as Texture;
}
private void OnGUI()
{
if(tex != null)
{
GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
}
}
}
public class L12 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//场景同步切换
//SceneManager.LoadScene("")
//用场景同步切换时,Unity会删除当前场景上所有对象,并加载下一个场景的相关信息
//场景异步切换
//通过事件回调函数异步加载
AsyncOperation ao = SceneManager.LoadSceneAsync("SampleScene");
//场景异步加载完毕后会自动切换场景
//场景异步加载结束后就会自动调用该事件
ao.completed += (a) =>
{
print("LoadOver");
};
//通过协程异步加载
//加载场景会把当前场景上没有特别处理的对象全部删除
//所以协程中的部分逻辑可能不会执行
//所以要让处理场景加载的脚本的依附对象在过场景时不被移除
DontDestroyOnLoad(gameObject);
StartCoroutine(LoadScene("SampleScene"));
}
IEnumerator LoadScene(string name)
{
AsyncOperation ao = SceneManager.LoadSceneAsync(name);
//此处可以在异步加载的同时处理一些逻辑,不会有影响
//在异步加载过程中去更新进度条
//第一种方法时利用异步加载的进度去更新,但不是特别准确,一般也不会直接用
while (!ao.isDone)
{
print(ao.progress);
yield return null;
}
yield return ao;//在异步加载完成之后才会进行处理的逻辑,如果想这后面的逻辑执行的话,就要脚本依附的对象不被移除
//第二种 根据自己的游戏规则定义进度条的变化条件
//比如yield return ao 也就是场景加载结束后更新20%进度
//接着去加载场景中其他信息
//比如加载完成怪物信息 进度条再更新20%
//加载完场景模型 加载完成 进度条更新到100%之后隐藏进度条
}
}