[避坑向]关于unity3D的一些莫名其妙的API

本文介绍了在Unity中使用Resource.load进行资源加载的方法,强调了不加文件后缀、使用泛型避免读取错误的要点。同时,详细阐述了AssetDatabase如何创建和加载资产,以及保存网格数据为.asset文件和预制体的过程,特别提到了保存预制体时对材质和网格的依赖。
摘要由CSDN通过智能技术生成

Resource.load

1.默认读取文件的目录是 "Assets/Resources",所有资源文件都放在该文件夹下。如果读取的文件有多种,建议在Assets/Resources下用“/子文件夹“”的命名方式创建子文件夹。如"Assets/Resources/Mesh"
2.读取的文件千万不要加文件的后缀!

3.读文件的时候,尽量避免这种写法

string fname = "Mesh/model1";

GameObject prb= (GameObject)Resources.Load(fname);

因为有时候可能会读不到对应文件。而且就算能读到"Mesh/model1",它也可能读不到"Mesh/model2"。尽管他们仅仅差一个数字。 这个bug不知道怎么回事,可能和unity版本有关。但是我用下面这种写法,就可以读到所有文件,强烈推荐

string fname = "Mesh/model1";

GameObject prb= Resources.Load<GameObject>(fname);

AssetDatabase.CreateAsset

保存unity动态生成的网格数据(Mesh),要保存为.asset文件

string asname = "Assets/Resources/Mesh/Mesh_model" + model_id.ToString() + ".asset";

AssetDatabase.CreateAsset(mesh, asname);

AssetDatabase.LoadAssetAtPath

加载网格(asset)或材质(mat)文件通用写法 也可以用Resources.Load()

Mesh m = AssetDatabase.LoadAssetAtPath(asname, typeof(Mesh)) as Mesh;

PrefabUtility.SaveAsPrefabAsset

将程序生成的网格持久化为预制体。注意预制体依赖本地网格(.asset)和材质文件(.mat),要先把材质和网格保存到本地。不然没法存储为预制体。最后记住要销毁实例对象!

GameObject prb = new GameObject("prb");

prb.AddComponent<MeshFilter>().mesh=m;//m->读取本地网格文件 添加到临时游戏对象

prb.AddComponent<MeshRenderer>().materials = materials;//materials->读取本地材质文件列表 添加到临时游戏对象

GameObject go = Instantiate(prb);//实例化临时对象

go.name = go.name.Replace("(Clone)", string.Empty) + model_id.ToString();//重命名

string pbname= "Assets/Resources/Mesh/Mesh_model" + model_id.ToString() + ".prefab";//设置预制体存储路径

PrefabUtility.SaveAsPrefabAsset(go, pbname);//保存临时对象为预制体

DestroyImmediate(go);//记住这个是保存为预制体的关键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值