Last active
January 23, 2025 01:55
-
-
Save LotteMakesStuff/2d3c6dc7a913ed118601db95735574de to your computer and use it in GitHub Desktop.
Having trouble finding the right property on a component cos theres just so many identical looking fields? Add some color to you inspectors! mark important property with a bright color so it always stands out, or supply a validation function so highlights show on values that would effect the current ingame logic!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// NOTE DONT put in an editor folder | |
using UnityEngine; | |
public class HighlightAttribute : PropertyAttribute | |
{ | |
public HighlightColor Color; | |
public string ValidateMethod; | |
public object Value; | |
public HighlightAttribute(HighlightColor color = HighlightColor.Yellow, string validateMethod = null, object value = null) | |
{ | |
this.Color = color; | |
this.ValidateMethod = validateMethod; | |
this.Value = value; | |
} | |
} | |
public enum HighlightColor | |
{ | |
Red, | |
Pink, | |
Orange, | |
Yellow, | |
Green, | |
Blue, | |
Violet, | |
White | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// NOTE put in a Editor folder | |
using UnityEngine; | |
using UnityEditor; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System.Reflection; | |
[CustomPropertyDrawer(typeof(HighlightAttribute))] | |
public class HighlightDrawer : PropertyDrawer | |
{ | |
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) | |
{ | |
var highlightAttribute = attribute as HighlightAttribute; | |
bool doHighlight = true; | |
// do we have a validation method | |
if (!string.IsNullOrEmpty(highlightAttribute.ValidateMethod)) | |
{ | |
var t = typeof(PlayerController); //property.serializedObject.targetObject.GetType(); | |
var m = t.GetMethod(highlightAttribute.ValidateMethod, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); | |
if (m != null) | |
{ | |
doHighlight = (bool)m.Invoke(property.serializedObject.targetObject, new[] { highlightAttribute.Value}); | |
} | |
else | |
{ | |
Debug.LogError("Invalid Validate function: " + highlightAttribute.ValidateMethod, property.serializedObject.targetObject); | |
} | |
} | |
if (doHighlight) | |
{ | |
// get the highlight color | |
var color = GetColor(highlightAttribute.Color); | |
// create a ractangle to draw the highlight to, slightly larger than our property | |
var padding = EditorGUIUtility.standardVerticalSpacing; | |
var highlightRect = new Rect(position.x - padding, position.y - padding, | |
position.width + (padding * 2), position.height + (padding * 2)); | |
// draw the highlight first | |
EditorGUI.DrawRect(highlightRect, color); | |
// make sure the propertys text is dark and easy to read over the bright highlight | |
var cc = GUI.contentColor; | |
GUI.contentColor = Color.black; | |
// draw the property ontop of the highlight | |
EditorGUI.PropertyField(position, property, label); | |
GUI.contentColor = cc; | |
} | |
else | |
{ | |
EditorGUI.PropertyField(position, property, label); | |
} | |
} | |
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) | |
{ | |
return EditorGUI.GetPropertyHeight(property, label, true); | |
} | |
private Color GetColor(HighlightColor color) | |
{ | |
switch (color) | |
{ | |
case HighlightColor.Red: | |
return new Color32(255, 0, 63, 255); | |
case HighlightColor.Pink: | |
return new Color32(255, 66, 160, 255); | |
case HighlightColor.Orange: | |
return new Color32(255, 128, 0, 255); | |
case HighlightColor.Yellow: | |
return new Color32(255, 211, 0, 255); | |
case HighlightColor.Green: | |
return new Color32(102, 255, 0, 255); | |
case HighlightColor.Blue: | |
return new Color32(0, 135, 189, 255); | |
case HighlightColor.Violet: | |
return new Color32(127, 0, 255, 255); | |
default: | |
return Color.white; | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Demo | |
using UnityEngine; | |
using System.Collections; | |
public class PlayerController : MonoBehaviour | |
{ | |
//[Highlight()] // add a yellow highlight | |
//[Highlight(HighlightColor.Green)] // add highlight with a colour you supply | |
//[Highlight(HighlightColor.Green, "ValidateHighlight")] // highlight with a validate function. pass in a string method name, the method must return a bool | |
//[Highlight(HighlightColor.Green, "ValidateHighlight", value)] // highlight with a validate function. pass in a string method name and one argument | |
[Highlight(HighlightColor.Green, "ValidateHighlight", PlayerState.Moving)] | |
public float moveSpeed; | |
[Highlight(HighlightColor.Red, "ValidateHighlight", PlayerState.Stopping)] | |
public float breakSpeed; | |
[Highlight(HighlightColor.Yellow, "ValidateHighlight", PlayerState.Jumping)] | |
public float jumpForce; | |
[ReadOnly] // see https://gist.github.com/LotteMakesStuff/c0a3b404524be57574ffa5f8270268ea for implementation | |
public PlayerState state; | |
bool ValidateHighlight(PlayerState checkState)//(PlayerState state) | |
{ | |
return state == checkState; | |
} | |
float timer = 0; | |
// Update is called once per frame | |
void Update () | |
{ | |
timer += Time.deltaTime; | |
state = PlayerState.Idle; | |
if (timer >= 1) | |
state = PlayerState.Moving; | |
if (timer >= 2) | |
state = PlayerState.Stopping; | |
if (timer >= 3) | |
state = PlayerState.Jumping; | |
if (timer >= 4) | |
timer = 0; | |
} | |
} | |
public enum PlayerState | |
{ | |
Idle, | |
Moving, | |
Stopping, | |
Jumping | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment