精华内容
下载资源
问答
  • 只贴代码主要是给自己看的## 标题 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TestResources : ...//作为预制体必须动态加载 GameObject c

    只贴代码主要是给自己看的## 标题

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;

    public class TestResources : MonoBehaviour
    {
    int index;
    [SerializeField] Texture[] Tex;
    public GameObject cube;//作为预制体必须动态加载
    GameObject clonegb;
    public GameObject gb;
    [SerializeField] AudioClip clip;
    public AudioSource ads;
    public Slider sl;
    //[SerializeField]Material mat;
    void Start()
    {
    //动态加载一个音频片段
    //clip = Resources.Load(“Audio/朴树 - 平凡之路”);
    //ads.clip = clip;//audiosource组件绑定的音频剪辑片段属性赋值
    //ads.Play();//播放音乐
    //Tex = Resources.LoadAll(“TechBlue”);
    //gb.GetComponent().material.mainTexture = Tex[0];

        动态加载一个材质球==================================
        //mat = Resources.Load<Material>("Materials/CapsualMat");
        //gb.GetComponent<MeshRenderer>().material = mat;
    
        动态加载一个游戏对象================================
        //cube = Resources.Load<GameObject>("Prefab/cube");
        克隆出来
        //clonegb = Instantiate(cube);
        换贴图
        //Tex = Resources.Load<Texture>("TechBlue/OUYA_O 24px");
        //clonegb.GetComponent<MeshRenderer>().material.mainTexture = Tex;
        //获取一张贴图资源:资源放在Resuorce文件夹下面,泛型格式传入参数,string类型的路径
        //Tex = Resources.Load<Texture>("TechBlue/OUYA_O 24px");
        //cube.GetComponent<MeshRenderer>().material.mainTexture = Tex;
        ResourcesLoadAsyncClip();//异步加载音频的方法
    }
    ResourceRequest request;//异步读取的返回值
    void ResourcesLoadAsyncClip()
    {
        request = Resources.LoadAsync<AudioClip>("Audio/朴树 - 平凡之路");//异步加载
    }
    
    void Update()
    {
        //实时的异步加载的当前进度,和slider进度条进行绑定
        if(request != null)
        {
            float current_loadingprogress = request.progress;//获取到当前加载的进度
            //slider赋值(0-1)
            sl.value = current_loadingprogress;
            sl.transform.Find("Handle Slide Area/Handle/Text").GetComponent<Text>().text = (current_loadingprogress * 100 + "%").ToString();
            if (request.isDone)
            {
                ads.clip = request.asset as AudioClip;
                ads.Play();
                request = null; //加载完成,置空。释放空间
            }
        }
        //if (Input.GetKeyDown(KeyCode.A))
        //{
        //    gb.GetComponent<MeshRenderer>().material.mainTexture = Tex[random(index)];
        //}
    }
    //int random(int a)
    //{
    //    while(a == index)
    //    {
    //        a = Random.Range(0, Tex.Length);
    //    }
    //    index = a;
    //    return index;
    //}
    

    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    using System.Security.Cryptography;

    public class TestSceneManager : MonoBehaviour
    {
    public Slider sl;
    AsyncOperation sceneAsync;
    AsyncOperation unloadAsync;//异步卸载某一个场景,返回值类型
    // Start is called before the first frame update
    void Start()
    {
    ///
    /// 同步加载场景
    //方式一:传入进来的是场景的index
    //SceneManager.LoadScene(0);
    //方式二:传入进来的是场景的名字
    //SceneManager.LoadScene(“test2”, LoadSceneMode.Single);//默认是single 加载单个场景
    //SceneManager.LoadScene(“test2”,LoadSceneMode.Additive);//两个场景共存
    ///
    ///
    /// 异步加载场景
    ///
    sl.value = 0;
    sceneAsync = SceneManager.LoadSceneAsync(“test2”, LoadSceneMode.Additive);
    sceneAsync.completed += OnSceneLoadCompelete;//委托,事件绑定,+=后面写方法名
    }
    void Update()
    {
    if(sceneAsync != null)
    {
    Debug.Log(sceneAsync.progress);//当前加载的进度
    sl.value = sceneAsync.progress;//赋值
    }
    sl.transform.Find(“Handle Slide Area/Handle/Text”).GetComponent ().text = (sl.value * 100 + “%”).ToString();
    //按下空格键,卸载某一个场景
    if (Input.GetKeyDown(KeyCode.Space))
    {
    unloadAsync = SceneManager.UnloadSceneAsync(“test2”);
    //也可以绑定一个事件
    unloadAsync.completed += OnSceneUnloadCompelete;
    }
    }
    void OnSceneUnloadCompelete(AsyncOperation asop)
    {
    //可以写卸载某一场景后的效果
    Debug.Log(“场景卸载完成”);
    }

    GameObject gb;
    public GameObject[] objs;
    void OnSceneLoadCompelete(AsyncOperation asop)
    {
        sl.value = asop.progress;//1
        //Debug.Log(asop);
        //Debug.Log(asop.progress);
        Debug.Log("场景加载完成");
        sceneAsync = null;
        print(SceneManager.GetActiveScene().name);//Scene1
        Scene scene1 = SceneManager.GetActiveScene();
        Scene scene2 = SceneManager.GetSceneByName("test2");
        Debug.Log(scene2.name);
        gb = GameObject.Find("Capsule");
        //获取某一个场景中的所有的位于根节点的对象
        //objs = scene2.GetRootGameObjects();
        //获取某一个场景中的所有的位于根节点的对象
        objs = scene1.GetRootGameObjects();
    }
    

    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class TestInput : MonoBehaviour
    {
    void Start()
    {

    }
    bool isDoubleClick = false;
    bool ismove = false;
    bool isRot = false;
    float rotateSpeed = 1;
    float beginTime;//点击开始的时间
    float endTime;//点击结束的时间
    bool clickDouble = false;//是否双击
    bool isScale = false;
    //原来第一次的触摸状态
    Touch oldTouch1;
    Touch oldTouch2;
    void Update()
    {
        Touch touch = Input.GetTouch(0);
        if (Input.touchCount == 1)//如果是单手指触摸
        {
            if(ismove && touch.phase == TouchPhase.Moved)//单手指移动
            {
                Vector3 touchPos = Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y, 0));
                //位置:赋值给Player
                transform.position = new Vector3(touchPos.x, touchPos.y, transform.position.z);
            }
            if (isRot && touch.phase == TouchPhase.Moved)//单手指旋转
            {
                Vector2 deltaPos = touch.deltaPosition;//本次触摸距离上一次触摸的位置的改变量
                if (deltaPos.x > 0 && deltaPos.magnitude > 1)//向右滑动
                {
                    //旋转
                    transform.Rotate(0, -deltaPos.magnitude * rotateSpeed, 0);
                }
                if (deltaPos.x < 0 && deltaPos.magnitude > 1)//向左滑动
                {
                    //旋转
                    transform.Rotate(0, deltaPos.magnitude * rotateSpeed, 0);
                }
            }
            if(isDoubleClick && touch.phase == TouchPhase.Began)//点击开始
            {
                beginTime = Time.time;
                float coldTime = beginTime - endTime;
                if(coldTime > 0 && coldTime < 1)//第二次开始点击的时间 减去第一次结束点击的时间,求出的时间差在一秒范围内,模拟双击
                {
                    clickDouble = true;
                }
            }
            if(isDoubleClick && touch.phase == TouchPhase.Ended)//点击结束
            {
                endTime = Time.time;
                if (clickDouble)//双击两次结束
                {
                    endTime = 0;
                    clickDouble = false;
                    //双击的时候让模型归位
                    InitFunction();
                }
            }
        }
        if(isScale && Input.touchCount == 2)//双手指触摸实现缩放
        {
            Touch touch1 = Input.GetTouch(0);
            Touch touch2 = Input.GetTouch(1);
            //第二次触摸的开始状态,不做任何处理(不做缩放的效果)
            if (touch1.phase == TouchPhase.Began)
            {
                oldTouch1 = touch;
                oldTouch2 = touch2;
                return;
            }
    
            //根据位置的改变量实现缩放
            float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);//第二个手指刚刚放到触摸屏上的时候,两个手指之间的距离
            float newDistance = Vector2.Distance(touch1.position, touch2.position);//两个手指的实时距离
            float offset = newDistance - oldDistance;//求出2次的距离的增量
            float scaleFactor = offset / 2000;//求出缩放系数
            Camera.main.orthographicSize += offset;//改变摄像机的正交尺寸的范围
            //限定摄像机视野范围的改变量
            Camera.main.orthographicSize = Mathf.Clamp(Camera.main.orthographicSize,0.6f,8);
        }
    }
    public void InitFunction()//模型回到最初位置
    {
        transform.position = new Vector3(0, 0, 0);
        transform.rotation = Quaternion.Euler(0, 180, 0);
        Camera.main.orthographicSize = 1; //将摄像机的尺寸大小设置为1
    }
    
    private void OnGUI()
    {
        GUILayout.Space(100);
        ismove = GUILayout.Toggle(ismove, "Move", GUILayout.Width(100), GUILayout.Height(30));
        isRot = GUILayout.Toggle(isRot, "Rotate", GUILayout.Width(100), GUILayout.Height(30));
        isDoubleClick = GUILayout.Toggle(isDoubleClick, "你今天双击了嘛",GUILayout.Width(200),GUILayout.Height(30));
        isScale = GUILayout.Toggle(isScale, "Scale", GUILayout.Width(200), GUILayout.Height(50));
    }
    

    }

    展开全文
  • 异常:ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 原代码: public class SkinTextureGroup : Pool<...

    异常:ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index

    原代码:

        public class SkinTextureGroup : Pool<SkinTextureGroup>
        {
            public Dictionary<string, Texture> m_DicPathAsset = new Dictionary<string, Texture>(8);
            public int m_Count = 0;
    
            public void StartLoad(List<string> paths, Action<Dictionary<string, Texture>> onSucceeded = null)
            {
                Clear();
                for (int i = 0; i < paths.Count; i++)
                {
                    SkinResourcesManager.Instance.LoadAssetOuter<Texture>(paths[i], (asset) =>
                    {
                        m_DicPathAsset.Add(paths[i], asset as Texture);
                        m_Count++;
                        if (m_Count >= paths.Count)
                        {
                            onSucceeded?.Invoke(m_DicPathAsset);
                        }
                    });
                }
    
            }
    
            public void Clear()
            {
                m_Count = 0;
                m_DicPathAsset.Clear();
            }
        }

    执行到m_DicPathAsset.Add(paths[i], asset as Texture);时,会抛出上面异常,但是editor模式下没问题,但是不管是打包到windows还是android都会存在数组越界的问题,经过log打印,发现i一直等于paths.Count,说明i并没有保存到每一个委托的环境中,而是共享的同一个,因此改造代码如果,不传入i可以解决问题:

        public class SkinTextureGroup : Pool<SkinTextureGroup>
        {
            public Dictionary<string, Texture> m_DicPathAsset = new Dictionary<string, Texture>(8);
            public int m_Count = 0;
    
            public void StartLoad(List<string> paths, Action<Dictionary<string, Texture>> onSucceeded = null)
            {
                Clear();
                for (int i = 0; i < paths.Count; i++)
                {
                    string name = paths[i];
                    SkinResourcesManager.Instance.LoadAssetOuter<Texture>(name, (asset) =>
                    {
                        m_DicPathAsset.Add(name, asset as Texture);
                        m_Count++;
                        if (m_Count >= paths.Count)
                        {
                            onSucceeded?.Invoke(m_DicPathAsset);
                        }
                    });
                }
    
            }
    
            public void Clear()
            {
                m_Count = 0;
                m_DicPathAsset.Clear();
            }
        }

    将带i的参数用临时变量string name = paths[i];这种方式保存起来,这样在委托会把当时的执行环境保存,从而保证结果正确

    展开全文
  • unity 异步加载场景

    2019-12-01 21:25:22
    当我们在unity进行场景跳转的时候,我们需要学会进行异步加载,因为同步加载在加载资源过多的场景的时候会造成卡顿,而使用异步加载的话就不用担心这个问题。这里主要的方法是使用协程的方法进行异步加载。 首先准备...

    当我们在unity进行场景跳转的时候,我们需要学会进行异步加载,因为同步加载在加载资源过多的场景的时候会造成卡顿,而使用异步加载的话就不用担心这个问题。这里主要的方法是使用协程的方法进行异步加载。

    首先准备三个场景,主要出来的效果就是从场景一跳转到加载场景二,最后再跳转到最终需要的场景界面三。

    场景二的主要功能呢,是用来做UI,显示跳转的进度(就是下面这种效果)
    在这里插入图片描述
    所以我们需要在场景二中,放置一个sliderr控件,然后在放置一个空物体作为异步加载的控制脚本,最后添加如下脚本:(脚本转自https://blog.csdn.net/ChinarCSDN/article/details/80947281,自己用的时候稍作了修改,不过很详细哦)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    
    /// <summary>
    /// 加载场景 —— 脚本挂载前场景
    /// </summary>
    public class ChinarLoadScene : MonoBehaviour
    {
        private Slider slider;          //滑动条
        int            currentProgress; //当前进度
        int            targetProgress;  //目标进度
    
    
        private void Start()
        {
            currentProgress = 0;
            targetProgress  = 0;
            slider          = GameObject.Find("Slider").GetComponent<Slider>();
            StartCoroutine(LoadingScene()); //开启协成
        }
    
    
        /// <summary>
        /// 异步加载场景
        /// </summary>
        /// <returns>协成</returns>
        private IEnumerator LoadingScene()
        {
            AsyncOperation asyncOperation       = SceneManager.LoadSceneAsync(1); //异步加载1号场景
            asyncOperation.allowSceneActivation = false;                          //不允许场景立即激活//异步进度在 allowSceneActivation= false时,会卡在0.89999的一个值,这里乘以100转整形
            while (asyncOperation.progress < 0.9f)                                //当异步加载小于0.9f的时候
            {
                targetProgress = (int) (asyncOperation.progress * 100); //异步进度在 allowSceneActivation= false时,会卡在0.89999的一个值,这里乘以100转整形
                yield return LoadProgress();
            }
            targetProgress = 100; //循环后,当前进度已经为90了,所以需要设置目标进度到100;继续循环
            yield return LoadProgress();
            asyncOperation.allowSceneActivation = true; //加载完毕,这里激活场景 —— 跳转场景成功
        }
    
    
        /// <summary>
        /// 由于需要两次调用,在这里进行简单封装
        /// </summary>
        /// <returns>等一帧</returns>
        private IEnumerator<WaitForEndOfFrame> LoadProgress()
        {
            while (currentProgress < targetProgress) //当前进度 < 目标进度时
            {
                ++currentProgress;                            //当前进度不断累加 (Chinar温馨提示,如果场景很小,可以调整这里的值 例如:+=10 +=20,来调节加载速度)
                slider.value = (float) currentProgress / 100; //给UI进度条赋值
                yield return new WaitForEndOfFrame();         //等一帧
            }
        }
    }
    
    展开全文
  • unity中,如果加载的资源过大的话,使用同步加载便会产生卡顿的现象,为了保证玩家的游戏体验,我们法通常采用多线程或者使用引擎本身自带的异步加载方法,接下来,就让我带领大家一起去了解一下异步加载吧我们在...

    52df5143bb76008c74cf4e23326920c9.png

    在unity中,如果加载的资源过大的话,使用同步加载便会产生卡顿的现象,为了保证玩家的游戏体验,我们法通常采用多线程或者使用引擎本身自带的异步加载方法,接下来,就让我带领大家一起去了解一下异步加载吧

    我们在Unity 中新建两个场景,分别命名为OneScene,TwoScene,接下来,我们会利用异步加载从场景TwoScene跳转到OneScene;

    26c12124033357bdf946e4fdd2583968.png

    这是TwoScene场景,注意下,要将Image Type的类型改为 Filled,我们会通过改变fillAmount值改变数据加载进度

    接下来我们开始敲代码(将代码挂在Canvas上)

    df401f2d107f6cf1ca741bb4b037bba4.png

    20f26ae2e65259af9e94f022a6cc9431.png

    using UnityEngine;

    using UnityEngine.UI;

    using UnityEngine.SceneManagement;

    using System;

    public class LoadingWnd : MonoBehaviour

    {

    public LoadingWnd loadingWnd; //加载界面

    public const string OneScene = "OneScene"; //需要跳转的场景

    public Text txtFG; //文本的数据显示

    public Image ImgFG; //图片的显示

    public void Start()

    {

    DontDestroyOnLoad(this); //加载完成后不销毁UI

    EnterLogin(); //跳转

    LodWnd(); //初始化

    }

    public void EnterLogin()

    {

    loadingWnd.gameObject.SetActive(true); //显示UI

    AsyneLoadScene(OneScene); //通过异步加载跳转到OneScene

    }

    public Action prgCB = null; //封装好委托,用于更新的回调

    public void AsyneLoadScene(string sceneName)

    {

    AsyncOperation sceneAsync = SceneManager.LoadSceneAsync(sceneName); //通过异步加载的接口拿到异步操作

    prgCB = () =>

    {

    float val = sceneAsync.progress; //代表异步加载的值

    loadingWnd.SetProgress(val);

    if (val == 1) //当值为一时,完成异步

    {

    prgCB = null;

    sceneAsync = null;

    loadingWnd.gameObject.SetActive(false);

    }

    };

    }

    public void LodWnd()

    {

    txtFG.text = "0"; //文字初始化为0

    ImgFG.fillAmount = 0; //进度条初始化

    }

    public void SetProgress(float prg)

    {

    txtFG.text = (int)(prg * 100) + "%"; //文本的计算方法

    ImgFG.fillAmount = prg;

    }

    private void Update() //更新的回调,每帧调用

    {

    if(prgCB!=null)

    {

    prgCB();

    }

    }

    }

    最后放上源码,大家有不懂得可以评论区问我哦

    展开全文
  • Unity 异步加载 解决方案

    千次阅读 2018-08-13 17:39:05
    今天主要研究Unity异步加载 新的异步加载接口 需要命名空间 using UnityEngine.SceneManagement; 使用 //异步加载 SceneManager.LoadSceneAsync(loadName,LoadSceneMode.Additive); SceneMan...
  • unity 异步加载

    2019-12-16 12:08:27
     uiText.text = "加载资源:" + displayProgress + "%";  }  asyncOperation.allowSceneActivation = true;  }  void SetLoadingPercentage(int percentage)  {  sliders.value = (float)percentage ...
  • Unity 异步加载 异步等待库下载地址: https://github.com/svermeulen/Unity3dAsyncAwaitUtil/releases 携程转异步的写法举例: 携程写法: IEnumerator Start() { StartCorutine(LoadResource(“XXX”)); } ...
  • Unity异步加载小心得

    2020-02-29 18:04:47
    由此加载该类场景最好使用异步加载,通过异步加载给出加载进度提示,优化场景过渡的体验. 先上效果 可以看出来,异步加载提示进度,同步加载直接卡在哪里. 上代码 using System.Collections; using System.Collection.....
  • Unity异步加载和读取外部图片资源

    千次阅读 2018-10-25 19:35:03
    后台线程读取本地或者云端png\jpg图片。 背景:做VR开发中,最经常用到的一个功能就是加载外部的全景图,并且在头盔里显示。但是一张4K的全景图动辄10M...幸运的时Unity的新版本中为我们提供了在辅助线程(worker t...
  • Unity纹理异步加载 因项目需要使用Unity加载外部纹理资源,图片资源多,且图片较大。 Unity提供的WWW / UnityWebRequest加载纹理时并非使用异步加载,导致应用卡顿。 也没有搜索到相关的插件,所以决定自己撸。 话...
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class ... } } // Update is called once per frame void Update() { //加载进度 Debug.Log(request.progress); } }
  • 1,创建一个场景,作为准备场景 ...2,创建一个按钮,点击后开始加载场景 3,创建一个plane,下设一个slider和一个文本,作为读取界面 4,创建一个空物体放场景控制脚本,名为Sencemanager 5,创建脚本 ...
  • 学习目标: using UnityEngine;.../// 脚本功能:场景异步加载的进度条显示 /// </summary> public class LoadingScene : MonoBehaviour { // 滑动条 public Slider processBar; // Application.
  • 1.新建3个场景 ... 3.制作第二个场景需要用到的进度条...Text里内容是加载进度数字。同样Canavs上挂上MyLevelManager脚本,记得给Inspector脚本slider和text赋值(拖进去)。 4.第三个场景,随便创建复制了一...
  • Unity异步场景加载

    2020-01-02 09:59:50
    画面卡住,这都是正常现象,加载资源需要时间,配置、网速等条件较好时,加载的时间会减少,如果一般,卡住的时间就可能会边长,此时就需要一个过渡场景,通过异步加载的方式,在后台先加载资源,再去调用那个比较卡...
  • 三步搞定Unity异步加载场景

    千次阅读 2019-03-26 18:22:07
    如果想从一个场景过渡到另一个包含资源较多的场景,必然需要等待一段时间,这时候就需要有一个滑动条来动态显示加载进度了。本案例提到三个场景:A(原始的场景)、B(加载场景)和C(想要切换到的场景)。当然,很...
  • 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务。在同步加载游戏场景的时候通常会使用方法 Application.LoadLevel(“yourScene”); 这句代码执行完毕后程序会干什么呢??如下...
  • 关于Unity资源异步加载的研究

    万次阅读 2013-04-09 14:25:26
    异步加载资源是现在的主流技术,于是先废话一段。 先从DX说起 最早的想法是即使Unity 不支持异步加载,也可以用C#的多线程机制自己实现,不过这个想法明显行不通。玩过DX的都知道异步加载需要涉及到显示设备的...
  • 这个是一款 Unity3D异步加载场景资源 ,界面简洁漂亮的加载画面,内含多个样式,提供给广大的Unity3D学者研究。
  • 来确定要加载的场景索引。 &直接赋值将对应组件拖拽上即可 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; ...
  • 异步加载场景类似,只是加载资源一般不用提供加载资源UI界面,开始加载资源后直接yield return让程序运行外部代码即可: 1.同步加载资源: /// <summary> /// 同步加载资源 /// </summary> /// &...
  • 为了节省内存,游戏的一些资源往往需要在运行时(runtime)动态加载。如果资源本身加载比较耗时,采用同步方法会产生卡顿现象,对此...而Unity脚本API对许多加载方式都有相应的异步方法,因此我们需要对Unity异步加载
  • unity同步异步加载

    2020-02-17 15:48:57
    分别是同步加载和异步加载 这两种方法各有优缺点 同步加载 优点 :管理起来比较方便,而且资源准备好了是可以及时返回的 缺点:速度比较慢 异步加载 优点:加载比较快 缺点:调用比较麻烦,不确定什么时候资源准备...
  • Unity异步加载场景资源进度界面

    千次阅读 2017-03-20 19:45:12
    导入NGUI资源包,在Unity3D菜单栏中选中NGUI-Open-Prefab Toolbar,在Prefab Toolbar窗口中,选中Control - Colored Progress Bar拖拽至Hierarchy面板,修改名字为"Loading"。 在Hierarchy面板,为Loading添加子...
  • http://www.xuanyusong.com/archives/1427 异步任务相信大家应该不会陌生那么本章内容MOMO将带领大家学习Unity中的一些异步任务。在同步加载游戏场景的时候通常会使用方法 Application.LoadLevel(“yourScene”); 这...
  • Unity中,时常会遇到加载某个场景或者加载某个资源并且用一个进度条来显示加载进度,那么就要用到异步加载了,或者还有时,游戏需要一个加载场景的进度条,为了好看,但是又没有很大的资源需要加载,那么这时就...
  • 原创文章如需转载请注明:转载自雨松MOMO程序研究院本文链接地址:Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)  异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,685
精华内容 1,474
关键字:

unity异步加载资源