效果
|
|
基础效果
|
角度(弧度)限制
|
|
|
滑块手柄指向圆心
|
滑块手柄指向路径
|
功能介绍
如上图所示,主要功能包括:
FillOrigin:和 UGUI 的 Image (Filled类型)的一样,设置圆环起始方位。包含上下左右四个方位
Clockwise:和 UGUI 的 Image (Filled类型)的一样,使用顺时针或逆时针
WholeNumbers:和 UGUI 的 Slider 一样,是否使用整数值的 Value
MinValue、MaxValue、Value:和 UGUI 的 Slider 一样,其中 Value 可在非运行模式下直接拖动查看效果
MaxAngle:最大角度。可设置圆环最大角度 0° ~ 360° ,可通过此功能实现任意角度的弧形滑动条
Radius:设置圆环的半径,调整滑块手柄的位置,此参数需要用户根据实际效果自行调整,可在非运行模式下直接修改查看效果
TowardCenter:设置滑动手柄是否朝向中心,可以设置角度偏移实现朝向圆环的效果
UnityEvent:事件接口包含 OnValueChanged<float> 、OnBeginDragged、OnDragging、OnEndDragged,可在 Inspector 面板或使用 AddListener() 绑定回调函数
代码介绍
实现思路:在鼠标点击后拖动时,根据鼠标在圆环Image.rectTransform上的位置 => 求出角度(相对于X轴右侧 180°表示)=> 相对于起始点的角度(360° 表示)=> 圆环Image.fillAmount和滑块手柄rect.localPosition。
其中主要代码为:
//根据鼠标在圆环Image.rectTransform上的位置
Vector2 localPoint;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(_fillImage.rectTransform, eventData.position, eventData.pressEventCamera, out localPoint))
{
// 求出角度(相对于X轴右侧 180°表示)=> 相对于起始点的角度(360° 表示)=> 圆环Image.fillAmount和滑动rect.localPosition。
}
本项目代码参考了UGUI源码(GitHub链接)的编码风格(主要参考了Slider.cs、SliderEditor.cs)
例如:部分函数名:
UpdateCachedReferences();
UpdateVisual();
属性赋值时的判断:
private static bool SetStruct<T>(ref T setValue, T value) where T : struct
{
if (EqualityComparer<T>.Default.Equals(setValue, value)) return false;
setValue = value;
return true;
}
private static bool SetClass<T>(ref T setValue, T value) where T : class
{
if (setValue == null && value == null || setValue != null && setValue.Equals(value)) return false;
setValue = value;
return true;
}
使用示例
最上面有GitHub地址