This commit is contained in:
2026-07-09 21:33:33 +02:00
commit 84a2a365f3
2364 changed files with 950134 additions and 0 deletions
@@ -0,0 +1,75 @@
using System;
using System.Linq;
using System.Reflection;
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic
{
[Serializable]
[HideReferenceObjectPicker]
public class MultiSourceWrapper<T> where T : class
{
/// <summary>
/// Returns value from given source:
/// - From inline object
/// - From selected ScriptableObject (that have field "value")
/// </summary>
public T value => _usageType switch
{
MultiSourceUsageType.None => null,
MultiSourceUsageType.Inline => _value,
MultiSourceUsageType.ScriptableObject => _valueFromScriptableObject,
_ => throw new ArgumentOutOfRangeException()
};
[SerializeField]
[EnumToggleButtons]
[OnValueChanged(nameof(OnUsageTypeChange))]
[HideLabel]
private MultiSourceUsageType _usageType;
[SerializeField]
[ShowIf(nameof(_usageType), MultiSourceUsageType.Inline)]
[HideLabel]
private T _value;
[SerializeField]
[ShowIf(nameof(_usageType), MultiSourceUsageType.ScriptableObject)]
[OnValueChanged(nameof(OnScriptableObjectSelected))]
[HideLabel]
private ScriptableObject _scriptableObject;
private T _valueFromScriptableObject;
private void OnScriptableObjectSelected()
{
var field = _scriptableObject.GetType()
.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
.FirstOrDefault(field => field.Name == "value" && field.FieldType == typeof(T));
_valueFromScriptableObject = field == null ? default : field.GetValue(_scriptableObject) as T;
}
private void OnUsageTypeChange()
{
switch (_usageType)
{
case MultiSourceUsageType.None:
_value = null;
_scriptableObject = null;
_valueFromScriptableObject = null;
break;
case MultiSourceUsageType.Inline:
_scriptableObject = null;
_valueFromScriptableObject = null;
break;
case MultiSourceUsageType.ScriptableObject:
_value = null;
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}