Unity-Asset资源

Unity资源文件夹介绍 编辑时 在Asset文件下存在Resources和SteamingAsset文件夹; Resources 只读不可修改,打包时直接写死,没有办法通过热更新替换资源; 可以存放任何格式的资源; 通过Resources.Load加载; 一般只存登录UI,congfig配置等不会修改的文件; //加载 GameObject go = Resources.Load<GameObject>(path); Sprite sp = Resouces.Load(path,typeof(sprite)) as sprite; TextAsset txt = Resources.Load(path) as TextAsset; SteamingAssets 存放打包后Unity打包后的资源,也就是我说的AssetBundle(ab包); 可读可写,打包后移动端不能使用File类读取(用过www读取streamingAssetspath数据拷贝到persistentDataPath); 安装后 Application.dataPath 包含游戏数据文件夹的路径,app程序包安装路径(不常用); 1.UnityEditor——默认Assets——可读可写 using StreamReader/StreamWriter/异步 2.Andriod——data/app/xxx.apk——不可读不可写 3.IOS——Application/…..app/Data——可读不可写(读没意义) Application.streamingAssetsPath 数据流换成目录,外部数据文件(二进制,AssetsBundle.csv、数据裸露不加密); 1.除了Andriod都可读可写,使用WWW或者System.IO都可以; 2.Andriod只读,只能用WWW读写——第三方压缩/解压库实现读写(待研究); 3.安装包资源目录,不可修改; Application.presistentDataPath 持久化存储目录,应用更新、覆盖安装都不会清除; 1.全平台可读可写——stream和file都可以读写; 2.热更新资源存放目录; Application.temporaryCachePath 临时换成目录,可读可写(只有ios常用); AssetBundle 资源压缩文件(ab包),非路径,一种压缩文件的格式; AssetBundle Asset Bundle: AssetBundle 是一个存档文件,包含可在运行时加载的特定于平台的资源(模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表达彼此之间的依赖关系;例如 AssetBundle A 中的材质可以引用 AssetBundle B 中的纹理。为了通过网络进行有效传递,可以根据用例要求选用内置算法来压缩 AssetBundle(LZMA 和 LZ4)。 AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。 AssetBundle 中有什么: “AssetBundle”可以指两种不同但相关的东西。 首先是磁盘上的实际文件。对于这种情况,我们称之为 AssetBundle 存档,在本文档中简称“存档”。存档可以被视为一个容器,就像文件夹一样,可以在其中包含其他文件。这些附加文件包含两种类型: 序列化文件和资源文件。序列化文件包含分解为各个对象并写入此单个文件的资源。资源文件只是为某些资源(纹理和音频)单独存储的二进制数据块,允许我们有效地在另一个线程上从磁盘加载它们。 其次是通过代码进行交互以便从特定存档加载资源的实际 AssetBundle 对象。此对象包含一个映射,即从已添加到此存档的资源的所有文件路径到按需加载的资源所包含的对象之间的映射。 为 AssetBundle 分配资源 要为 AssetBundle 分配指定资源,请按照下列步骤操作: ...

February 20, 2022 · 6 min · LiuYingbo

Unity协程

yield yield 实质是一个语法糖,它让程序员能够更方便的去使用迭代器,通过 yield 你可以直接使用迭代器操作而不需要去实现 IEnumerable 和 IEnumerator,也不需要一个临时的 Collection 来完成迭代。 yield 有两种格式声明 yield return <expression>; yield break; using System.Collections; using UnityEngine; namespace UniRxLesson { public class YieldExample : MonoBehaviour { private void Start() { foreach (var empty in FiveTimes()) { Debug.Log("A"); } } private IEnumerable FiveTimes() { for (var i = 0; i < 5; i++) { yield return string.Empty; } } } } 输出结果为 A A A A A 每一次 foreach 的循环中都会调用迭代器方法,当 yield return 被执行到时,表达式的值会被返回,同时当前的函数的上下文信息被保存下来。下一次循环执行之时会重新从上一次停止的位置继续执行。你也可以使用 yield break 来终止迭代过程。 ...

February 9, 2022 · 3 min · LiuYingbo

Unity-编辑器扩展

一、菜单栏拓展 Menultem [Menultem("Test/CreatePanel/func1 %_Q"),true,1] 1、路径+快捷键,是否启用,排列顺序 2、配合Selection.Object选中物体文件夹时启用 3、方法必须是静态方法 [MenuItem("Test/OpenPanel %_Q",true)] public static bool IsSelected() { if (Selection.objects.Length > 0) return true; else return false; } [MenuItem("Test/OpenPanel %_Q",false)] public static void OpenPanel() { Undo.DestroyObjectImmediate(object); } 4、快捷键 符号 字符 % Ctrl # Shift & Alt LEFT/RIGHT/UP/DOWN 方向键 F1-F12 F功能键 _g 字母g 二、鼠标右键拓展 CONTEXT [MenuItem("CONTEXT/组件名/方法名(按钮名)")] 方法前加这句特性,可以在组件的鼠标右键菜单中添加相应的按钮方法,方法必须有参数MenuCommand [MenuItem("CONTEXT/Rigidbody/Clear")] static void ClearMassAndGravity(MenuCommand cmd) { Rigidbody rgd = cmd.context as Rigidbody; rgd.mass = 0.1f; rgd.useGravity = false; } ...

January 29, 2022 · 2 min · LiuYingbo