Resources.load 和Instantiate 的理解

本文介绍了一个Unity脚本示例,展示了如何使用Resources.Load加载资源到内存,并使用Instantiate在场景中生成物体实例。该过程涉及物体的创建、位置设置、子物体管理和UI元素更新。
1 Resources.load 是将物体加载到内存中去,
2 Instantitate  是在Unity 中生成该物体,之后场景中就会出现该物体
示例:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Choose_LoadObject : MonoBehaviour {
    public List<Transform> transformList;
    public List<string> contentList= new List<string>();
    private string server;
    public GameObject  floatingPrefab;
    private GameObject target;
    // Use this for initialization
    void Start () {
        server = "http://www.vrbeyond.com/kejian/";
       // transformList = new List<Transform>();
        PlayerPrefs.SetString("server", server);
        StartCoroutine(Loadobj());
        target = GameObject.Find("Target");
 }
    // Update is called once per frame
    void Update()
    {
    }
    IEnumerator Loadobj() {
        string pathJD= server + "JD.php";
        using (WWW contentText = new WWW(pathJD))
        {
       
            yield return contentText;
            string contentString = contentText.text;
            //Debug.Log(contentString);
            string [] contentStringArray= contentString.Split('\n');
            for(int i = 0; i < contentStringArray.Length; i++)
            {
                if (i == 0) { continue; }
                if (i == 2)
                {
                    break;
                }
               
                string[] contentItemStringArray= contentStringArray[i].Split('$');
                 GameObject go= Instantiate<GameObject>(floatingPrefab);
                 go.name = contentItemStringArray[0]; // 节点
                 go.transform.Find("nameSprite/nametext").GetComponent<TextMesh>().text = contentItemStringArray[1]; //名字
                 go.transform.position = transformList[i].position;
                // go.transform.LookAt(target.transform);
                string prefabPath = "Hourse" + "/" + contentItemStringArray[0] + "/" + contentItemStringArray[0] + "_GJJG_Hand";
              // 加载到内存中去,
                GameObject modle=  Resources.Load<GameObject>(prefabPath);
              // 在场景中生成物体,生成后场景就会出现该物体实例
                GameObject modleGo = Instantiate<GameObject>(modle);

                modleGo.transform.SetParent(go.transform);
                modleGo.transform.localScale = new Vector3(0.12f, 0.12f, 0.12f);
                modleGo.transform.localPosition = new Vector3(0f, 0f, 0.5825443f);
                modleGo.transform.Find("_标注").gameObject.SetActive(false);
                modleGo.transform.Find("跟踪物体").gameObject.SetActive(false);
                // 加载但是没在场景中生成,但是场景中没有该物体,之后把图片赋值给要显示的UI 上
               string spritePath = "Hourse" + "/" + contentItemStringArray[0] + "/" + contentItemStringArray[0] + "_sprite";
                Sprite s = Resources.Load<Sprite>(spritePath);
                go.transform.Find("nameSprite").GetComponent<SpriteRenderer>().sprite = s;
            }
 
        }
    }
}
`Resources.Load` `Resources.LoadAsync` 是Unity中用于加载资源的两个方法,它们的区别主要体现在以下几个方面: #### 加载方式 - **`Resources.Load`**:这是一个同步加载方法,意味着在调用该方法时,主线程会暂停执行,直到资源完全加载完成。在此期间,游戏可能会出现卡顿现象,特别是当加载的资源较大时,这种卡顿会更加明显。例如,如果使用 `Resources.Load` 同步加载一个很大的预制体,会导致游戏卡顿掉帧 [^1]。 ```csharp // 同步加载一个GameObject类型的资源 GameObject prefab = Resources.Load<GameObject>("MyPrefab"); ``` - **`Resources.LoadAsync`**:这是一个异步加载方法,它不会阻塞主线程。在调用该方法后,主线程可以继续执行其他任务,资源会在后台线程中进行加载。当资源加载完成后,可以通过回调或轮询的方式获取加载好的资源。例如,使用协程来处理异步加载过程: ```csharp using System.Collections; using UnityEngine; public class AsyncLoadExample : MonoBehaviour { IEnumerator Start() { ResourceRequest request = Resources.LoadAsync<GameObject>("MyPrefab"); while (!request.isDone) { // 可以在这里显示加载进度 Debug.Log("Loading progress: " + request.progress); yield return null; } GameObject prefab = request.asset as GameObject; Instantiate(prefab); } } ``` #### 性能影响 - **`Resources.Load`**:由于是同步加载,会占用主线程的时间,对游戏的性能流畅度影响较大。尤其是在加载大资源时,可能会导致游戏帧率急剧下降,影响玩家体验 [^1]。 - **`Resources.LoadAsync`**:异步加载方式对主线程的影响较小,游戏可以在资源加载的同时继续正常运行,保持较好的流畅度。不过,异步加载会增加系统的资源开销,因为需要额外的线程来处理加载任务。 #### 使用场景 - **`Resources.Load`**:适用于需要立即使用资源,且资源较小的情况。例如,在游戏初始化阶段加载一些必要的小资源,如配置文件、小图标等。 - **`Resources.LoadAsync`**:适用于加载大资源,或者在游戏运行过程中需要加载资源的情况。例如,加载大型的场景模型、纹理等,以避免游戏卡顿。 #### 返回值 - **`Resources.Load`**:直接返回加载好的资源对象。 - **`Resources.LoadAsync`**:返回一个 `ResourceRequest` 对象,通过该对象可以获取加载进度最终加载好的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值