public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
        {
            _target = PlayMakerInspectorUtils.GetBaseProperty <PlayMakerFsmVariable>(property);

            // TODO: allow option to force a particular type of variable
            ScanAttributesIfNeeded(property);

            rowCount = _noVariablesSelectable?2:3;             // ideal scenario


            // we let the user choose amongst globavariables if not target attribute and when target is defined.
            // else we error out
            if (_variabletargetTarget != null && !_variabletargetTarget.isTargetAvailable)
            {
                rowCount = 1;
            }

            return(base.GetPropertyHeight(property, label) * (rowCount));
        }
        void ScanAttributesIfNeeded(SerializedProperty property)
        {
            if (!attributeScanned)
            {
                attributeScanned = true;


                // check for FsmVariableTargetVariable Attribute
                object[] _variableTargets = this.fieldInfo.GetCustomAttributes(typeof(FsmVariableTargetVariable), true);

                if (_variableTargets.Length > 0)
                {
                    string variableName = (_variableTargets[0] as FsmVariableTargetVariable).variable;
                    variableTargetVariable = property.serializedObject.FindProperty(variableName);

                    _variabletargetTarget = PlayMakerInspectorUtils.GetBaseProperty <PlayMakerFsmVariableTarget>(variableTargetVariable);
                }

                if (variableTargetVariable != null)
                {
                    variableTarget    = variableTargetVariable.FindPropertyRelative("variableTarget");
                    gameObject        = variableTargetVariable.FindPropertyRelative("gameObject");
                    fsmComponent      = variableTargetVariable.FindPropertyRelative("fsmComponent");
                    isTargetAvailable = variableTargetVariable.FindPropertyRelative("isTargetAvailable");
                }

                // check for FsmVariableType Attribute
                //	object[] _variableTypes = this.fieldInfo.GetCustomAttributes(typeof(),true);

                /*
                 * if (_variableTypes.Length>0)
                 * {
                 *      VariableType variableType = (_variableTypes[0] as FsmVariableType).variableType;
                 * }
                 */
            }
        }
Beispiel #3
0
        public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
        {
            _target = PlayMakerInspectorUtils.GetBaseProperty <PlayMakerFsmVariableTarget>(prop);

            bool isDirty = false;

            fsmVariableTarget = prop.FindPropertyRelative("variableTarget");
            int _variableTargetIndex = fsmVariableTarget.enumValueIndex;

            gameObject   = prop.FindPropertyRelative("gameObject");
            fsmName      = prop.FindPropertyRelative("fsmName");
            fsmComponent = prop.FindPropertyRelative("_fsmComponent");

            CacheOwnerGameObject(prop.serializedObject);

            int row = 0;

            // draw the enum popup Field
            int oldEnumIndex = fsmVariableTarget.enumValueIndex;

            // force the GameObject value to be the owner when switching to it
            // this is just to fall back nicely on a preset that is the expected one, as opposed to target nothing
            if (oldEnumIndex == 0 && gameObject.objectReferenceValue != ownerGameObject)
            {
                gameObject.objectReferenceValue = ownerGameObject;
                fsmName.stringValue             = "";
                isDirty = true;
            }

            EditorGUI.PropertyField(
                GetRectforRow(pos, ++row - 1),
                fsmVariableTarget, label, true);

            if (_variableTargetIndex != fsmVariableTarget.enumValueIndex)
            {
                prop.serializedObject.ApplyModifiedProperties();
                prop.serializedObject.Update();
                _target.Initialize(true);

                //Debug.Log("Initialized isTargetAvailable?"+_target.isTargetAvailable);
                return;
            }

            // force the GameObject value to be the owner when switching to it
            // this is just to fall back nicely on a preset that is the expected one, as opposed to target nothing
            if (oldEnumIndex == 0 && gameObject.objectReferenceValue != ownerGameObject)
            {
                gameObject.objectReferenceValue = ownerGameObject;
                fsmName.stringValue             = "";
                isDirty = true;
            }

            // Additional fields
            if (fsmVariableTarget.enumValueIndex == 0 || fsmVariableTarget.enumValueIndex == 1)         // targeting Owner or GameObject:
            {
                if (string.IsNullOrEmpty(fsmName.stringValue) || !updateFsmList())
                {
                    GameObject _go = (GameObject)gameObject.objectReferenceValue;
                    if (_go != null)
                    {
                        PlayMakerFSM _fsm = _go.GetComponent <PlayMakerFSM>();
                        if (_fsm != null)
                        {
                            fsmName.stringValue = _fsm.FsmName;
                            isDirty             = true;
                        }
                    }
                }

                EditorGUI.indentLevel++;

                if (fsmVariableTarget.enumValueIndex == 1)
                {
                    int _goId = gameObject.objectReferenceInstanceIDValue;
                    EditorGUI.PropertyField(
                        GetRectforRow(pos, ++row - 1),
                        gameObject, new GUIContent("Game Object"), true);

                    if (_goId != gameObject.objectReferenceInstanceIDValue)
                    {
                        isDirty = true;
                    }
                }

                Rect _rect = GetRectforRow(pos, ++row - 1);


                string _name      = fsmName.stringValue;
                Rect   _fieldRect = new Rect(_rect);
                _fieldRect.width -= 18;
                EditorGUI.PropertyField(
                    _fieldRect,
                    fsmName, new GUIContent("Fsm Name"), true);

                if (_name != fsmName.stringValue)
                {
                    isDirty = true;
                }

                _rect.xMin = _rect.xMax - 16;

                // Fsm Name Popup
                if (GUI.Button(
                        _rect,
                        "",
                        EditorStyles.popup)
                    )
                {
                    updateFsmList();

                    GenericMenu menu = GenerateFsmMenu(fsmList, fsmName.stringValue);
                    menu.DropDown(_fieldRect);

                    // move the focus out to reflect the change of the menu selection
                    GUI.SetNextControlName("noFocus");
                    GUI.FocusControl("noFocus");
                }


                EditorGUI.indentLevel--;
            }
            else if (fsmVariableTarget.enumValueIndex == 3)              // targeting  FsmComponent;

            {
                EditorGUI.indentLevel++;

                int _objId = fsmComponent.objectReferenceInstanceIDValue;
                EditorGUI.PropertyField(
                    GetRectforRow(pos, ++row - 1),
                    fsmComponent, new GUIContent("Fsm Component"), true);

                if (_objId != fsmComponent.objectReferenceInstanceIDValue)
                {
                    Debug.Log("yo " + _objId + " " + fsmComponent.objectReferenceInstanceIDValue);
                    isDirty = true;
                }

                EditorGUI.indentLevel--;
            }

            // attempt to refresh UI and avoid glitch
            if (row != rowCount || isDirty)
            {
                prop.serializedObject.ApplyModifiedProperties();
                prop.serializedObject.Update();

                _target.Initialize(true);
            }



            // update the rowCount to compute the right interface height
            rowCount = row;
        }