Resources资源加载

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%之后隐藏进度条

    }

}
posted @ 2025-03-21 20:54  cannedmint  阅读(116)  评论(0)    收藏  举报