diff --git a/HowToUseXericComponent.md b/HowToUseXericComponent.md new file mode 100644 index 0000000..76dc42e --- /dev/null +++ b/HowToUseXericComponent.md @@ -0,0 +1,143 @@ +# Xeric 组件库 + +## [Splie曲线组件](../wiki/SplinePath) + +提供`XericSplinePath,XericRectSplinePath`组件。 +他们的区别是,一个用于三维世界,另一个用于UI界面。 +UI界面上的Spline组件会通过RectTransform控制,有区别与三维世界。 + +`XericSplinePath`可以直接在unity中进行挂载,并通过界面编辑点,在列表中可以增加和减少点,或改变点的顺序。 + +在脚本中使用`XericSplinePath`定义字段,可以让脚本在inspecter上呈现一个引用端口,引用组件以获取曲线实例。 + +曲线通常用于静态计算,在设计上并未考虑动态刷新,动态构建曲线的方法,如果希望动态地构建曲线,可以自行根据其中的结构提供点位数据。 + +在`XericSplinePath曲线上初始时使用BakePoint()来烘焙一次数据,这个方法会在线组件上生成BakeData,有这个数据可以获得速度正确的的曲线映射,如果担心多个烘焙进行时的性能问题,可以使用协程方法BakePointCoroutine()`推迟烘焙到来。 +烘焙的速度与精度有关,`BakePoint()`包含一个形参用于输入烘焙精度,默认100,表示进行100次采样,理论上采样越多,精度越高,但实际上并非越高越好,采样数量保持在数倍于实际点数量即可。 +烘焙后的曲线才可以使用重映射`RemappingTimeValue(),同时也可以使用SplineLength`获取曲线的长度。 + +在曲线实例上可以访问`Evaluate...()`方法来计算坐标,旋转,数值,颜色过度。 +方法要求给定一个驱动值t,取值范围在0-1之间。 +默认情况下,驱动值是几乎等分地控制着每条线路的,无论两个点之间的距离长短,都近似为“时间”相等的多段线,这意味着无法通过这样的一个线驱动一个物体平滑地从起点运动到终点。 +而开头我们使用`BakePoint()烘焙的数据就起作用了,通过调用线实例上的RemappingTimeValue()`将时间驱动值转换为速度驱动值,这会带来非常平滑的效果。 + +2D的线路组件`XericRectSplinePath`工作在Rect上,如果屏幕的工作分辨率实际上是可变的,可能会导致实际线路有时会错位,这是因为线路工作的参考坐标系是静态的。 +如果当前项目的窗口缩放易变,建议每帧调用`UpdateRectDepend()` (一般都很难遇到分辨率亘古不变的情况),这个方法可以刷新曲线构建所依赖的矩形空间坐标。 + +为了适配速度矫正后的线路,建议使用线路的长度作为循环的时间最大值,而不是强制所有线路从0-1取值,线路总长度可以使用`SplineLength`属性获取。 +这里是一个示例: (这个示例中使用的是二维曲线,但设置ui的方法是世界空间的,并非屏幕空间,这是因为我驱动的目标对象还是世界空间的Sprite,同时较小的ui坐标便于计算尾迹的长度,避免结果速度太快) +``` +public void UpdateBySpline(XericRectSplinePath spline) +{ + totalTime = (float)spline.SplineLength; + var remappingTime = time / totalTime; // 这是没有速度矫正的值 + remappingTime = spline.RemappingTimeValue(remappingTime); // 经过速度矫正 + // 设置坐标 + var pos = spline.EvaluatePosition(remappingTime); // 获得坐标 + transform.position = pos; + // 设置旋转朝向运动方向 + var lastOffset = (lastPosition - pos).normalized; + var ang = Mathf.Atan2(lastOffset.y, lastOffset.x) * Mathf.Rad2Deg; + transform.localRotation = Quaternion.Euler(0, 0, ang); + lastPosition = pos; + // 设置缩放,来自曲线上定义的浮点值 + var size = spline.EvaluateValue(remappingTime); + transform.localScale = size; +} +``` + +三维曲线与二维曲线类似,也可以通过烘焙操作来获得一些特殊方法的调用许可。 + + + +## [文件阅读器] + +提供`WWWDataDriver和WebFileLoader`网络文件读取功能。 + +MacroFile库中对web平台的文件操作通过`WebFileLoader`实现,其中包含一个简单的协程文本加载。 + +`WWWDataDriver`则可以自行配置post或get请求,并允许将对象属性填入表单来进行请求。 +同时,允许下载文本,图片等内容。 + + + +## [简易批处理器] + +在代码中引用 XericLibrary.Runtime.Type.BatchProcess , +并将需要进行批处理的对象实现 ICanBatchProcess 接口, +其中提供了所有额外支持的生命周期事件,可以直接实现或显式实现。 + +缺点是只有异步方法的生命周期约束,且没有提供线程安全的数据类型。 + +和官方的相比没有什么优势,只是作为dll内部的部分程序的替代品,没事不要用这个。 + + + +## [多维布尔] + +提供`Bool1,Bool2,Bool3,Booln`。 +其中除了`Booln`是类,其他都是结构体,在相互转换时需要注意。 + +不同的多维布尔对象之间可以互相转换,且参数不会遗失。 +他们的区别是会在界面上绘制不同数量的参数。 + +其中bool1与普通布尔几乎无二,可以直接隐式转为bool,只是他存储的方式为int,可以用于bool隐式转为int。 + +多维布尔可以与矢量运算: +* 乘法相当于使用多维布尔置零这个矢量对应轴。 +* 除法时多维布尔作为被除数时,相当于对矢量各轴取倒数,并置零非选中轴。 +* 除法时多维布尔作为除数时,相当于计算已被多维布尔置零对应轴的矢量的模长。 + +多维布尔可以与布尔运算: +* 异或操作可以对多维布尔各轴异或。 + + +## [预设与函数退化链] + +提供一个抽象基类`PremadeLinkedNode,它以链表形态工作,通过AddNode`添加另一个节点。 +添加完毕后使用`Invoke`并传入参数,这将自动根据参数形态选择函数。 + + + +## [时间节点] + +提供`TimingStamp,TimeStamp`。 + +TimingStamp用于时间快速转换,以及在unity界面上呈现的能力。 +TimeStamp用于隐式的,在极短时间内 (小于1tick) 的时间戳的名称标记。 + + + +## [空对象] + +提供`Empty\`用来快速创建一个空对象。 +这个空对象中包含空列表,等其他多种资源。 +值得注意的是,在创建空组件时 (component) 会从超驰库中使用自动实例化命令执行这一过程,可能会导致在场景中出现空节点 (GameObject) + + + +## [类标签] + +提供`CanFind`系列特性。 +* 使用`CanFindClass`标记类 + 当使用被标记类的实例时,可以使用`.GetClassCanFindTag()`获取这个类上包含的所有标记。 + 或使用`.GetClassByCanFindTag()`获取这个标签被赋予的所有类。 + 配合MacroReflection库,可以直接在当前程序集中找到这个类的所有实例。 + +* 使用`CanFindProperty`标记属性 + + +* 使用`Rename`标记属性 + 在editor中可以搜索特性来快速实现重命名,使用`TryGetMemberName`来获取FieldInfo名称,如果没有标记,那么使用属性名称,否则使用重命名。 + +* 使用`CusMe`标记类,属性,事件,委托等 + 需要手动通过不同的分类进行标记,如使用`CusMeProperty`来标记属性。 + 包含被标记的特性的类在创建实例时,可以通过`CusMeManagerment的实例通过AddTarget`添加目标,被添加的成员可以用于菜单构建。 + +## [排挤网格]()(正在实现) + +## [TMp超链接管理]() + +提供`TMPHyperlinkManager`,`TMPHyperlinkReceiver`脚本。 +使用时,需要将`TMPHyperlinkManager`挂载在canvas组件上,或子类下,之后的tmp组件将由父级的最近的一个`TMPHyperlinkManager`组件管理。 +每个需要监听超链接的文本组件需要挂载`TMPHyperlinkReceiver`。并在文本中使用的富文本块包裹。