# XericLibrary2_WebGL
**Repository Path**: none_9_0/xeric-library2_-web-gl
## Basic Information
- **Project Name**: XericLibrary2_WebGL
- **Description**: 适用于WebGL版本的Xeric宏库插件发布页,直接使用unity的Package Manager里的Add package from git URL...即可下载。
如果有反馈,请提交issues,这里是发布页面,不是源码。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-04-30
- **Last Updated**: 2025-06-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Deconstruction
发布页面
## 简介
unity通用库插件,现已转为unity 6000版本。
此插件为XericDigitalTwinTool插件库的前置依赖项。与MateriaLibrary材质库一起使用更好哦!
单独使用可能会遇到编译报错,可以直接删除报错指向的文件。造成报错的原因可能是版本不兼容,依赖项uid错误等等。如果能力足够,请自行解决。
webgl下部分内容为了兼容性可能与本体有所区别,注意辨别
## 软件架构
* CentralizeLog: 小日志,unity本身的日志在调用时开销巨大,所以提供一个小日志的类型保存临时的日志内容。
* Deconstruction: 通过数学公式对线进行描述,进行标准的CAD线路参数计算,并支持在线路上进行导航,合理性计算等
* RescissionRework: 撤销重做 🕑
* SerializerHelper: 序列化库
* XericLibrary: 实用性unity宏库,包含一些实用扩展用法。
----
----
## XericLibrary (主要核心库)
XericLibrary 部分由两个dll组成,一个是 Xeric Library,另一个是 Xeric Library Editor 。
----
### 宏库
----
#### 特性库
* CanFind$
其中包含多个特性类,用于查找类,字段,属性,方法等项目。
* ReName
重命名特性,在没有安装odin插件的旧版本引擎上可以直接替换细节面板中的参数名称,不过由于无法和odin兼容,所以odin的功能会覆盖掉这个特性。
主要作用是提供属性标签查找功能。
#### 协程宏
#### 调试宏
#### 模型网格宏
#### 机器标识宏
#### 摄像机宏
#### 颜色宏 (MacorColor)
#### 常数宏 (MacroConst)
#### 曲线宏 (MacroCurve)
#### 枚举宏 (MacroEnum)
枚举宏包含一个缓存封装器,可以通过MacroEnum\来定义。
定义枚举结构封装将允许像列表一样访问这个枚举,或将枚举实例赋予,通过枚举封装器来操作枚举值。
#### 方程宏
#### 事件宏
#### 文件宏 (MacroFile)
文件宏包含预设常用的文件写入,读取操作,并自动解决文件不存在的问题,通过返回布尔状态来快速判断解决。
原始api中,仅包含一层简单的c#文件处理封装,无法适配unity其他平台情况,这些api已经被标记为过时,但你仍然可以继续使用他们。
新版中,添加了对多平台的支持:
* 增加了CrossPlatformFileHandle文件句柄,用于处理多平台的文件写入,加载的基类。
使用时,通过CrossPlatformFileHandle.ActiveHandle来获得当前平台自动对应的文件句柄,其中包括了一组同步和一组异步的读写方法,来对目标地址进行访问。
下面是一个示例:
```
// ==== 同步读取 ====
CrossPlatformFileHandle.ActiveFileHandle.ReadTextFromFile("absolute file path", out string content);
// ==== 同步写入 ====
CrossPlatformFileHandle.ActiveFileHandle.WriteTextIntoFile("absolute file path", string content);
// ==== 异步读取 ====
var isCompleteRead = await CrossPlatformFileHandle.ActiveFileHandle.AsyncReadTextFromFile("absolute file path",
s =>
{
// 成功读取文件
},
s =>
{
// 读取失败,原因是 s
Debug.ErrorLog(s);
});
// ==== 异步写入 ====
var isCompleteWrite = await CrossPlatformFileHandle.ActiveFileHandle.AsyncWriteTextIntoFile("absolute file path",
null, // 成功写入文件,但是无需处理
null); // 写入失败,但是无需处理
// 异步方法包含回调函数处理,也可通过返回布尔值判断文件写入是否成功。
```
同时,文件句柄也提供了相对路径拼接:
```
// 返回steamingAssets下的myFile.json文件路径
CrossPlatformFileHandle.ActiveFileHandle.CombineStreamingAssets("myFile.json");
```
* 添加了XericSerializerFormatter序列化器,用于通配处理多种序列化器目标。
目前默认提供了 Json格式化 和 bin格式化 。
下面展示如何使用:
```
List obj = new List() { 1, 2, 3};
// 序列化目标
var content = JsonSerializerFormatter.formatter.Serializer(obj);
// 反序列化目标
obj = JsonSerializerFormatter.Deserializer.Serializer(content);
```
为了方便使用,文件句柄支持填入序列化器来实现更多的格式:
```
// 类型太长了可以使用声名简化
using static XericLibrary.Runtime.MacroLibrary.MacroFile.CrossPlatformFileHandle;
using static XericLibrary.Runtime.MacroLibrary.MacroFile.JsonSerializerFormatter;
ActiveFileHandle.AsyncWriteXIntoFile(
ActiveFileHandle.CombineStreamingAssets("myFile.json"),
uriConfig, null, s => Debug.LogError(s), formatter);
```
----
#### 窗口宏 (MacroForm)
提供User32.dll中部分函数的功能。
* 获取当前进程PID:PID
* 通过句柄查找窗口:FindWindow
* 控制窗口化状态:ShowWindow
* 枚举显示器信息:GetDisplayMonitorsInfo
----
#### 步进宏
#### 按键宏 (MacroKey)
预设了一些判断较复杂按键状态的逻辑。
对于外部的常规逻辑,可以使用扩展的InsertKey逻辑。
为了使用这些逻辑,需要定义一个KeyFlippingStampSheetStyle(简称KfsStyle)。
```
KeyCode.A.AsKfsStyle();
```
将这个作为按键索引,传入扩展的状态检查事件一同执行更新,即可做出判断。
这会返回一个KeyFlippingStampSheet,里面包含当前按键状态的布尔值,以及按键判断时触发的委托事件。
* 交叉动作与延迟触发长按
```
var keySheet = Input.GetMouseButtonDown(0).InsertKeyStateCmet(KeyCode.A.AsKfsStyle());
```
使用IsPressed判断是否单击按下,如果是双击,第一次点击时当前帧还是会返回单击事件。
使用IsReleased判断刚刚的单击是否释放,如果上一次是长按状态,那么这个释放事件不会触发。
使用IsDoubleClick判断是否双击,双击事件会出现在第二次点击间隔小于KfsStyle中设置的双击间隔时。
使用IsFirstLongPressed判断是否长按,当一次按下后不释放时间大于KfsStyle中设置的长按间隔时出现一次。
使用IsLongPressedState判断是否长按,当一次按下后不释放时间大于KfsStyle中设置的长按间隔时出现。
使用IsLongReleased判断刚刚长按是否释放。
* 坐标保持触发
```
var keySheet = Input.GetMouseButtonDown(0).InsertKeyStatePt(KeyCode.A.AsKfsStyle());
```
与上述功能一致,但可以使用拖拽事件:
使用IsChangeDraggingFromLongPressed判断长按事件是否转为拖拽事件。
使用IsBeginDragging判断当前是否开始拖拽。
使用IsDragging判断当前是否正在拖拽。
使用IsDropping判断当前是否正在丢弃。
在拖拽期间,长按状态将继续触发,但长按事件将转为拖拽事件,长按事件。
拖拽结束后,如果以拖拽结束,但以长按开始,那么长按结束事件也会触发。
* 光标坐标计算:
提供诸如类似GetRectangleRelativelyPoint的扩展方法,将传入的光标坐标计算为相对坐标。
----
#### 列表宏 (MacroMath)
* FisherYatesShuffle: 洗牌算法,返回一个索引映射数组,同时也提供一个线程安全的蓄水池洗牌算法。
* GetRandom: 从列表中随机获得1个或多个对象(洗牌算法)。
* MakeIEnumberable: 将一个对象制作成枚举器。
* LandedIndex: 从迭代器中抽出索引下的成员。
* SelectConvert: 从非泛型迭代器转为泛型迭代器。
* ForEachDo: 迭代器执行。
* Adjoint: 迭代器拼接一个索引。
* SubSegment: 仅迭代开始索引后一段数量范围内的成员。
* Startup: 在当前迭代器之前拼接一个或多个成员(迭代器)
* Endeavor: 在当前迭代器之后拼接一个或多个成员(迭代器)
* Join: 将当前迭代器加入到字符串,可以设置如何开头,结尾,成员分割符。
* Merge: 将当前迭代器合并,可以实现类似sum的操作。
* EqualitySet: 比较两个迭代器里的成员是否相等。
* Shift: 偏移列表,也可以使用RingShift,CyclicShift循环偏移。
* 包含针对IList>的Add,TryAdd,AddUnique,Remove,Modify,Contains,IndexOf,GetValue,GetKey,GetKeys,GetValues方法。
* BinarySearch: 二分法遍历
* FindClosestIndexByBinarySearch: 基于浮点数的二分法查找方法。
* IsIndexGreaterZeroLessCount:
* AddByIndex: 在索引处添加目标,如果索引不存在,则用default填充;如果目标已经存在,就替换。
* TryDoAtIndex: 尝试在索引处执行些什么,如果索引不存在,则什么都不做。
* ReplaceList: 使用一个列表替换另一个列表,允许通过自定义增删改方法修改(和DiscrepancyOrder作用几乎一致,不过这个会因为条件不满足而产生报错)。
* DiscrepancyOrder: 列表顺序差异,从源到目标列表的差异会通过委托开放,允许自定义删除,增加,替换来完成修改。
* TryGetAtIndex: 尝试读取索引处的成员。
* ForceDoAtIndex: 强制在索引处执行些什么,不论成员是否存在,永远都会执行委托。
* ForceGetAtIndex: 强制在索引处获取成员。
*
----
#### 数学宏 (MacroMath)
* RandomFloat/Vector/Matrix:通过一个随机生成器快速获得随机值。
* Pmod:在正数空间上对值取余,负数情况下仍然会保持与正数相同的曲线形状。
* RoundToAny:将一个矢量四舍五入到任意的倍数,比如4.8舍入3.5得到3.5,6.2则得到7
* MinPositive:获取正数空间上的最小值。
* SmoothStep:获取t在(a,b)之间的埃尔米特过度
* LinearStep:获取t在(a,b)之间的线性过度
* RoundBasedOnMinimumDifference:将一个值根据最小的差值进行四舍五入
* DiscardLeastSignificantDecimal:舍弃不重要的小数位
* ClampWrapAngle:钳制角度
* GetNumberOfDecimalsForMinimumDifference:获取最小插值的小数个数
* CosineSimilarity:余弦相似度
* FibonacciRecursive:斐波那契迭代方式计算(会产生大量循环)
* FastInvSqrt:快速平方根倒数
* IsPrimeNumberRw:检查一个数是否是质数(这是一个娱乐用法,利用正则表达式判断是否为质数,性能消耗较高)
* GetCirclePoints:获取圆上的点
* GetRayIntersectionCircle:获取切于圆的线两点坐标
* GetHeightOfRoundArch:获取圆拱高度
* GetListFormAToB:获取从A到B的列表
* LerpTransform:创建lerp矩阵
*
----
#### 消息库 (MacroMessage)
预设一些消息处理流程。
* 全局业务分发器,消息入口Entry。
特点是需要通过指定消息入口(RedirectReceiverMessage)和出口(RedirectReceiver)来中转消息。
完成后消息发送时会被进行一次包装,将带有入口名称的内容一同发送;而在消息处理的另一端,也需要用相同的逻辑处理这个包,就能获得这个包来自哪,并自动定位到对应的预定义委托上进行处理。
下面是一个接收示例:
```
// 声名一个消息处理器委托
// 接收器形参可以是任何可以序列化的结构,或是无形参接收器。
public MacroMessage.ReceiverObject myFunc;
public void Awake()
{
// 初始化函数中注册这个委托,并赋予一个名称用于标识
myFunc.RedirectReceiver(nameof(myFunc));
myFunc += Func;
}
// 处理消息
public void Func(int number)
{
// 消息处理
}
```
下面是一个发送示例:
```
// 在收到文本消息后,立刻发送给重定向器
void OnMessage(string message)
{
MacroMessage.RedirectReceiverMessage(message);
}
```
最后,需要定义何时处理消息:
```
// 比如放在帧更新事件中,消息会作为队列加入,然后逐个处理。
void Update()
{
MacroMessage.MainThreadProcessingMessage();
}
```
* 方法封装器
提供一个方法软引用封装器,首先需要将一个可执行流程转换为CallableTarget对象。然后通过AddCallableFunction添加到全局字典中,随后可以通过TryEvocation或者Evocation调用。
方法封装器默认可以搜索所有静态,实例,私有,公共的方法
----
#### 对象宏 (MacroObject)
在gameobject或transform上快速迭代的操作库。
* 场景迭代
* 获取当前场景中的所有根对象:GetActiveSceneRootGameObjects。
* 在所有已激活场景中查找组件:GetAllSceneComponents。
* 节点迭代
* 获取父级迭代器:GetParents。
* 获取子级迭代器:GetChildren。
* 获取广度优先的子级迭代器:GetChildrenBFS。
* 获取深度优先的子级迭代器:GetChildrenRecursion。(不要使用 GetChildrenDFS,存在严重性能缺陷)
* 组件迭代
* 在当前位置无论如何都获取一个组件,如果没有就创建:GetComponentAnyway。
* 在节点迭代器中找一个组件:GetComponent。
* 将节点迭代器转为一一对应的组件迭代器:GetComponentsOTO。
* 将节点迭代器转为组件迭代器:GetComponentsOTOD。
* 在当前节点的所有子成员(包含子成员的子成员)内查找多个组件:GetComponentsInRecursionChildren。
* 按照给定的组件顺序在节点迭代器中逐一查找:GetFavoriteComponent。
* 家族迭代
* 获取当前节点的家族名称:GetFamilyName。
* 使用家族名称搜索节点:FindFamilyMember。(支持一次重定向,以及逐级名称模糊查找)
以上仅包含大致用法,实际上包含更多的重载用法。
----
#### PID宏 (MacroMath)
提供一个PID计算器,具有基本的pid计算,同时带有基本安全计算。
----
#### 对象池宏
预设快速设置的对象池(CreatSimplePool)与顺序对象池(CreatObjectInOrderPool),传入预制体与父级,将直接返回一个预设的对象池。
提供一个联合对象池(预设的)MacroPool.UnionSet,支持开放预制体目标与父级目标参数到inspector。
联合对象池需要手动调用Init函数进行初始化。
----
#### 矩形变换宏
#### 超驰宏 (MacroReflection)
* 签名转换:通过GetFieldsRename 获取给定名称的字段在自定义的重命名特性上的名称。
* 软接口:SoftInterface 通过名称直接设置或获取值,
支持在一个对象上获取一系列名称的值,或在一系列对象上获取同一个名称的值,或是反过来设置他们。
* 实例化:通过OverridingInstance创建给定类的实例,支持通过全名
*
----
#### 正则库 (MacroRegex)
提供了常用的正则匹配模式。
* GeneralVector:多维矢量文本匹配
* ObjMesh:obj模型参数匹配(匹配的同时会转换坐标系到unity)
* RegexReplace: 直接使用编辑器常用语法进行替换,比如"$1"获取第一个匹配项并输出。
----
#### 仓库宏
#### 材质宏
#### 平滑宏 (MacroSmooth)
包含28个常用插值函数,可以使用SwitchEasing对一个数值计算插值,返回重新映射插值位置的数值。
插值函数可以单独调用,或使用枚举切换。
----
#### 排序宏 (MacroSort)
c#自带的排序很好用,但是选择何种排序模式是根据数据类型自动切换的。
在这里,排序宏中提供了一些可以手动选择的排序算法。
注:没有猴子排序。
----
#### 文本宏 (MacroMath)
提供:
* StringBuilderPool: 文本构建池
* join: 文本序列拼接。
```
List