using System; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif // Source: https://answers.unity.com/questions/489942/how-to-make-a-readonly-property-in-inspector.html /// /// Display a field with disabled read-only controls in the inspector. /// Works with CustomPropertyDrawers. /// /// /// /// public class ShowOnlyAttribute : PropertyAttribute { } /// /// Display a field as a custom read-only text in the inspector. /// CustomPropertyDrawers will not work when this attribute is used. /// /// /// /// public class ReadOnlyAttribute : PropertyAttribute { } /// /// Display one or more fields as read-only in the inspector. /// Use to close the group. /// Works with CustomPropertyDrawers. /// /// /// public class BeginShowOnlyGroupAttribute : PropertyAttribute { } /// /// Use with . /// Close the read-only group and resume editable fields. /// /// /// public class EndShowOnlyGroupAttribute : PropertyAttribute { } // Custom Drawers declarations must be in a if Unity Editor assembly condition to allow a project to compile #if UNITY_EDITOR [CustomPropertyDrawer(typeof(ShowOnlyAttribute))] public class ShowOnlyDrawer : PropertyDrawer { public override float GetPropertyHeight( SerializedProperty property, GUIContent label ) { return EditorGUI.GetPropertyHeight( property, label, true ); } public override void OnGUI( Rect position, SerializedProperty prop, GUIContent label ) { var currentGuiState = GUI.enabled; GUI.enabled = false; EditorGUI.PropertyField(position, prop, label, true); GUI.enabled = currentGuiState; } } [CustomPropertyDrawer( typeof( ReadOnlyAttribute ) )] public class ReadOnlyDrawer : PropertyDrawer { public override float GetPropertyHeight( SerializedProperty property, GUIContent label ) { return EditorGUI.GetPropertyHeight( property, label, true ); } public override void OnGUI( Rect position, SerializedProperty prop, GUIContent label ) { EditorGUI.LabelField(position, label.text,PropToString(prop)); } private string PropToString(SerializedProperty prop) { string valueStr; switch (prop.propertyType) { case SerializedPropertyType.Generic: valueStr = "Array"; break; case SerializedPropertyType.Integer: valueStr = prop.intValue.ToString(); break; case SerializedPropertyType.Boolean: valueStr = prop.boolValue.ToString(); break; case SerializedPropertyType.Float: valueStr = prop.floatValue.ToString("0.00000"); break; case SerializedPropertyType.String: valueStr = prop.stringValue; break; case SerializedPropertyType.Enum: valueStr = prop.enumDisplayNames[prop.enumValueIndex]; break; case SerializedPropertyType.ObjectReference: try { valueStr = prop.objectReferenceValue.ToString(); } catch (NullReferenceException) { valueStr = "Object ToString not defined"; } break; case SerializedPropertyType.Vector4: valueStr = prop.vector4Value.ToString(); break; case SerializedPropertyType.Vector3: valueStr = prop.vector3Value.ToString(); break; case SerializedPropertyType.Vector2: valueStr = prop.vector2Value.ToString(); break; case SerializedPropertyType.Vector2Int: valueStr = prop.vector2IntValue.ToString(); break; case SerializedPropertyType.Vector3Int: valueStr = prop.vector3IntValue.ToString(); break; default: valueStr = "( " + prop.type + " isn't supported )"; break; } return valueStr; } } [CustomPropertyDrawer( typeof( BeginShowOnlyGroupAttribute ) )] public class BeginShowOnlyGroupDrawer : DecoratorDrawer { public override float GetHeight() { return 0; } public override void OnGUI( Rect position ) { GUI.enabled = false; } } [CustomPropertyDrawer( typeof( EndShowOnlyGroupAttribute ) )] public class EndShowOnlyGroupDrawer : DecoratorDrawer { public override float GetHeight() { return 0; } public override void OnGUI( Rect position ) { GUI.enabled = true; } } #endif