update 0.5.3
This commit is contained in:
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,6 +1,29 @@
|
||||
# Changelog
|
||||
|
||||
## [UnRealse]
|
||||
## [0.5.3] - 2025-09-26
|
||||
|
||||
添加一个大顶堆数据容器XericLibrary.Runtime.Type.SpatialAlgorithm.MaxHeap
|
||||
添加一个untiy委托测试脚本XericLibrary.Runtime.Type.SpatialAlgorithm.BenchMarker
|
||||
超级单例
|
||||
* 对超级单例进行详细注释。
|
||||
|
||||
对象库
|
||||
* 添加了在节点上获取兄弟节点的功能。
|
||||
* 添加在节点兄弟节点上获取组件的功能。
|
||||
|
||||
对象池
|
||||
* 完善UnionSet对象池在动态生成情况下对脏数据的处理,可以更好处理动态情况下切换实例时的情景。
|
||||
* 联合对象池不再强制要求手动初始化,而是自动推迟到首次获取时。
|
||||
* 修复对象池在间接释放对象时,可能找不到对象的问题
|
||||
|
||||
列表库
|
||||
* 加入了Repeat方法。
|
||||
|
||||
对weakly稍作优化。
|
||||
修复togglemapping在处理通过索引激活时的条件问题。
|
||||
在超链接管理器上添加了一个刷新的测试方法。
|
||||
|
||||
## [0.5.2] - 2025-09-03
|
||||
|
||||
修复富文本包裹器中SpriteBlock在处理颜色元素时选择到错误下标的问题。
|
||||
增加了一些windows窗口命令。
|
||||
@@ -10,12 +33,15 @@
|
||||
* 添加了迭代重复
|
||||
* 差异比较库添加了通过数量比较(也支持替换)
|
||||
* 添加了更多merge语法,支持合并类与输出类类型不一致
|
||||
* 修复foreachDo迭代用法中内插语法的用法。现在启用内插后可以正确输出了。同时允许使用null代替action了。
|
||||
* 添加编组输出条件,支持手动定义委托触发,相等性触发。
|
||||
* 添加连续计数。
|
||||
|
||||
文件库
|
||||
* 添加了获取目标路径上的文件名和路径名
|
||||
* 添加对文件路径修复的方法,比如untiy路径是/拼接,windowsPath使用\拼接,混用会错误的问题。
|
||||
|
||||
## [0.5.1]
|
||||
## [0.5.1] - 2025-08-05
|
||||
|
||||
修复反射库钟使用方法类型检查时,产生数组越界,或空引用问题,这会在部分匿名转换过程中发生。
|
||||
修复使用匿名对象赋值时,如果类型不匹配会报错的问题,现在改为了产生警告。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bcbfe98d29b703044a524e421fcacc2a
|
||||
guid: 114790f70dba8284a84b68083baa8418
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6116f350f3c2bca4dbb63afc5febe614
|
||||
guid: e705db20b7214dc4cbfe3089b7219737
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
|
||||
Binary file not shown.
@@ -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:
|
||||
|
||||
Binary file not shown.
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8acde5da4f147914f835131d166274df
|
||||
guid: c67d7ef6c97613b41b9095a945725e91
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f162d80c71a441780f9bc255eb5e169
|
||||
guid: 34832ce232e3acf45b7ca41349d5515e
|
||||
timeCreated: 1734339863
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 62d0397e1e24f0748a58f4046b547552
|
||||
guid: 5a61f0f8f8df56c42af4507d63579616
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
|
||||
@@ -3,9 +3,12 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Deconstruction.UI.Interface;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using UnityEngine.Pool;
|
||||
using UnityEngine.Serialization;
|
||||
using UnityEngine.UI;
|
||||
using XericLibrary.Runtime.CustomEditor;
|
||||
|
||||
@@ -31,6 +34,17 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
private static FieldInfo togglesFieldInfo = typeof(ToggleGroup).GetField("m_Toggles",
|
||||
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||
|
||||
/// <summary>
|
||||
/// 获取给定单选项组中的所有单选项目
|
||||
/// </summary>
|
||||
/// <code>
|
||||
/// 注意:操作具有一定的危险性,你可以自行制作这个列表对象的拷贝,但注意不要直接对返回的列表对象进行操作。
|
||||
/// </code>
|
||||
/// <param name="toggleGroup"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
/// <exception cref="InvalidOperationException"></exception>
|
||||
/// <exception cref="InvalidCastException"></exception>
|
||||
public static List<Toggle> GetToggles(this ToggleGroup toggleGroup)
|
||||
{
|
||||
if (toggleGroup == null)
|
||||
@@ -114,6 +128,50 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
|
||||
#region toggle 索引
|
||||
|
||||
[Serializable]
|
||||
public class ToggleValueMapping<T> : ToggleMapping
|
||||
{
|
||||
#region 事件委托
|
||||
|
||||
public Action<Toggle, T> OnAnyToggleValueSwitchOn;
|
||||
|
||||
#endregion
|
||||
|
||||
#region 字段属性
|
||||
|
||||
#if ODIN_INSPECTOR
|
||||
[SerializeField, LabelText("编辑单选项目值")]
|
||||
#endif
|
||||
private List<T> toggleValue;
|
||||
|
||||
#endregion
|
||||
|
||||
public override void BakeToggleGroupItems()
|
||||
{
|
||||
base.BakeToggleGroupItems();
|
||||
if (toggleValue is not { Count: > 0 } || toggleValue.Count != toggleList.Count)
|
||||
{
|
||||
toggleValue = new List<T>();
|
||||
for (var i = 0; i < toggleList.Count; i++)
|
||||
toggleValue.Add(default(T));
|
||||
}
|
||||
}
|
||||
|
||||
public T GetValueByIndex(int index)
|
||||
{
|
||||
if (toggleValue is not { Count: > 0 } || index < 0 || index >= toggleValue.Count)
|
||||
return default;
|
||||
return toggleValue[index];
|
||||
}
|
||||
|
||||
protected override void ToggleRegister(Toggle t)
|
||||
{
|
||||
base.ToggleRegister(t);
|
||||
OnAnyToggleValueSwitchOn?.Invoke(t, GetValueByIndex(GetIndex(t)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// toggle映射集
|
||||
/// <code>
|
||||
@@ -121,7 +179,7 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// </code>
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class ToggleMapping : IEnumerable<Toggle>
|
||||
public class ToggleMapping : IEnumerable<Toggle>, IHierarchyControl
|
||||
{
|
||||
#region 事件委托
|
||||
|
||||
@@ -138,103 +196,191 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
#endregion
|
||||
|
||||
#region 字段属性
|
||||
|
||||
#if ODIN_INSPECTOR
|
||||
[LabelText("单选组")]
|
||||
#endif
|
||||
public ToggleGroup ToggleGroup;
|
||||
#if ODIN_INSPECTOR
|
||||
[SerializeField, LabelText("编辑单选项目顺序")] [ListDrawerSettings(OnTitleBarGUI = "GetAndSortToggle")]
|
||||
[LabelText("编辑单选项目顺序")]
|
||||
#endif
|
||||
private List<Toggle> toggleList = new List<Toggle>();
|
||||
[SerializeField]
|
||||
protected List<Toggle> toggleList = new List<Toggle>();
|
||||
|
||||
// 当前选中的项目
|
||||
private int nowSelectToggleIndex = 0;
|
||||
private Toggle nowSelectToggle = null;
|
||||
protected bool ToggleListInvalid => toggleList is not { Count: > 0 };
|
||||
|
||||
|
||||
public Transform TogglesContext => ToggleGroup.transform;
|
||||
|
||||
/// <summary>
|
||||
/// 当前选中的toggle索引
|
||||
/// </summary>
|
||||
public int NowSelectToggleIndex => nowSelectToggleIndex;
|
||||
|
||||
/// <summary>
|
||||
/// 当前选中的toggle
|
||||
/// </summary>
|
||||
public Toggle NowSelectToggle => nowSelectToggle;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取并给列表排序(顺序不一定与拼音有关)
|
||||
/// </summary>
|
||||
public void GetAndSortToggle()
|
||||
public List<Toggle> ToggleList
|
||||
{
|
||||
#if UNITY_EDITOR && ODIN_INSPECTOR
|
||||
// 自动获取并排序
|
||||
if (SirenixEditorGUI.ToolbarButton(EditorIcons.Refresh))
|
||||
get
|
||||
{
|
||||
GetSortToggle();
|
||||
}
|
||||
// 反转顺序
|
||||
if (SirenixEditorGUI.ToolbarButton(EditorIcons.TriangleDown))
|
||||
{
|
||||
toggleList.Reverse();
|
||||
}
|
||||
#else
|
||||
GetSortToggle();
|
||||
#if UNITY_EDITOR
|
||||
if (!Application.isPlaying)
|
||||
return toggleList;
|
||||
#endif
|
||||
void GetSortToggle()
|
||||
if (_mappingDirty || ToggleListInvalid)
|
||||
{
|
||||
var newToggleList = MacroSort.FullCharacterOrderSort(ToggleGroup.GetToggles(), a => a.name)
|
||||
.ToList();
|
||||
if (newToggleList.Count <= 0 || newToggleList == null)
|
||||
Debug.LogError("如果无法更新获取自动排序toggle,可能是因为toggleGroup被隐藏了,手动将其激活后再获取即可。");
|
||||
else
|
||||
toggleList = newToggleList;
|
||||
BakeToggleGroupItems();
|
||||
_mappingDirty = false;
|
||||
}
|
||||
|
||||
if (_noInit)
|
||||
{
|
||||
Initialize();
|
||||
_noInit = false;
|
||||
}
|
||||
|
||||
return toggleList;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 接口
|
||||
|
||||
/// <summary>
|
||||
/// 获取索引下的单选项组件
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
public Toggle this[int index] => toggleList[index];
|
||||
public Toggle this[int index] => ToggleList[index];
|
||||
|
||||
public int Count => toggleList.Count;
|
||||
public int Count => ToggleList.Count;
|
||||
|
||||
public IEnumerator<Toggle> GetEnumerator()
|
||||
/// <summary>
|
||||
/// 直接获取缓存选中索引
|
||||
/// </summary>
|
||||
public int CurrentSelectIndex => _nowSelectToggleIndex;
|
||||
|
||||
/// <summary>
|
||||
/// 选中项目实例
|
||||
/// </summary>
|
||||
public Toggle CurrentSelectToggle => ToggleList[_nowSelectToggleIndex];
|
||||
|
||||
/// <summary>
|
||||
/// 允许清空选项的选中状态
|
||||
/// </summary>
|
||||
public bool AllowSwitchOff
|
||||
{
|
||||
return toggleList.GetEnumerator();
|
||||
get => ToggleGroup.allowSwitchOff;
|
||||
set => ToggleGroup.allowSwitchOff = value;
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return GetEnumerator();
|
||||
}
|
||||
// 映射关系脏
|
||||
private bool _mappingDirty = false;
|
||||
|
||||
// 未初始化
|
||||
private bool _noInit = true;
|
||||
|
||||
// 当前选中的项目
|
||||
private int _nowSelectToggleIndex = -1;
|
||||
|
||||
#endregion
|
||||
|
||||
#region 方法
|
||||
#region 结构更新
|
||||
|
||||
/// <summary>
|
||||
/// 初始化
|
||||
/// <code>
|
||||
/// 自动将所有的按键绑定回调事件;如果作为刷新函数调用,请确保已经完全组索引。
|
||||
/// 或者可以直接清空旧项目(CleanToggle),然后逐个添加(AddToggle)
|
||||
/// </code>
|
||||
/// 烘焙单选项组
|
||||
/// </summary>
|
||||
/// <code>
|
||||
/// 注意不要再这里面使用ToggleList
|
||||
/// </code>
|
||||
#if ODIN_INSPECTOR
|
||||
[HorizontalGroup("GetGroup"), Button("GetGroup")]
|
||||
#endif
|
||||
public virtual void BakeToggleGroupItems()
|
||||
{
|
||||
if (ToggleGroup == null)
|
||||
{
|
||||
if (ToggleListInvalid)
|
||||
{
|
||||
Debug.LogError("未指定单选项目组中的任何引用成员,无法初始化");
|
||||
return;
|
||||
}
|
||||
|
||||
var validToggle = toggleList.FirstOrDefault(a => a.group != null);
|
||||
if (validToggle != null)
|
||||
{
|
||||
ToggleGroup = validToggle.group;
|
||||
Debug.LogWarning("未指定单选项目组中的任何引用成员,但使用成员代偿");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("未指定单选项目组中的任何引用成员,且无法利用成员代偿");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
List<Toggle> tempToggleList = null;
|
||||
#if UNITY_EDITOR
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
if (!ToggleGroup.gameObject.activeInHierarchy)
|
||||
{
|
||||
var tempParents = ToggleGroup.transform.GetParents()
|
||||
.Select(a => a.GetActivity()).ToList();
|
||||
ToggleGroup.gameObject.SetActivityInHierarchy(true);
|
||||
tempToggleList = ToggleGroup.GetToggles();
|
||||
ToggleGroup.transform.GetParents()
|
||||
.Zip(tempParents, (go, act) => (go, act))
|
||||
.ForEachDo(a => a.go.SetActivity(a.act));
|
||||
if (tempToggleList is not { Count: > 0 })
|
||||
Debug.LogError("无法获取ToggleGroup中的成员,可能由于toggleGroup被隐藏导致其无法初始化");
|
||||
}
|
||||
else
|
||||
tempToggleList = ToggleGroup.GetToggles();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (!ToggleGroup.gameObject.activeInHierarchy && ToggleListInvalid)
|
||||
Debug.LogError(
|
||||
$"当前运行状态导致无法直接获取ToggleGroup中的成员,且运行时我无法自行决定目标ToggleGroup({ToggleGroup.name})所属生命周期,请提前在编辑器中对相关状态进行烘焙");
|
||||
else
|
||||
tempToggleList = ToggleGroup.GetToggles();
|
||||
}
|
||||
// 需要注意的是,这里不能随意释放掉原来的选项列表
|
||||
if (tempToggleList is { Count: > 0 })
|
||||
toggleList = tempToggleList;
|
||||
}
|
||||
#if ODIN_INSPECTOR
|
||||
[HorizontalGroup("GetGroup"), Button("GetGroup(Sort)")]
|
||||
#endif
|
||||
public void BakeSortToggelGroupItems()
|
||||
{
|
||||
BakeToggleGroupItems();
|
||||
if (ToggleListInvalid)
|
||||
toggleList = MacroSort.FullCharacterOrderSort(toggleList, a => a.name)
|
||||
.ToList();
|
||||
}
|
||||
#if ODIN_INSPECTOR
|
||||
[HorizontalGroup("GetGroup"), Button("GetGroup(Reverse Sort)")]
|
||||
#endif
|
||||
public void BakeReverseSortToggelGroupItems()
|
||||
{
|
||||
BakeToggleGroupItems();
|
||||
if (ToggleListInvalid)
|
||||
toggleList = MacroSort.FullCharacterOrderSort(toggleList, a => a.name)
|
||||
.Reverse()
|
||||
.ToList();
|
||||
}
|
||||
#if ODIN_INSPECTOR
|
||||
[HorizontalGroup("GetGroup"), Button("SaveGroup")]
|
||||
#endif
|
||||
public void SetToggelGroupItems()
|
||||
{
|
||||
var realToggleGroup = ToggleGroup.GetToggles();
|
||||
if (ToggleListInvalid || toggleList.Count != realToggleGroup.Count)
|
||||
{
|
||||
Debug.LogError("编组无效,或编组成员与实际不符");
|
||||
return;
|
||||
}
|
||||
realToggleGroup.Clear();
|
||||
realToggleGroup.AddRange(toggleList);
|
||||
Debug.Log("编组设置成功");
|
||||
}
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
// 未指定组时,说明压根没用这部分功能,用不着初始化。
|
||||
if (ToggleGroup == null)
|
||||
// 啥也没有,压根没用这部分功能,用不着初始化。
|
||||
if (ToggleGroup == null && toggleList.Count <= 0)
|
||||
return;
|
||||
|
||||
// 防呆警告
|
||||
// 防呆
|
||||
if (toggleList.Count <= 0)
|
||||
{
|
||||
var toggles = ToggleGroup.GetToggles();
|
||||
@@ -243,26 +389,53 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
toggleList = toggles;
|
||||
Debug.LogWarning($"在初始化单选项组时,{ToggleGroup.name}并未预先指定索引顺序,将默认使用大纲顺序。");
|
||||
}
|
||||
|
||||
if (toggles.Count <= 0)
|
||||
{
|
||||
Debug.LogWarning("在初始化单选项组时,目标单选项组为空");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 防空
|
||||
toggleList = toggleList.Where(a => a != null).ToList();
|
||||
|
||||
// 防傻
|
||||
if (ToggleGroup == null)
|
||||
ToggleGroup = toggleList.FirstOrDefault(a => a.group != null)?.group;
|
||||
if (ToggleGroup == null)
|
||||
{
|
||||
ToggleGroup = toggleList[0].transform.parent.gameObject.AddComponent<ToggleGroup>();
|
||||
foreach (var toggle in toggleList)
|
||||
toggle.group = ToggleGroup;
|
||||
}
|
||||
|
||||
// 事件初始化
|
||||
for (int i = 0; i < toggleList.Count; i++)
|
||||
for (var i = 0; i < toggleList.Count; i++)
|
||||
{
|
||||
var toggle = toggleList[i];
|
||||
|
||||
ToggleAddEvent(toggle);
|
||||
|
||||
if (toggle.isOn)
|
||||
{
|
||||
nowSelectToggleIndex = i;
|
||||
nowSelectToggle = toggle;
|
||||
}
|
||||
if (_nowSelectToggleIndex < 0 && toggle.isOn)
|
||||
_nowSelectToggleIndex = i;
|
||||
}
|
||||
|
||||
if (nowSelectToggle == null)
|
||||
SetToggleOn(0);
|
||||
// 如果不允许为空的情况下还为空,那就默认标记一个
|
||||
if (!ToggleGroup.allowSwitchOff && _nowSelectToggleIndex < 0)
|
||||
SetToggleOnWithoutNotify(0);
|
||||
|
||||
if (_noInit)
|
||||
SetToggelGroupItems();
|
||||
|
||||
_mappingDirty = false;
|
||||
_noInit = false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 初始化 和 增删改查
|
||||
|
||||
/// <summary>
|
||||
/// 添加一个toggle
|
||||
/// </summary>
|
||||
@@ -272,27 +445,28 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
{
|
||||
ToggleAddEvent(t);
|
||||
|
||||
var resultIndex = toggleList.Count;
|
||||
toggleList.Add(t);
|
||||
var resultIndex = ToggleList.Count;
|
||||
ToggleList.Add(t);
|
||||
return resultIndex;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除一个toggle,这不会影响其他toggle的索引,但此处移除的位置会为空。
|
||||
/// <code>
|
||||
/// 注 :这不会销毁toggle。
|
||||
/// 注意mapping管理的toggle在移除后会被清空事件
|
||||
/// 此举这不会销毁toggle。
|
||||
/// </code>
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
/// <returns>是否成功移除toggle</returns>
|
||||
public bool RemoveToggle(Toggle t)
|
||||
{
|
||||
var index = toggleList.IndexOf(t);
|
||||
var index = ToggleList.IndexOf(t);
|
||||
if (index < 0)
|
||||
return false;
|
||||
|
||||
t.onValueChanged.RemoveAllListeners();
|
||||
toggleList[index] = null;
|
||||
ToggleList[index] = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -302,14 +476,42 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// <param name="allowDestroy">是否同时销毁所有toggle</param>
|
||||
public void CleanToggle(bool allowDestroy)
|
||||
{
|
||||
foreach (var t in toggleList)
|
||||
foreach (var t in ToggleList)
|
||||
{
|
||||
t.onValueChanged.RemoveAllListeners();
|
||||
if (allowDestroy)
|
||||
Object.Destroy(t);
|
||||
}
|
||||
|
||||
toggleList.Clear();
|
||||
ToggleList.Clear();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 事件流程
|
||||
|
||||
/// <summary>
|
||||
/// 强制标记映射关系脏,在下次运行时将自动按需更新
|
||||
/// </summary>
|
||||
public void SetDirty()
|
||||
{
|
||||
_mappingDirty = true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 查找当前选中实例在列表中的索引位置
|
||||
/// </summary>
|
||||
public int CurrentSelectToggleIndex()
|
||||
{
|
||||
for (var i = 0; i < ToggleList.Count; i++)
|
||||
{
|
||||
if (!ToggleList[i].isOn) continue;
|
||||
_nowSelectToggleIndex = i;
|
||||
return _nowSelectToggleIndex;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -319,25 +521,30 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// <param name="t"></param>
|
||||
private void ToggleAddEvent(Toggle t)
|
||||
{
|
||||
t.onValueChanged.AddListener(a =>
|
||||
t.onValueChanged.RemoveListener(Listener);
|
||||
t.onValueChanged.AddListener(Listener);
|
||||
return;
|
||||
|
||||
void Listener(bool b)
|
||||
{
|
||||
if (a) ToggleRegister(t);
|
||||
});
|
||||
if (b) ToggleRegister(t);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// toggle注册的事件,只有当按下时才需要调用此事件。
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
private void ToggleRegister(Toggle t)
|
||||
protected virtual void ToggleRegister(Toggle t)
|
||||
{
|
||||
nowSelectToggle = t;
|
||||
nowSelectToggleIndex = GetIndex(t);
|
||||
_nowSelectToggleIndex = GetIndex(t);
|
||||
OnAnyToggleSwitchOn?.Invoke(t);
|
||||
OnAnyToggleIndexSwitchOn?.Invoke(nowSelectToggleIndex);
|
||||
OnAnyToggleIndexSwitchOn?.Invoke(_nowSelectToggleIndex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取toggle代表的索引
|
||||
/// </summary>
|
||||
@@ -345,7 +552,17 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// <returns>如果这个toggle不存在于当前的单选项组中,返回-1</returns>
|
||||
public int GetIndex(Toggle target)
|
||||
{
|
||||
return toggleList.IndexOf(target);
|
||||
if (target == null)
|
||||
{
|
||||
Debug.LogError("无法查询空toggle的索引");
|
||||
return 0;
|
||||
}
|
||||
|
||||
var index = ToggleList.IndexOf(target);
|
||||
if (index >= 0)
|
||||
return index;
|
||||
Debug.LogError($"无法查询 {target.name} 在当前单选项组中的索引。");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -356,10 +573,11 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// <returns></returns>
|
||||
public bool TryGetIndex(Toggle target, out int index)
|
||||
{
|
||||
index = toggleList.IndexOf(target);
|
||||
index = ToggleList.IndexOf(target);
|
||||
return index >= 0;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 设置单选项激活
|
||||
/// </summary>
|
||||
@@ -375,9 +593,9 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// <param name="index"></param>
|
||||
public void SetToggleOn(int index)
|
||||
{
|
||||
if (0 < index && index < toggleList.Count)
|
||||
if (0 <= index && index < ToggleList.Count)
|
||||
{
|
||||
SetToggleOn(toggleList[index]);
|
||||
SetToggleOn(ToggleList[index]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,6 +605,7 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// <param name="target"></param>
|
||||
public void SetToggleOnWithoutNotify(Toggle target)
|
||||
{
|
||||
_nowSelectToggleIndex = GetIndex(target);
|
||||
target.SetIsOnWithoutNotify(true);
|
||||
}
|
||||
|
||||
@@ -396,9 +615,9 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
/// <param name="index"></param>
|
||||
public void SetToggleOnWithoutNotify(int index)
|
||||
{
|
||||
if (0 < index && index < toggleList.Count)
|
||||
if (0 < index && index < ToggleList.Count)
|
||||
{
|
||||
SetToggleOnWithoutNotify(toggleList[index]);
|
||||
SetToggleOnWithoutNotify(ToggleList[index]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -409,22 +628,76 @@ namespace XericLibrary.Runtime.MacroLibrary
|
||||
public void Clear()
|
||||
{
|
||||
ToggleGroup.RemoveToggleGroupChangeEvent();
|
||||
toggleList.Clear();
|
||||
ToggleList.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除映射结构,并销毁所有toggle组件
|
||||
/// </summary>
|
||||
public void RemoveAllToggle()
|
||||
public void DestroyAllToggle()
|
||||
{
|
||||
for (int i = toggleList.Count - 1; i >= 0; i--)
|
||||
for (int i = ToggleList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
Object.Destroy(toggleList[i]);
|
||||
Object.Destroy(ToggleList[i]);
|
||||
}
|
||||
|
||||
Clear();
|
||||
}
|
||||
|
||||
|
||||
public IEnumerator<Toggle> GetEnumerator()
|
||||
{
|
||||
return ToggleList.GetEnumerator();
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 额外方法
|
||||
|
||||
public bool GetActive() => ToggleList.Any(a => a.gameObject.activeSelf);
|
||||
|
||||
public bool GetActiveInHierarchy() => ToggleList.Any(a => a.gameObject.activeInHierarchy);
|
||||
|
||||
public void SetActive(bool active)
|
||||
{
|
||||
ToggleGroup.gameObject.SetActivity(active);
|
||||
ToggleList.ForEachDo(a => a.gameObject.SetActive(active));
|
||||
}
|
||||
|
||||
public void SetActiveInHierarchy(bool active)
|
||||
{
|
||||
ToggleGroup.gameObject.SetActivity(active);
|
||||
ToggleList.ForEachDo(a => a.gameObject.SetActivityInHierarchy(active));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 过时
|
||||
|
||||
/// <summary>
|
||||
/// 清除映射结构,并销毁所有toggle组件
|
||||
/// </summary>
|
||||
[Obsolete("方法命名不规范,改为使用DestroyAllToggle")]
|
||||
public void RemoveAllToggle()
|
||||
=> DestroyAllToggle();
|
||||
|
||||
/// <summary>
|
||||
/// 当前选中的toggle索引,依赖缓存,对于绕过该容器的单选项控制行为可能存在追踪不准确的问题。
|
||||
/// </summary>
|
||||
[Obsolete("命名过时")]
|
||||
public int NowSelectToggleIndex => CurrentSelectIndex;
|
||||
|
||||
/// <summary>
|
||||
/// 当前选中的toggle
|
||||
/// </summary>
|
||||
[Obsolete("命名规范过时")]
|
||||
public Toggle NowSelectToggle => CurrentSelectToggle;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@ namespace Deconstruction.UI.TmpText
|
||||
/// </summary>
|
||||
/// <param name="forceRefesh">强制刷新,如果刷新过一次,之后不论设定如何都将直接从缓存中返回对象,置位将跳过这个缓存</param>
|
||||
/// <param name="requirementHyperlink">强制给带有link标记的对象加上超链接组件</param>
|
||||
/// <param name="includeRepeatedMarking">包括重复标记(也就是是否包含另一个超链接管理器作用域下的超链接对象)</param>
|
||||
/// <param name="includeRepeatedMarking">是否包含重复引用的链接(是否包含当前超链接管理器下其他超链接管理器作用域下的超链接对象)</param>
|
||||
/// <returns></returns>
|
||||
public List<TMPHyperlinkReceiver> GetChildrenTmpText2Hyperlink(
|
||||
bool forceRefesh = false,
|
||||
@@ -255,5 +255,11 @@ namespace Deconstruction.UI.TmpText
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#if ODIN_INSPECTOR
|
||||
[Button]
|
||||
#endif
|
||||
public void RefreshHyperLink()
|
||||
=> GetChildrenTmpText2Hyperlink(true);
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6872d3ed7dad0cd49b4e0f92ce6e95b1
|
||||
guid: 138831b823d56714db753f3bbfcca789
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user