UnityVR--ResourceManager--资源管理

news/2024/10/17 22:13:28/

目录

简介

加载资源的几种方式

资源加载的管理器Resload.cs

ResLoad类的应用举例


简介

  这里记录一个资源管理工具集,提供一些方法将一些Object、Prefab直接从Assets文件夹中加载到场景中。

加载资源的几种方式

  在项目中我们经常需要使用一些随时取用的东西,可能是预制体格式,也可能是任何格式,如材质、文档甚至场景。在之前的文章中主要采取了下面的1、2两种方式获取:

  1. 设置public变量并在面板中指定相应资源

  这个方法之前使用过非常多了,只要在脚本中public一个变量,然后到面板中拖入相应的对象即可。如:  

public GameObject Bullet;//加入一个子弹

 

  优点:直观

  缺点:一旦脚本修改或重新挂载很容易忘记设置

  2. 在场景中寻找

  也就是一开始就将资源加载到场景中,在脚本中使用GameObject.Find来查找,比如之前在机械臂场景2中,脚本中根据路径去找机械臂的子节点:

  优点:方便,不用做过多设置

  缺点:GameObject.Find或transform.Find等,运行时会遍历场上所有节点(包括所有子节点),比较消耗资源。

  3. 从Assets文件夹下加载

 

   将资源放置在“Assets/Resources”文件夹下,且这个文件夹名字不能改。需要使用时,用Unity的API“Resources.Load”加载。定义如下,其中的参数 path,就是以Resources文件夹作为父目录的:

        public static Object Load(string path)public static T Load<T>(string path) where T : Object

资源加载的管理器Resload.cs

  Unity的Resources类中有许多有用的资源加载方法。在它的基础上,我们可以根据自身项目的需要,建立一个资源管理文件ResLoad.cs,以便于在项目中方便地调用各种类型的文件。下面的ResLoad.cs中定义了3个加载资源的方法,包括泛型方法,以便于能够加载任何类型的文件,之后可能会根据需要再增加其他方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//从Assets加载资源的方法集合
public class ResLoad : SingleMono<ResLoad>  //继承Mono的单例
{public GameObject LoadPrefab(string resName){//通过资源名添加预制体,资源需要放在Resources根目录GameObject go = Resources.Load<GameObject>(resName);if(go==null){//判断是否加载成功Debug.LogError(resName+"ResLoad:Resources加载路径失败");return null;}return Instantiate(go);  //如果加载成功,则实例化它//因为ResLoad类是继承了SingleMono<ResLoad>的单例,//这个单例是继承MonoBehaviour的,因此直接可以使用Instantiate方法实例化//否则就需要用GameObject来调用//return GameObject.Instantiate(go);}public T LoadAsset<T>(string pathName,string resName) where T:Object{//通过路径加载资源,当然也可以先判空一下return Resources.Load<T>(pathName + "/" + resName);}public T LoadAsset<T>(string resName)where T :Object{//通过资源名加载,比如这个资源直接放在根目录下return Resources.Load<T>(resName);}
}

ResLoad类的应用举例

 ResLoad类继承了SingleMono,因此在使用时不需要每次new对象,使用Instance字段就可以新建或访问到项目内唯一的实例。以下是调用举例:

  1. 在工具集Tools.cs中,加载了Resources文件夹中名为“line”的材质文件:

line.material=Resload.Instance.LoadAsset<Material>("line"); 

  2. 主角使用子弹时,按下Space按键,加载Resources文件夹中名为“Bullet”的预制体:

Bullet = Resload.Instance.LoadPrefab("Bullet");


http://www.ppmy.cn/news/79830.html

相关文章

STL --- 2、容器 (7)queue

目录 1、std::queue 的基本操作 2、std::queue 队列的应用场景 3、std::queue 实例 队列&#xff08;Queue&#xff09;是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;类似于现实生活中排队等待服务的场景。队列中的元素只能在队列的末尾添加&#xff0…

局部最小值问题

局部最小值问题 自写&#xff1a; // arr 相邻的数不相等&#xff01; 返回一个局部最小的下标public static int oneMinIndex(int[] arr) {if(arr null || arr.length 0) {return -1;}if(arr.length 1) {return 0;}int L 0;int R arr.length - 1;if(arr[L] < arr[L 1…

ARM的状态传送器指令、软中断指令与协处理指令(软中断具体实现)

1.状态寄存器传送指令: 作用&#xff1a;访问&#xff08;读写&#xff09;CPSR寄存器 CPSR寄存器结构图&#xff1a; 前八位的作用&#xff1a; Bit[4:0] &#xff1a;不同的电平组合表示不同的模式&#xff0c;[10000]User [10001]FIQ [10010]IRQ [10011]SVC …

分布式运用之ELK企业级日志分析系统

1.ELK的相关知识 1.1 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch&#xff1a; 是基于Lucene&#xff0…

浅析Koa2中控制器

控制器 什么是控制器 拿到路由分配的任务&#xff0c;并执行 路由的功能是根据不同的 url, 来分配不同的任务。 控制器是拿到路由分配的任务并执行&#xff0c;是注册在路由中的中间件。 所以在 koa 中, 控制器也是一个中间件。 为什么要使用控制器 获取HTTP请求参数处理…

Unix/C/C++进阶--线程 pthread_creat() return 1失败

Unix/C/C进阶--pthread_creat return 1失败 1 介绍1.1 man pthread_create1.2 一般失败原因1.3 最大进程/线程数&#xff08;理论&#xff09;1.3 最大进程/线程数&#xff08;实际&#xff09;1.4 查看Linux实际运行的总线程数1.5 查看运行的进程1.6 查看进程信息1.7 top -H 一…

qt quick(qml)通过arcgis导入自定义格式地图(Windows 版本)

参考ArcGIS Maps SDK for Qt 参考Display a map 安装 预先安装的软件 安装ArcGIS SDK 点击ArcGIS Maps SDK for Qt 注册账号 要注册成developer版本用户的&#xff0c;不然之后可能没办法生成API 下载 下载之后安装&#xff0c;一路next就可以了 在QT中创建ArcGIS项目…

一种适用于大量租户大量角色权限系统设计

前言 权限管理是每个系统不可缺少的一部分&#xff0c;大部分开发者应该都设计过权限管理系统&#xff0c;很多开发者学习的第一个项目可能就是权限管理系统。但是常见的权限设计在租户量非常大、角色数量非常多时会存在角色权限表数据量指数增长的情况&#xff0c;本文介绍一…