又是挑战自己的无知的一天
UnityEvent
比较好处理
Delegate 呢 (by Inspector)

(最终结果是这样的,↑↑,暂时只有string , 之后在看怎么点击跳转)
Unity并不会默认在 Inspector 显示 Delegate(主要是没序列化不好控制吧)
缺点
没序列化,无法默认 Draw Property
优点
还是没序列化,相互区隔;就可以避免序列化产生的代码持有问题
cs
public string[] GetJugadaFinalizadaListenerNames()
{
var callbacks = JugadaFinalizadaDelegate?.GetInvocationList();
if (callbacks == null)
{
return System.Array.Empty<string>();
}
string[] listenerNames = new string[callbacks.Length];
for (int i = 0; i < callbacks.Length; i++)
{
var callback = callbacks[i];
string targetTypeName = callback.Target != null
? callback.Target.GetType().Name
: callback.Method.DeclaringType?.Name ?? "Static";
listenerNames[i] = targetTypeName + "." + callback.Method.Name;
}
return listenerNames;
}
参考 - 无厘头 Inspector 一些写法
太多代码想记录下来了

??、111111
ValueDropDown
cs
/// <summary>
/// cankao:https://www.youtube.com/watch?v=06_giCwo2u4;
/// 无用了??,还不如用回Unity Editor....
/// </summary>
public class UBlackboardEntryCondDrawer : OdinValueDrawer<AnyCalcuteValue_Ref>
{
protected override void DrawPropertyLayout(GUIContent label)
{
GUIHelper.PushLabelWidth(50);
DrawSearchablDrawdown();
GUIHelper.PopLabelWidth();
}
void DrawSearchablDrawdown() {
//创造root
var root = new SearchableDropdownItem("Assembly");
root.AddChild(new SearchableDropdownItem(EditorStyle.NoneStr, null));
root.AddSeparator();
//创造两个假的数据
var child = new SearchableDropdownItem("levelSceneModule", "levelSceneModule");
root.AddChild(child);
child = new SearchableDropdownItem("xxxx", "???");
root.AddChild(child);
var target = this.ValueEntry.SmartValue;
bool CheckNullFunc() => string.IsNullOrEmpty(target.typeValue);
void ResetFunc() => target.typeValue= "";
string CurrentDisplayNameGetter()
{
return target.typeValue;
}
void OnClick(SearchableDropdownItem item)
{
this.ValueEntry.SmartValue.typeValue = item.Value.ToString();
}
GUIUtil.SearchableDropdownList("Sel Type & Method", root, CheckNullFunc, ResetFunc, CurrentDisplayNameGetter, OnClick);
}
}
更优雅改颜色
关键在于 IDisposable 这个 C# 类;;;;;;之前我是真不知道。。。。
cs
internal struct ColorScope : IDisposable
{
public Color OriginalColor;
public ColorScope(Color color, Func<bool> predicate = null)
{
OriginalColor = GUI.color;
if (predicate == null || predicate())
{
GUI.color = color;
}
}
public void Dispose()
{
GUI.color = OriginalColor;
}
}
全局搜索"implicit operator "
implicit operator 是 C# 的隐式类型转换运算符,在 Unity 里主要用来让两种类型之间可以"自动转换",不需要写强制转换。
