Files
Temp.BattleRoyale.Map.Unity/Assets/Standard Assets/LUMINATE/Scripts/Editor/GapperGamesConditionalHidePropertyDrawer.cs

86 lines
3.6 KiB
C#
Raw Permalink Normal View History

2024-05-13 01:28:33 +08:00
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
namespace GapperGames
{
[CustomPropertyDrawer(typeof(GapperGamesConditionalHideAttribute))]
public class GapperGamesConditionalHidePropertyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GapperGamesConditionalHideAttribute condHAtt = (GapperGamesConditionalHideAttribute)attribute;
bool enabled = GetConditionalHideAttributeResult(condHAtt, property) == condHAtt.showIfTrue;
if (enabled)
{
EditorGUI.PropertyField(position, property, label, true);
}
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
GapperGamesConditionalHideAttribute condHAtt = (GapperGamesConditionalHideAttribute)attribute;
bool enabled = GetConditionalHideAttributeResult(condHAtt, property) == condHAtt.showIfTrue;
if (enabled)
{
return EditorGUI.GetPropertyHeight(property, label);
}
//We want to undo the spacing added before and after the property
return -EditorGUIUtility.standardVerticalSpacing;
}
bool GetConditionalHideAttributeResult(GapperGamesConditionalHideAttribute condHAtt, SerializedProperty property)
{
SerializedProperty sourcePropertyValue = null;
//Get the full relative property path of the sourcefield so we can have nested hiding.Use old method when dealing with arrays
if (!property.isArray)
{
string propertyPath = property.propertyPath; //returns the property path of the property we want to apply the attribute to
string conditionPath = propertyPath.Replace(property.name, condHAtt.conditionalSourceField); //changes the path to the conditionalsource property path
sourcePropertyValue = property.serializedObject.FindProperty(conditionPath);
//if the find failed->fall back to the old system
if (sourcePropertyValue == null)
{
//original implementation (doens't work with nested serializedObjects)
sourcePropertyValue = property.serializedObject.FindProperty(condHAtt.conditionalSourceField);
}
}
else
{
//original implementation (doens't work with nested serializedObjects)
sourcePropertyValue = property.serializedObject.FindProperty(condHAtt.conditionalSourceField);
}
if (sourcePropertyValue != null)
{
return CheckPropertyType(condHAtt, sourcePropertyValue);
}
return true;
}
bool CheckPropertyType(GapperGamesConditionalHideAttribute condHAtt, SerializedProperty sourcePropertyValue)
{
//Note: add others for custom handling if desired
switch (sourcePropertyValue.propertyType)
{
case SerializedPropertyType.Boolean:
return sourcePropertyValue.boolValue;
case SerializedPropertyType.Enum:
return sourcePropertyValue.enumValueIndex != condHAtt.enumIndex;
default:
Debug.LogError("Data type of the property used for conditional hiding [" + sourcePropertyValue.propertyType + "] is currently not supported");
return true;
}
}
}
}