diff --git a/CHANGELOG.md b/CHANGELOG.md index ac2bef9..aba7da2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,26 @@ ## [Unrealse] -添加一个方法,可以将任意数值转为分数形式。 + + +## [0.5.7] 2026-05-27 + +添加: +* 一个数学方法 GetFraction,可以将任意数值转为分数形式。 +* 语义化版本号 SemanticVersion,可以识别主流的版本号格式,并且符合判断规则。 +* 添加基于字符串构建器的join方法。 +* 添加了基于非平方根距离的快速判断扩展方法。 +* 添加了关于RectTransform的快速尺寸设置方法。 +* 联合对象池添加了对原件的标识。 +* 添加纹理宏。 +* 添加使用windows文件窗口的窗口调用函数(包含文件和目录访问)。 +* 配置宏添加了获取方法。 +* json序列化器添加了部分基础类型的null处理方案。 +优化: +* TextBlockBuilder文本拼接逻辑,减少GC。 +* 优化枚举库中的对比方法,改为了泛型模型,避免枚举装箱操作 +修复: +* 对象池宏中联合对象池间接释放对象有可能报错导致无法释放的问题。 ## [0.5.6] 2025-12-30 @@ -94,7 +113,7 @@ UI库: ## [0.5.0] - 2025-07-04 -中间那个版本感觉不吉利,所以没有,并不是缺少了这部分版本。我是坚定的唯物主义者这点并没有改变,我甚至在小区里买过44号车位(它确实要便宜一些),虽然后面长租给别人了。 +我故意跳过了4.0版本,并不是缺少了这部分版本。 调整了插件编译结构 插件的部署地址换到了自己的[服务器](https://xeric.zicp.fun/). 本体切换使用il2cpp版本的json dll,后面会将这部分内容放在dll外面,避免对某一特定版本dll依赖。 diff --git a/Editor/DeconstructionStyle.dll b/Editor/DeconstructionStyle.dll index b7c4918..bf26503 100644 Binary files a/Editor/DeconstructionStyle.dll and b/Editor/DeconstructionStyle.dll differ diff --git a/Editor/DeconstructionStyle.dll.meta b/Editor/DeconstructionStyle.dll.meta index c75c2cb..dc9d62d 100644 --- a/Editor/DeconstructionStyle.dll.meta +++ b/Editor/DeconstructionStyle.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bcbfe98d29b703044a524e421fcacc2a +guid: 114790f70dba8284a84b68083baa8418 PluginImporter: externalObjects: {} serializedVersion: 2 diff --git a/Editor/DeconstructionStyle.pdb b/Editor/DeconstructionStyle.pdb index f4cd915..f4f0aa3 100644 Binary files a/Editor/DeconstructionStyle.pdb and b/Editor/DeconstructionStyle.pdb differ diff --git a/Editor/DeconstructionStyle.pdb.meta b/Editor/DeconstructionStyle.pdb.meta index 0722b88..c1fa59e 100644 --- a/Editor/DeconstructionStyle.pdb.meta +++ b/Editor/DeconstructionStyle.pdb.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6116f350f3c2bca4dbb63afc5febe614 +guid: e705db20b7214dc4cbfe3089b7219737 DefaultImporter: externalObjects: {} userData: diff --git a/Editor/XericLibraryEditor.dll b/Editor/XericLibraryEditor.dll index e71f494..1059df5 100644 Binary files a/Editor/XericLibraryEditor.dll and b/Editor/XericLibraryEditor.dll differ diff --git a/Editor/XericLibraryEditor.dll.meta b/Editor/XericLibraryEditor.dll.meta index 18b27e0..65a945a 100644 --- a/Editor/XericLibraryEditor.dll.meta +++ b/Editor/XericLibraryEditor.dll.meta @@ -11,53 +11,17 @@ PluginImporter: isExplicitlyReferenced: 0 validateReferences: 1 platformData: - - first: - : Any - second: - enabled: 0 - settings: - Exclude Editor: 0 - Exclude Linux64: 1 - Exclude OSXUniversal: 1 - Exclude Win: 1 - Exclude Win64: 1 - first: Any: second: - enabled: 1 + enabled: 0 settings: {} - first: Editor: Editor second: enabled: 1 settings: - CPU: AnyCPU DefaultValueInitialized: true - OS: AnyOS - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: x86_64 - first: Windows Store Apps: WindowsStoreApps second: diff --git a/Editor/XericLibraryEditor.pdb b/Editor/XericLibraryEditor.pdb index 98212ab..d88da5b 100644 Binary files a/Editor/XericLibraryEditor.pdb and b/Editor/XericLibraryEditor.pdb differ diff --git a/README.md b/README.md index 1dcdde9..93deb1d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

Xeric Library (WebGL)

+

Xeric Library

个人发布页面(最新) Gitee发布页面 @@ -22,7 +22,7 @@ 欢迎使用Xeric Library, 这是一个专注代码的扩展库 - * 专注Unity成员语法, 扩展多种基本类型的数据结构的Linq语法/语法糖, 提供: 函数平滑、 多项式计算、 权重拟合、 过程分级、 工业控制、 曲线绘制、 路径设置、 对象控制、 迭代扩展、 空间变换、 独特结构、 文本格式、 类型转换、 机器编码、 开发调试、 动态生成、 几何创建、 快速池化、 导航寻路、 隔离控制、 隔离输入、 语义化委托、 反射超驰、 数学常数、 单位换算、 排序算法、 程序调用、 网络连接等快捷用法。 + * 专注Unity成员语法, 扩展多种基本类型的数据结构的Linq语法/语法糖, 提供: 函数平滑、 多项式计算、 权重拟合、 过程分级、 工业控制、 曲线绘制、 路径设置、 对象控制、 迭代扩展、 空间变换、 独特结构、 文本格式、 类型转换、 机器编码、 开发调试、 动态生成、 几何创建、 快速池化、 导航寻路、 隔离控制、 隔离输入、 语义化委托、 反射超驰、 数学常数、 单位换算、 排序算法、 程序调用、 网络连接、 windows窗口控制等快捷用法。 * 扩展特殊类型, 包括且不限于: 多维布尔、 样条曲线、 超级单例、 多例系统、 邻居网络、 四叉树、 字典树、 软引用封装器等。 diff --git a/Runtime/Deconstruction.dll b/Runtime/Deconstruction.dll index 0be5c9f..5c447a2 100644 Binary files a/Runtime/Deconstruction.dll and b/Runtime/Deconstruction.dll differ diff --git a/Runtime/Deconstruction.pdb b/Runtime/Deconstruction.pdb index bee57b1..541cf76 100644 Binary files a/Runtime/Deconstruction.pdb and b/Runtime/Deconstruction.pdb differ diff --git a/Runtime/Helper/XericSceneHelper.cs b/Runtime/Helper/XericSceneHelper.cs new file mode 100644 index 0000000..70279cc --- /dev/null +++ b/Runtime/Helper/XericSceneHelper.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Deconstruction.Runtime +{ + public static class XericSceneHelper + { + public delegate void SceneOperationAsyncDelegate(TimeSpan elapsedTime, float process, bool isDone); + + /// + /// 获取索引对应的场景名称 + /// + /// + /// + public static string GetSceneBuildIndexName(int sceneBuildIndex) + { + return IsSceneBuildIndexValid(sceneBuildIndex) + ? SceneManager.GetSceneByBuildIndex(sceneBuildIndex).name + : string.Empty; + } + + /// + /// 协程加载场景 + /// + /// + /// + /// + public static IEnumerator LoadScene(string sceneName, SceneOperationAsyncDelegate loadProcess = null) + { + if (string.IsNullOrEmpty(sceneName)) + { + Debug.LogError("加载场景的名称为空或无效,请检查后重试"); + yield break; + } + AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); + yield return AsyncOperation(asyncLoad, loadProcess); + } + /// + /// 协程加载场景 + /// + /// + /// + /// + public static IEnumerator LoadScene(int sceneBuildIndex, SceneOperationAsyncDelegate loadProcess = null) + { + if (IsSceneBuildIndexValid(sceneBuildIndex)) + { + Debug.LogError($"加载场景的索引({sceneBuildIndex})无效,请检查后重试"); + yield break; + } + AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); + yield return AsyncOperation(asyncLoad, loadProcess); + } + + + /// + /// 协程卸载场景 + /// + /// + /// + /// + /// + public static IEnumerator UnloadSceneAsync(string sceneName, SceneOperationAsyncDelegate loadProcess = null, bool froceUnloadUnusedAssets = false) + { + if (string.IsNullOrEmpty(sceneName)) + { + Debug.LogError("加载场景的名称为空或无效,请检查后重试"); + yield break; + } + AsyncOperation asyncUnload = SceneManager.UnloadSceneAsync(sceneName); + yield return AsyncOperation(asyncUnload, loadProcess); + if (froceUnloadUnusedAssets) + UnloadUnusedAssets(); + } + /// + /// 协程卸载场景 + /// + /// + /// + /// + /// + public static IEnumerator UnloadSceneAsync(int sceneBuildIndex, SceneOperationAsyncDelegate loadProcess = null, bool froceUnloadUnusedAssets = false) + { + if (IsSceneBuildIndexValid(sceneBuildIndex)) + { + Debug.LogError($"加载场景的索引({sceneBuildIndex})无效,请检查后重试"); + yield break; + } + AsyncOperation asyncUnload = SceneManager.UnloadSceneAsync(sceneBuildIndex); + yield return AsyncOperation(asyncUnload, loadProcess); + if (froceUnloadUnusedAssets) + UnloadUnusedAssets(); + } + + private static IEnumerator AsyncOperation(AsyncOperation asyncOperator, SceneOperationAsyncDelegate loadProcess) + { + DateTime startTime = DateTime.Now; + do + { + loadProcess?.Invoke(DateTime.Now - startTime, asyncOperator.progress, false); + yield return null; + } while (!asyncOperator.isDone); + loadProcess?.Invoke(DateTime.Now - startTime, asyncOperator.progress, true); + } + + /// + /// 设置为主场景 + /// + /// + /// + public static bool SetActiveScene(string sceneName) + { + if (string.IsNullOrEmpty(sceneName)) + { + Debug.LogError("期望设置为主场景的名称为空或无效,请检查后重试"); + return false; + } + var scene = SceneManager.GetSceneByName(sceneName); + return SceneManager.SetActiveScene(scene); + } + + public static bool IsSceneBuildIndexValid(int sceneBuildIndex) + => sceneBuildIndex < 0 || sceneBuildIndex > SceneManager.sceneCountInBuildSettings; + + // 可选:强制进行垃圾回收,更彻底地释放内存 + public static void UnloadUnusedAssets() + { + Resources.UnloadUnusedAssets(); + System.GC.Collect(); + } + } +} \ No newline at end of file diff --git a/Runtime/Helper/XericSceneHelper.cs.meta b/Runtime/Helper/XericSceneHelper.cs.meta new file mode 100644 index 0000000..6dc74e9 --- /dev/null +++ b/Runtime/Helper/XericSceneHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6dea79c8847b402ca99d1b51b3dd108d +timeCreated: 1776905969 \ No newline at end of file diff --git a/Runtime/SerializerHelper.dll b/Runtime/SerializerHelper.dll index 104a1d0..77f5882 100644 Binary files a/Runtime/SerializerHelper.dll and b/Runtime/SerializerHelper.dll differ diff --git a/Runtime/SerializerHelper.pdb b/Runtime/SerializerHelper.pdb index 251370e..4786c5d 100644 Binary files a/Runtime/SerializerHelper.pdb and b/Runtime/SerializerHelper.pdb differ diff --git a/Runtime/UI/TmpText/TMPHyperlinkManager.cs b/Runtime/UI/TmpText/TMPHyperlinkManager.cs index 4ece97b..745553d 100644 --- a/Runtime/UI/TmpText/TMPHyperlinkManager.cs +++ b/Runtime/UI/TmpText/TMPHyperlinkManager.cs @@ -2,10 +2,13 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +#if ODIN_INSPECTOR using Sirenix.OdinInspector; +#endif using TMPro; using UnityEngine; using UnityEngine.Events; +using UnityEngine.Pool; using XericLibrary.Runtime.MacroLibrary; using XericLibrary.Runtime.Type; @@ -14,6 +17,28 @@ namespace Deconstruction.UI.TmpText /// /// TMP超链接点击管理组件 /// + /// + /// 在tmp文本中使用id块创建超链接区域,鼠标点击后,该tmp文本会发出事件。 + /// 超链接管理器可以快速管理这个事件,在事件根节点上挂载这个组件后,执行刷新操作将会自动绑定所有带有超链接的文本到此,然后由管理器发送统一的触发事件。 + /// 超链接事件由id块的id决定,当用户触发超链接后,管理器上的 onClickLink 委托会被触发。 + /// + /// 当超链接管理器的层级下包含另一个超链接管理器时,默认不会触发这个管理器下的超链接。 + /// 你可以在使用 GetChildrenTmpText2Hyperlink 追踪时手动设置 includeRepeatedMarking 为 ture 来强制包含。 + /// GetChildrenTmpText2Hyperlink是主要的用来绑定所有文本到管理器的方法,如果你只是为了刷新文本,可以直接调用 RefreshHyperLink 。 + /// + /// 注意在使用Xchart,XchartUI等动态创建tmp文本组件的功能时,需要频繁进行刷新。 + /// 特别是xchartui在刷新数据后,tmp文本会换成新的,这时必须重新刷新,否则表格中的超链接点击会没有反应。 + /// + /// 疑难解答: + /// * 文本超链接点击没有反应。 + /// 首先检查格式是否为 ,注意末尾一定要带上结束标记,不然tmp不识别。 + /// 其次检查是否开启了射线检测,文本上方有没有其他也处于射线检测的对象遮挡。 + /// 可以开启每个文本上的 自动解决射线检测问题 来解决。 + /// + /// * 文本没有被管理器识别。 + /// 检查文本中是否带有的标记,只要有一个标记就会被识别为可能的链接,然后挂载超链接脚本。 + /// 被挂载超链接脚本的文本后续无论如何都会被识别为超链接。 + /// public class TMPHyperlinkManager : MonoBehaviour { /// @@ -32,7 +57,16 @@ namespace Deconstruction.UI.TmpText [SerializeField] public UnityEvent onClickLink = new UnityEvent(); - + /// + /// 当前超链接管理器下的所有超链接 + /// + [ShowInInspector] + public List Children { get; internal set; } + + /// + /// 子项发生变更 + /// + private bool _dirty; /// /// 当前摄像机 /// @@ -66,6 +100,17 @@ namespace Deconstruction.UI.TmpText _camera = canvas.worldCamera; } + protected void LateUpdate() + { + if (Children == null || Children.Count <= 0) + return; + for (int i = 0; i < Children.Count; i++) + { + if (Children[i].autoFixRayCastTargetState) + Children[i].SetRayCastVisible(); + } + } + /// /// 注册链接回调函数 /// @@ -225,11 +270,11 @@ namespace Deconstruction.UI.TmpText _tempGetChildrenTmpText2Hyperlink.Count > 0) return _tempGetChildrenTmpText2Hyperlink; - var children = includeRepeatedMarking + var children = (includeRepeatedMarking ? transform.GetChildrenBFS() - : transform.GetChildrenBFS(); + : transform.GetChildrenBFS()).ToList(); - var result = new List(); + var result = ListPool.Get(); var hyperlinkType = typeof(TMPHyperlinkReceiver); var tmpTextType = typeof(TMP_Text); @@ -256,7 +301,11 @@ namespace Deconstruction.UI.TmpText result.Add(child.gameObject.AddComponent()); } } - + + _dirty = true; + if (Children != null) + ListPool.Release(Children); + Children = result; return result; } diff --git a/Runtime/UI/TmpText/TMPHyperlinkReceiver.cs b/Runtime/UI/TmpText/TMPHyperlinkReceiver.cs index 91b144e..0231b99 100644 --- a/Runtime/UI/TmpText/TMPHyperlinkReceiver.cs +++ b/Runtime/UI/TmpText/TMPHyperlinkReceiver.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +#if ODIN_INSPECTOR using Sirenix.OdinInspector; +#endif using TMPro; using UnityEngine; using UnityEngine.Events; @@ -79,8 +81,18 @@ namespace Deconstruction.UI.TmpText protected virtual void OnEnable() { + // xchart会自动设置射线不可见 if (autoFixRayCastTargetState) - _tmpText.raycastTarget = true; + SetRayCastVisible(); + } + + internal void SetRayCastVisible() + { + if (!_tmpText) + return; + if (_tmpText.raycastTarget) + return; + _tmpText.raycastTarget = true; } public void OnPointerClick(PointerEventData eventData) diff --git a/Runtime/XericCecil.dll b/Runtime/XericCecil.dll index e37408a..3f455c5 100644 Binary files a/Runtime/XericCecil.dll and b/Runtime/XericCecil.dll differ diff --git a/Runtime/XericLibrary.dll b/Runtime/XericLibrary.dll index c4a865c..23b1932 100644 Binary files a/Runtime/XericLibrary.dll and b/Runtime/XericLibrary.dll differ diff --git a/Runtime/XericLibrary.pdb b/Runtime/XericLibrary.pdb index 6e6367f..eaa107a 100644 Binary files a/Runtime/XericLibrary.pdb and b/Runtime/XericLibrary.pdb differ diff --git a/Runtime/XericLibrary.xml b/Runtime/XericLibrary.xml index 42e7b1d..b305bc5 100644 --- a/Runtime/XericLibrary.xml +++ b/Runtime/XericLibrary.xml @@ -5796,6 +5796,36 @@ + + + il指令分析库 + + + + + 从类上获取IL程序集 + + + + + + + 检查类上的方法是否调用了基类的类 + + + + + + + + 检查一个方法里是否通过base.调用基类的方法 + + + + + + + 菜单宏 @@ -10490,20 +10520,6 @@ - - - 在场景中查找组件 - - - - - - - 在场景中查找组件 - - - - 获取所有场景中的组件对象 @@ -15771,15 +15787,6 @@ 原生支持各种宏用法的mono脚本 - - - 组件跳线 - - - - 跳线基于场景进行组件查找,并保存关联在该实例类中供后续成员快速查找。 - - 严格模式脚本 @@ -17018,15 +17025,6 @@ - - - 单例首选派生类 - - - 只在目标单例的类型不明确,泛型类型与单例模式不成封闭关系的时候,且这样的类型不止一个的时候。 - 使用这个特性标记实际需要实例化的类,在某些特殊的情况下,单例会自动根据特性进行生成。 - - 带有历史记录的脚本 diff --git a/Samples~/HorizonLineOrbit/SesothoPeManager.cs b/Samples~/HorizonLineOrbit/SesothoPeManager.cs index 5a69311..a0e43f0 100644 --- a/Samples~/HorizonLineOrbit/SesothoPeManager.cs +++ b/Samples~/HorizonLineOrbit/SesothoPeManager.cs @@ -12,7 +12,6 @@ using Deconstruction.Manager; using Deconstruction.Tool; using Deconstruction.Type.Area; using Deconstruction.Type.Serialize; -using Newtonsoft.Json; using SerializerHelper.Type; using UnityEngine.UI; using XericLibrary.Runtime.Debuger; @@ -148,7 +147,7 @@ namespace SesothoLine if (Input.GetKeyDown(KeyCode.S)) { var obj = _wiresTool.ToolSerializeDispost(); - serializeContext = JsonConvert.SerializeObject(obj); + serializeContext = MacroFile.JsonSerializerFormatter.formatter.Serializer(obj); Debug.Log(obj.ToString()); } if (Input.GetKeyDown(KeyCode.D)) @@ -159,7 +158,7 @@ namespace SesothoLine return; } - var obj = JsonConvert.DeserializeObject(serializeContext); + var obj = MacroFile.JsonSerializerFormatter.formatter.Deserializer(serializeContext); _wiresTool.ToolDiserializDispost(obj); } diff --git a/package.json b/package.json index f055319..144de8e 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "com.lrss3.deconstruction", - "displayName": "Xeric Library(WebGL)", - "version": "0.5.6", + "displayName": "Xeric Library", + "version": "0.5.7", "unity": "2021.3", - "description": "\u6b22\u8fce\u4f7f\u7528Xeric Library, \u8fd9\u662f\u4e00\u4e2a\u4e13\u6ce8\u4ee3\u7801\u7684\u6269\u5c55\u5e93 \r\n\r\n * \u4e13\u6ce8Unity\u6210\u5458\u8bed\u6cd5, \u6269\u5c55\u591a\u79cd\u57fa\u672c\u7c7b\u578b\u7684\u6570\u636e\u7ed3\u6784\u7684Linq\u8bed\u6cd5/\u8bed\u6cd5\u7cd6, \u63d0\u4f9b\uff1a \u51fd\u6570\u5e73\u6ed1\u3001 \u591a\u9879\u5f0f\u8ba1\u7b97\u3001 \u6743\u91cd\u62df\u5408\u3001 \u8fc7\u7a0b\u5206\u7ea7\u3001 \u5de5\u4e1a\u63a7\u5236\u3001 \u66f2\u7ebf\u7ed8\u5236\u3001 \u8def\u5f84\u8bbe\u7f6e\u3001 \u5bf9\u8c61\u63a7\u5236\u3001 \u8fed\u4ee3\u6269\u5c55\u3001 \u7a7a\u95f4\u53d8\u6362\u3001 \u72ec\u7279\u7ed3\u6784\u3001 \u6587\u672c\u683c\u5f0f\u3001 \u7c7b\u578b\u8f6c\u6362\u3001 \u673a\u5668\u7f16\u7801\u3001 \u5f00\u53d1\u8c03\u8bd5\u3001 \u52a8\u6001\u751f\u6210\u3001 \u51e0\u4f55\u521b\u5efa\u3001 \u5feb\u901f\u6c60\u5316\u3001 \u5bfc\u822a\u5bfb\u8def\u3001 \u9694\u79bb\u63a7\u5236\u3001 \u9694\u79bb\u8f93\u5165\u3001 \u8bed\u4e49\u5316\u59d4\u6258\u3001 \u53cd\u5c04\u8d85\u9a70\u3001 \u6570\u5b66\u5e38\u6570\u3001 \u5355\u4f4d\u6362\u7b97\u3001 \u6392\u5e8f\u7b97\u6cd5\u3001 \u7a0b\u5e8f\u8c03\u7528\u3001 \u7f51\u7edc\u8fde\u63a5\u7b49\u5feb\u6377\u7528\u6cd5\u3002 \r\n\r\n * \u6269\u5c55\u7279\u6b8a\u7c7b\u578b, \u5305\u62ec\u4e14\u4e0d\u9650\u4e8e: \u591a\u7ef4\u5e03\u5c14\u3001 \u6837\u6761\u66f2\u7ebf\u3001 \u8d85\u7ea7\u5355\u4f8b\u3001 \u591a\u4f8b\u7cfb\u7edf\u3001 \u90bb\u5c45\u7f51\u7edc\u3001 \u56db\u53c9\u6811\u3001 \u5b57\u5178\u6811\u3001 \u8f6f\u5f15\u7528\u5c01\u88c5\u5668\u7b49\u3002 \r\n\r\n * \u6269\u5c55\u5404\u79cd\u5e38\u7528\u811a\u672c: \u6e38\u620f\u4ea4\u4e92\u3001 \u754c\u9762\u9002\u914d\u3001 \u5f31\u6269\u5c55\u3001 \u7ed8\u5236\u5de5\u5382\u3001 SQL\u6269\u5c55\u3002 \r\n\r\n * \u517c\u5bb9\u4e0d\u89c4\u8303\u7a0b\u5e8f: \u9488\u5bf9\u4e0d\u89c4\u8303\u6216\u6beb\u65e0\u8bbe\u8ba1\u89c4\u5219\u53ef\u8a00\u7684\u4ee3\u7801, \u63d0\u4f9b\u4e86\u66f4\u591a\u57fa\u4e8e\u53cd\u5c04, CIL\u7279\u6027\u7b49\u5e95\u5c42\u8bed\u6cd5\u7684\u7a0b\u5e8f\u6269\u5c55, \u4ee5\u4fbf\u5feb\u901f\u5b9e\u73b0\u76ee\u7684: \r\n1. \u811a\u672c\u6ca1\u6709\u7ee7\u627f\u5355\u4f8b? \"\u8d85\u7ea7\u5355\u4f8b\"\u4e0d\u9700\u8981\u58f0\u540d, \u4e5f\u4e0d\u9700\u8981\u4fee\u6539\u4efb\u4f55\u539f\u6765\u7684\u811a\u672c\u5185\u5bb9, \u5f84\u76f4\u8c03\u7528\u5c31\u662f\u5355\u4f8b\u3002\r\n2. \u6570\u636e\u7ed3\u6784\u5b57\u6bb5\u5197\u4f59\u91cd\u590d? \"\u8f6f\u63a5\u53e3\" (SoftInterface) \u652f\u6301\u5feb\u901f\u6267\u884c\u53cd\u5c04\u83b7\u53d6\u548c\u8bbe\u7f6e\uff0c\u65b9\u6cd5\u59d4\u6258\uff0c\u5b57\u6bb5\u5c5e\u6027\u4e00\u884c\u8c03\u7528\u3002 \r\n3. untiy\u5bf9\u8c61\u8981\u9075\u5faa\u751f\u547d\u5468\u671f\u6c60\u5316\u592a\u9ebb\u70e6? \"\u8054\u5408\u5bf9\u8c61\u6c60\" (MacroPool.UnionSet) \u76f4\u63a5\u5c06\u8bbe\u5b9a\u9879\u76ee\u5f00\u653e\u5230inspector\u4e0a\u914d\u7f6e\uff0c\u4ee3\u7801\u4e2d\u53ea\u9700\u8981get\u548crelease\u5c31\u53ef\u4ee5! \r\n4. \u7a0b\u5e8fUI\u6846\u67b6\u548c\u903b\u8f91\u6846\u67b6\u9ad8\u5ea6\u8026\u5408\u65e0\u4ece\u4e0b\u624b? \u6709\u70b9\u9ebb\u70e6, \u4e0d\u8fc7\u83dc\u5355\u7279\u6027, \u67e5\u627e\u7279\u6027, \u547d\u540d\u6807\u8bb0\u7279\u6027\u53ef\u4ee5\u5e2e\u52a9\u4f60\u65e0\u89c6\u5185\u5bb9\u67e5\u627e\u5b57\u6bb5\u5c5e\u6027\u65b9\u6cd5\u7c7b\u578b\u7b49\u5185\u5bb9, \u76f4\u63a5\u5c06\u7c7b\u4f20\u5165\u5c31\u80fd\u7a0b\u5e8f\u5316\u751f\u6210\u83dc\u5355\u754c\u9762\u3002 \r\n5. \u9a71\u52a8ui\u7684\u6570\u636e\u91cf\u592a\u5927? \u63d0\u4f9b\u591a\u79cd\u57fa\u4e8eUI\u6846\u67b6\u7684\u6570\u636e\u7ed3\u6784\u865a\u62df\u5316\u6280\u672f, \u4f7f\u7528\u865a\u62df\u5316\u62c6\u5206\u6570\u636e\u53ef\u4ee5\u6bcf\u6b21\u5237\u65b0\u7684\u538b\u529b\u3002 \u4f7f\u7528\u6b64\u529f\u80fd\u9700\u8981\u5b89\u88c5XericUIActionVessel\u63d2\u4ef6, \u4ee3\u7801\u4ee5\u811a\u672c\u5448\u73b0\uff0c\u76f4\u63a5\u6d4f\u89c8\uff0c\u7f16\u5199\u65f6\u9075\u5faa\u7cbe\u7ec6\u7684\u5de5\u5382\u6743\u80fd\u5212\u5206\uff01 \r\n6. \u559c\u6b22\u51fd\u6570\u5f0f\u53d8\u6210\u548c\u4fbf\u6377\u7684\u8bed\u6cd5\u7cd6? \u63d2\u4ef6\u63d0\u4f9b\u591a\u79cd\u5de5\u5177\u7c7b: \u679a\u4e3e\u53ef\u4ee5\u4f7f\u7528`MacroEnum`\u5206\u7c7b\u548c`MacroEnum`\u6269\u5c55; \u6570\u5b66, \u5411\u91cf, \u51e0\u4f55, \u6570\u636e\u7ed3\u6784\u6269\u5c55, \u5e38\u89c1\u7b97\u6cd5, \u5e38\u7528\u5b57\u7b26\u8ba1\u7b97\u5df2\u7ecf\u5168\u90e8\u5185\u5d4c`MacroMath`\u5206\u7c7b; \r\n7. \u9700\u8981\u4f7f\u7528\u9ad8\u7ea7\u6570\u636e\u7ed3\u6784? \u5927\u9876\u5806, \u56db\u53c9\u6811, \u516b\u53c9\u6811, \u5b57\u5178\u6811, \u65f6\u95f4\u6233, \u591a\u6bb5\u7ebf, \u8d1d\u585e\u5c14, \u591a\u7ef4\u5e03\u5c14(\u6bd4\u7279\u77e2\u91cf), \u6bd4\u7279\u56fe, \u53cc\u751f\u54c8\u5e0c\u8868, \u76f8\u90bb\u7f51\u683c\u7b49\u5185\u5bb9\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u3002 \r\n8. \u60f3\u8981\u7acb\u523b\u80fd\u591f\u5728\u573a\u666f\u4e2d\u79fb\u52a8\u89d2\u8272? \u7b2c\u4e00\u4eba\u79f0, \u7b2c\u4e09\u4eba\u79f0, \u4e0a\u5e1d\u89c6\u89d2\u5df2\u7ecf\u51c6\u5907\u5c31\u7eea! \r\n9. \u538c\u70e6\u590d\u6742\u7684\u6309\u952e\u68c0\u67e5\u903b\u8f91? \u6309\u952e\u5b8f (MacroKey) \u63d0\u4f9b\u72b6\u6001\u8868\u5904\u7406\u66f4\u591a\u6309\u952e, \u53ef\u4ee5\u8bc6\u522b\u77ed\u6309, \u957f\u6309, \u53cc\u51fb, \u8fde\u51fb, \u62d6\u62fd, \u4ee5\u53ca\u5b83\u4eec\u7684\u6309\u4e0b\u548c\u91ca\u653e\u72b6\u6001! \u4e14\u53ef\u4ee5\u9009\u62e9\u4ee5\u65f6\u95f4, \u5750\u6807\u7b49\u5171\u8ba14\u79cd\u6a21\u5f0f\u89e6\u53d1, \u652f\u6301\u65b0\u8f93\u5165\u7cfb\u7edf, \u6ee1\u8db3\u7edd\u5927\u90e8\u5206\u573a\u666f\u7684\u7ec6\u5206\u9700\u6c42\u3002 \r\n10. \u9700\u8981\u9690\u85cf\u65e5\u5fd7\u8c03\u7528\u6808\u4fe1\u606f? XericLogger \u53ef\u4ee5\u51cf\u5c11\u65e5\u5fd7\u8f93\u51fa\u5185\u5bb9\u3002 \r\n11. \u9700\u8981\u66f4\u591a\u8c03\u8bd5\u4fe1\u606f? \u63d0\u4f9b\u53ef\u4ee5\u548c\u865a\u5e7b\u539f\u751f\u5ab2\u7f8e\u7684Gizmos\u8c03\u8bd5\u663e\u793a\u529f\u80fd\u3002 \r\n11. \u62c5\u5fc3\u517c\u5bb9\u6027\u5417? \u7a0b\u5e8f\u4e3b\u8981\u57fa\u4e8e2022\u7248\u672c\u5f00\u53d1, \u5411\u4e0b\u517c\u5bb92021, \u5411\u4e0a\u652f\u63016000, \u4e0d\u6d89\u53ca\u6e32\u67d3\u7ba1\u7ebfAPI, \u6709\u9488\u5bf9webgl\u7248\u672c\u7684\u5355\u72ec\u6784\u5efa\u7248\u672c, \u4e14\u7ecf\u8fc7\u9879\u76ee\u5b9e\u6218\u9a8c\u8bc1\u3002 \r\n\r\n\u66f4\u591a\u7f16\u8f91\u5668\u529f\u80fd\u53c2\u8003: \r\n * \u5b89\u88c5Xeric Blueprint Graph\u4ee5\u83b7\u53d6Unity\u4e0a\u84dd\u56fe\u8282\u70b9\u529f\u80fd, \u5e76\u652f\u6301Xeric\u51fd\u6570\u5e93\u529f\u80fd\u3002\r\n * \u5b89\u88c5Xeric UI Graph\u4ee5\u83b7\u53d6\u84dd\u56fe\u5316UI\u751f\u6210\u529f\u80fd, \u4f7f\u7528\u84dd\u56fe\u903b\u8f91\u63a7\u5236UI\u4ea4\u4e92, \u751f\u6210\u903b\u8f91, \u5e76\u652f\u6301Xeric\u51fd\u6570\u5e93\u529f\u80fd\u3002\r\n * \u5b89\u88c5Digital Twin Tool\u4ee5\u83b7\u53d6\u5e38\u7528\u8c03\u8bd5\u5de5\u5177\u96c6\u3002\r\n * \u5b89\u88c5Nexus Frame Flow\u4ee5\u83b7\u53d6\u5de5\u4f5c\u67b6\u6784\u6d41\u5904\u7406\u529f\u80fd\u3002\r\n * \u5b89\u88c5Xeric Editor\u8f85\u52a9\u5f15\u64ce\u5927\u7eb2\u7f8e\u5316\u7ec4\u4ef6\u3001 \u8d44\u6e90\u5783\u573e\u5904\u7406\u7ec4\u4ef6\u3001 \u8d44\u6e90\u7f13\u5b58\u7ec4\u4ef6\u3001 \u5feb\u901f\u622a\u56fe\u529f\u80fd, \u4ee5\u53ca\u66f4\u591a\u5feb\u6377\u952e\u529f\u80fd", + "description": "\u6b22\u8fce\u4f7f\u7528Xeric Library, \u8fd9\u662f\u4e00\u4e2a\u4e13\u6ce8\u4ee3\u7801\u7684\u6269\u5c55\u5e93 \r\n\r\n * \u4e13\u6ce8Unity\u6210\u5458\u8bed\u6cd5, \u6269\u5c55\u591a\u79cd\u57fa\u672c\u7c7b\u578b\u7684\u6570\u636e\u7ed3\u6784\u7684Linq\u8bed\u6cd5/\u8bed\u6cd5\u7cd6, \u63d0\u4f9b\uff1a \u51fd\u6570\u5e73\u6ed1\u3001 \u591a\u9879\u5f0f\u8ba1\u7b97\u3001 \u6743\u91cd\u62df\u5408\u3001 \u8fc7\u7a0b\u5206\u7ea7\u3001 \u5de5\u4e1a\u63a7\u5236\u3001 \u66f2\u7ebf\u7ed8\u5236\u3001 \u8def\u5f84\u8bbe\u7f6e\u3001 \u5bf9\u8c61\u63a7\u5236\u3001 \u8fed\u4ee3\u6269\u5c55\u3001 \u7a7a\u95f4\u53d8\u6362\u3001 \u72ec\u7279\u7ed3\u6784\u3001 \u6587\u672c\u683c\u5f0f\u3001 \u7c7b\u578b\u8f6c\u6362\u3001 \u673a\u5668\u7f16\u7801\u3001 \u5f00\u53d1\u8c03\u8bd5\u3001 \u52a8\u6001\u751f\u6210\u3001 \u51e0\u4f55\u521b\u5efa\u3001 \u5feb\u901f\u6c60\u5316\u3001 \u5bfc\u822a\u5bfb\u8def\u3001 \u9694\u79bb\u63a7\u5236\u3001 \u9694\u79bb\u8f93\u5165\u3001 \u8bed\u4e49\u5316\u59d4\u6258\u3001 \u53cd\u5c04\u8d85\u9a70\u3001 \u6570\u5b66\u5e38\u6570\u3001 \u5355\u4f4d\u6362\u7b97\u3001 \u6392\u5e8f\u7b97\u6cd5\u3001 \u7a0b\u5e8f\u8c03\u7528\u3001 \u7f51\u7edc\u8fde\u63a5\u7b49\u5feb\u6377\u7528\u6cd5\u3002 \r\n\r\n * \u6269\u5c55\u7279\u6b8a\u7c7b\u578b, \u5305\u62ec\u4e14\u4e0d\u9650\u4e8e: \u591a\u7ef4\u5e03\u5c14\u3001 \u6837\u6761\u66f2\u7ebf\u3001 \u8d85\u7ea7\u5355\u4f8b\u3001 \u591a\u4f8b\u7cfb\u7edf\u3001 \u90bb\u5c45\u7f51\u7edc\u3001 \u56db\u53c9\u6811\u3001 \u5b57\u5178\u6811\u3001 \u8f6f\u5f15\u7528\u5c01\u88c5\u5668\u7b49\u3002 \r\n\r\n * \u6269\u5c55\u5404\u79cd\u5e38\u7528\u811a\u672c: \u6e38\u620f\u4ea4\u4e92\u3001 \u754c\u9762\u9002\u914d\u3001 \u5f31\u6269\u5c55\u3001 \u7ed8\u5236\u5de5\u5382\u3001 SQL\u6269\u5c55\u3002 \r\n\r\n * \u517c\u5bb9\u4e0d\u89c4\u8303\u7a0b\u5e8f: \u9488\u5bf9\u4e0d\u89c4\u8303\u6216\u6beb\u65e0\u8bbe\u8ba1\u89c4\u5219\u53ef\u8a00\u7684\u4ee3\u7801, \u63d0\u4f9b\u4e86\u66f4\u591a\u57fa\u4e8e\u53cd\u5c04, CIL\u7279\u6027\u7b49\u5e95\u5c42\u8bed\u6cd5\u7684\u7a0b\u5e8f\u6269\u5c55, \u4ee5\u4fbf\u5feb\u901f\u5b9e\u73b0\u76ee\u7684: \r\n1. \u811a\u672c\u6ca1\u6709\u7ee7\u627f\u5355\u4f8b? \"\u8d85\u7ea7\u5355\u4f8b\"\u4e0d\u9700\u8981\u58f0\u540d, \u4e5f\u4e0d\u9700\u8981\u4fee\u6539\u4efb\u4f55\u539f\u6765\u7684\u811a\u672c\u5185\u5bb9, \u5f84\u76f4\u8c03\u7528\u5c31\u662f\u5355\u4f8b\u3002\r\n2. \u6570\u636e\u7ed3\u6784\u5b57\u6bb5\u5197\u4f59\u91cd\u590d? \"\u8f6f\u63a5\u53e3\" (SoftInterface) \u652f\u6301\u5feb\u901f\u6267\u884c\u53cd\u5c04\u83b7\u53d6\u548c\u8bbe\u7f6e\uff0c\u65b9\u6cd5\u59d4\u6258\uff0c\u5b57\u6bb5\u5c5e\u6027\u4e00\u884c\u8c03\u7528\u3002 \r\n3. untiy\u5bf9\u8c61\u8981\u9075\u5faa\u751f\u547d\u5468\u671f\u6c60\u5316\u592a\u9ebb\u70e6? \"\u8054\u5408\u5bf9\u8c61\u6c60\" (MacroPool.UnionSet) \u76f4\u63a5\u5c06\u8bbe\u5b9a\u9879\u76ee\u5f00\u653e\u5230inspector\u4e0a\u914d\u7f6e\uff0c\u4ee3\u7801\u4e2d\u53ea\u9700\u8981get\u548crelease\u5c31\u53ef\u4ee5! \r\n4. \u7a0b\u5e8fUI\u6846\u67b6\u548c\u903b\u8f91\u6846\u67b6\u9ad8\u5ea6\u8026\u5408\u65e0\u4ece\u4e0b\u624b? \u6709\u70b9\u9ebb\u70e6, \u4e0d\u8fc7\u83dc\u5355\u7279\u6027, \u67e5\u627e\u7279\u6027, \u547d\u540d\u6807\u8bb0\u7279\u6027\u53ef\u4ee5\u5e2e\u52a9\u4f60\u65e0\u89c6\u5185\u5bb9\u67e5\u627e\u5b57\u6bb5\u5c5e\u6027\u65b9\u6cd5\u7c7b\u578b\u7b49\u5185\u5bb9, \u4f7f\u7528 `XericUIActionVessel` \u63d2\u4ef6\u66f4\u662f\u5141\u8bb8\u76f4\u63a5\u5c06\u7c7b\u4f20\u5165\u5c31\u80fd\u7a0b\u5e8f\u5316\u751f\u6210\u83dc\u5355\u754c\u9762\u3002 \r\n5. \u9a71\u52a8ui\u7684\u6570\u636e\u91cf\u592a\u5927? \u63d0\u4f9b\u591a\u79cd\u57fa\u4e8eUI\u6846\u67b6\u7684\u6570\u636e\u7ed3\u6784\u865a\u62df\u5316\u6280\u672f, \u4f7f\u7528\u865a\u62df\u5316\u62c6\u5206\u6570\u636e\u53ef\u4ee5\u6bcf\u6b21\u5237\u65b0\u7684\u538b\u529b\u3002 \u4f7f\u7528\u6b64\u529f\u80fd\u9700\u8981\u5b89\u88c5XericUIActionVessel\u63d2\u4ef6, \u4ee3\u7801\u4ee5\u811a\u672c\u5448\u73b0\uff0c\u76f4\u63a5\u6d4f\u89c8\uff0c\u7f16\u5199\u65f6\u9075\u5faa\u7cbe\u7ec6\u7684\u5de5\u5382\u6743\u80fd\u5212\u5206\uff01 \r\n6. \u559c\u6b22\u51fd\u6570\u5f0f\u7f16\u7a0b\u548c\u4fbf\u6377\u7684\u8bed\u6cd5\u7cd6? \u63d2\u4ef6\u63d0\u4f9b\u591a\u79cd\u5de5\u5177\u7c7b: \u679a\u4e3e\u53ef\u4ee5\u4f7f\u7528`MacroEnum`\u5206\u7c7b\u548c`MacroEnum`\u6269\u5c55; \u6570\u5b66, \u5411\u91cf, \u51e0\u4f55, \u6570\u636e\u7ed3\u6784\u6269\u5c55, \u5e38\u89c1\u7b97\u6cd5, \u5e38\u7528\u5b57\u7b26\u8ba1\u7b97\u5df2\u7ecf\u5168\u90e8\u5185\u5d4c`MacroMath`\u5206\u7c7b; \r\n7. \u9700\u8981\u4f7f\u7528\u9ad8\u7ea7\u6570\u636e\u7ed3\u6784? \u5927\u9876\u5806, \u56db\u53c9\u6811, \u516b\u53c9\u6811, \u5b57\u5178\u6811, \u65f6\u95f4\u6233, \u591a\u6bb5\u7ebf, \u8d1d\u585e\u5c14, \u591a\u7ef4\u5e03\u5c14(\u6bd4\u7279\u77e2\u91cf), \u6bd4\u7279\u56fe, \u53cc\u751f\u54c8\u5e0c\u8868, \u76f8\u90bb\u7f51\u683c\u7b49\u5185\u5bb9\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u3002 \r\n8. \u60f3\u8981\u7acb\u523b\u80fd\u591f\u5728\u573a\u666f\u4e2d\u79fb\u52a8\u89d2\u8272? \u7b2c\u4e00\u4eba\u79f0, \u7b2c\u4e09\u4eba\u79f0, \u4e0a\u5e1d\u89c6\u89d2\u5df2\u7ecf\u51c6\u5907\u5c31\u7eea! \r\n9. \u538c\u70e6\u590d\u6742\u7684\u6309\u952e\u68c0\u67e5\u903b\u8f91? \u6309\u952e\u5b8f (MacroKey) \u63d0\u4f9b\u72b6\u6001\u8868\u5904\u7406\u66f4\u591a\u6309\u952e, \u53ef\u4ee5\u8bc6\u522b\u77ed\u6309, \u957f\u6309, \u53cc\u51fb, \u8fde\u51fb, \u62d6\u62fd, \u4ee5\u53ca\u5b83\u4eec\u7684\u6309\u4e0b\u548c\u91ca\u653e\u72b6\u6001! \u4e14\u53ef\u4ee5\u9009\u62e9\u4ee5\u65f6\u95f4, \u5750\u6807\u7b49\u5171\u8ba14\u79cd\u6a21\u5f0f\u89e6\u53d1, \u652f\u6301\u65b0\u8f93\u5165\u7cfb\u7edf, \u6ee1\u8db3\u7edd\u5927\u90e8\u5206\u573a\u666f\u7684\u7ec6\u5206\u9700\u6c42\u3002 \r\n10. \u9700\u8981\u9690\u85cf\u65e5\u5fd7\u8c03\u7528\u6808\u4fe1\u606f? XericLogger \u53ef\u4ee5\u51cf\u5c11\u65e5\u5fd7\u8f93\u51fa\u5185\u5bb9\u3002 \r\n11. \u9700\u8981\u66f4\u591a\u8c03\u8bd5\u4fe1\u606f? \u63d0\u4f9b\u53ef\u4ee5\u548c\u865a\u5e7b\u539f\u751f\u5ab2\u7f8e\u7684Gizmos\u8c03\u8bd5\u663e\u793a\u529f\u80fd\u3002 \r\n11. \u62c5\u5fc3\u517c\u5bb9\u6027\u5417? \u7a0b\u5e8f\u4e3b\u8981\u57fa\u4e8e2022\u7248\u672c\u5f00\u53d1, \u5411\u4e0b\u517c\u5bb92021, \u5411\u4e0a\u652f\u63016000, \u4e0d\u6d89\u53ca\u6e32\u67d3\u7ba1\u7ebfAPI, \u6709\u9488\u5bf9webgl\u7248\u672c\u7684\u5355\u72ec\u6784\u5efa\u7248\u672c, \u4e14\u7ecf\u8fc7\u9879\u76ee\u5b9e\u6218\u9a8c\u8bc1\u3002 \r\n\r\n\u66f4\u591a\u7f16\u8f91\u5668\u529f\u80fd\u53c2\u8003: \r\n * \u5b89\u88c5Xeric Blueprint Graph\u4ee5\u83b7\u53d6Unity\u4e0a\u84dd\u56fe\u8282\u70b9\u529f\u80fd, \u5e76\u652f\u6301Xeric\u51fd\u6570\u5e93\u529f\u80fd\u3002\r\n * \u5b89\u88c5Xeric UI Graph\u4ee5\u83b7\u53d6\u84dd\u56fe\u5316UI\u751f\u6210\u529f\u80fd, \u4f7f\u7528\u84dd\u56fe\u903b\u8f91\u63a7\u5236UI\u4ea4\u4e92, \u751f\u6210\u903b\u8f91, \u5e76\u652f\u6301Xeric\u51fd\u6570\u5e93\u529f\u80fd\u3002\r\n * \u5b89\u88c5Digital Twin Tool\u4ee5\u83b7\u53d6\u5e38\u7528\u8c03\u8bd5\u5de5\u5177\u96c6\u3002\r\n * \u5b89\u88c5Nexus Frame Flow\u4ee5\u83b7\u53d6\u5de5\u4f5c\u67b6\u6784\u6d41\u5904\u7406\u529f\u80fd\u3002\r\n * \u5b89\u88c5Xeric Editor\u8f85\u52a9\u5f15\u64ce\u5927\u7eb2\u7f8e\u5316\u7ec4\u4ef6\u3001 \u8d44\u6e90\u5783\u573e\u5904\u7406\u7ec4\u4ef6\u3001 \u8d44\u6e90\u7f13\u5b58\u7ec4\u4ef6\u3001 \u5feb\u901f\u622a\u56fe\u529f\u80fd, \u4ee5\u53ca\u66f4\u591a\u5feb\u6377\u952e\u529f\u80fd", "keywords": [ "unity", "xeric"