/// <summary> /// Draws the data field. /// </summary> /// <param name="position"></param> /// <param name="property"></param> /// <param name="label"></param> protected void DrawDataField(Rect position, SerializedProperty property, GUIContent label) { SerializedProperty useConstant = property.FindPropertyRelative("UseConstant"); Event currentEvent = Event.current; _mouseDragArea.x = position.x; _mouseDragArea.y = position.y; _mouseDragArea.width = position.width; _mouseDragArea.height = EditorGUIUtility.singleLineHeight; if (_mouseDragArea.Contains(currentEvent.mousePosition)) { if (currentEvent.type == EventType.DragUpdated) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; currentEvent.Use(); } else if (currentEvent.type == EventType.DragPerform && DragAndDrop.objectReferences.Length > 0) { Object draggedObject = DragAndDrop.objectReferences[0]; SerializedProperty referenceProperty = property.FindPropertyRelative("VariableType"); Type variableType = TypeExtensions.GetInstanceType(referenceProperty.type); if (draggedObject.GetType().IsAssignableFrom(variableType)) { referenceProperty.objectReferenceValue = draggedObject; useConstant.boolValue = false; property.serializedObject.ApplyModifiedProperties(); } currentEvent.Use(); return; } } if (_labelContent == null) { _labelContent = new GUIContent(label.text, label.image, label.tooltip); } SerializedProperty displayValueChangedProperty = property.FindPropertyRelative("_displayValueChangedEvent"); _displayValueChangedEvent = displayValueChangedProperty.boolValue; _isConstant = useConstant.boolValue; label = EditorGUI.BeginProperty(position, GUIContent.none, property); _currentPosition = EditorGUI.PrefixLabel(position, _labelContent); _positionWidth = _currentPosition.width; _currentPosition.width = _positionWidth * 0.2f; _currentPosition.height = EditorGUIUtility.singleLineHeight; EditorGUI.LabelField(position, label); _buttonsRect.x = _currentPosition.x; _buttonsRect.y = _currentPosition.y; _buttonsRect.width = _buttonWidth; _buttonsRect.height = _currentPosition.height; if (GUI.Button(_buttonsRect, _rButtonContent)) { _isConstant = false; } _buttonsRect.x += _buttonWidth; if (GUI.Button(_buttonsRect, _vButtonContent)) { _isConstant = true; } if (_isConstant) { _buttonsRect.x += _buttonWidth; _buttonsRect.width += 6f; // SerializedProperty persistentCalls = // property.FindPropertyRelative("OnConstantValueChanged._PersistentCalls"); // Color originalColour = GUI.backgroundColor; // if (GUI.Button(_buttonsRect, $"E{persistentCalls.arraySize}")) // { // _displayValueChangedEvent = !_displayValueChangedEvent; // } // GUI.backgroundColor = originalColour; } _currentPosition.x += _positionWidth * 0.28f; _currentPosition.width = _positionWidth * 0.72f; bool propertyIsArray = property.propertyPath.Contains("Array"); if (_isConstant) { EditorGUI.BeginChangeCheck(); EditorGUI.PropertyField(_currentPosition, property.FindPropertyRelative("ConstantValueType"), GUIContent.none); if (EditorGUI.EndChangeCheck()) { _invokeChangeEvent = true; } _lineHeight = propertyIsArray ? _lineHeight : 0f; } else { SerializedProperty referenceProperty = property.FindPropertyRelative("VariableType"); bool nullDetected = false; Color currentColour = Color.white; if (referenceProperty.propertyType == SerializedPropertyType.ObjectReference) { nullDetected = referenceProperty.objectReferenceValue == null; if (nullDetected) { currentColour = GUI.color; } } EditorGUI.PropertyField(_currentPosition, referenceProperty, GUIContent.none); if (nullDetected) { GUI.color = currentColour; } if (!propertyIsArray) { Type dataType = property.serializedObject.targetObject.GetType(); FieldInfo fieldData = dataType.GetField(property.propertyPath); if (fieldData != null) { _dataValue = (DataField)fieldData.GetValue(property.serializedObject.targetObject); } } PrimitiveData valueVariable = _dataValue?.GetVariable(); object valueData = valueVariable != null?valueVariable.GetValueData() : null; if (valueData != null) { _currentPosition.y += EditorGUIUtility.singleLineHeight; _lineHeight = EditorGUIUtility.singleLineHeight; _currentPosition.width -= 24f; EditorGUI.LabelField(_currentPosition, valueData.ToString(), EditorStyles.toolbarButton); _currentPosition.x += _currentPosition.width + 2; _currentPosition.width = 22f; if (GUI.Button(_currentPosition, "→")) { Selection.activeObject = valueVariable; EditorGUIUtility.PingObject(valueVariable); } } else { _lineHeight = propertyIsArray ? _lineHeight : 0f; } } if (_displayValueChangedEvent && _isConstant) { _currentPosition.x = position.x; _currentPosition.y += EditorGUIUtility.singleLineHeight; _currentPosition.width = position.width; EditorGUI.PropertyField(_currentPosition, property.FindPropertyRelative("OnConstantValueChanged")); } EditorGUI.EndProperty(); if (GUI.changed) { useConstant.boolValue = _isConstant; displayValueChangedProperty.boolValue = _displayValueChangedEvent; property.serializedObject.ApplyModifiedProperties(); if (_invokeChangeEvent) { // object dataField = fieldInfo.GetValue(property.serializedObject.targetObject); // object _event = dataField.GetType().GetField("OnConstantValueChanged").GetValue(dataField); // MethodInfo invokeMethod = _event.GetType().GetMethod("Invoke"); // invokeMethod.Invoke(_event, new[] {dataField.GetType().GetField("ConstantValueType").GetValue(dataField)}); } } }