Пример #1
0
        /// <summary>
        /// 【重要】無限ループ防止
        /// </summary>
        public void ValidateParent()
        {
            if (!_Parent)
            {
                return;
            }

            // 自身への参照が見つかったらその親は使えない
            Breed current = _Parent;

            while (current)
            {
                if (current == this)
                {
                    _Parent = null;
                    Debug.LogError("[Breed] 無効な親系統です");
                    break;
                }
                current = current._Parent;
            }
        }
Пример #2
0
        public override void OnInspectorGUI()
        {
            var breed = target as Breed;

            // 最新データを取得
            serializedObject.Update();

            // 親系統
            using (var check = new EditorGUI.ChangeCheckScope())
            {
                EditorGUILayout.PropertyField(parentProp, parentLabel);
                if (check.changed)
                {
                    // 一旦反映させて、無効な親系統でないかチェック
                    serializedObject.ApplyModifiedProperties();
                    breed.ValidateParent();
                    serializedObject.Update();
                }
            }

            // ↓変更検知はこの書き方でもOK
            //EditorGUI.BeginChangeCheck();
            //EditorGUILayout.PropertyField(parentProp, parentLabel);
            //if (EditorGUI.EndChangeCheck())
            //{
            //	serializedObject.ApplyModifiedProperties();
            //	breed.ValidateParent();
            //	serializedObject.Update();
            //}

            Breed parent = parentProp.objectReferenceValue as Breed;

            if (!parent)
            {
                // 親系統を持たない場合、各パラメータの編集のみ
                EditorGUILayout.PropertyField(nameProp, nameLabel);
                EditorGUILayout.PropertyField(attackMessageProp, attackMessageLabel);
                EditorGUILayout.PropertyField(weaknessesProp, weaknessesLabel);
            }
            else
            {
                // 親系統の系統名を表示する
                EditorGUILayout.LabelField($"{nameLabel.text} : {parent.Name}");

                EditorGUILayout.Space();

                // 攻撃メッセージを上書きするか
                bool prevOverrideAttackMessage = overrideAttackMessageProp.boolValue;
                EditorGUILayout.PropertyField(overrideAttackMessageProp, overrideAttackMessageLabel);
                if (overrideAttackMessageProp.boolValue)
                {
                    if (!prevOverrideAttackMessage)
                    {
                        // オフ → オンになった時に親の攻撃メッセージを取ってくる
                        attackMessageProp.stringValue = parent.AttackMessage;
                    }

                    // 上書きをするなら書き換え
                    EditorGUILayout.PropertyField(attackMessageProp, attackMessageLabel);
                }
                else
                {
                    // 上書きしないなら親系統のものを表示する
                    EditorGUILayout.LabelField($"{attackMessageLabel.text} : {parent.AttackMessage}");

                    // 親系統のものを使うということは、このBreedが持つ攻撃メッセージは不要
                    // データを節約しておく
                    // ※ 編集の都合上、保持してくれていた方が嬉しいこともあるのでケースバイケース
                    attackMessageProp.stringValue = string.Empty;
                }

                EditorGUILayout.Space();

                // 弱点武器を上書きするか
                EditorGUILayout.PropertyField(overrideWeaknessesProp, overrideWeaknessesLabel);
                if (overrideWeaknessesProp.boolValue)
                {
                    // 上書きをするなら書き換え
                    EditorGUILayout.PropertyField(weaknessesProp, weaknessesLabel);
                }
                else
                {
                    // 上書きしないなら親系統のものを表示する
                    EditorGUILayout.LabelField($"{weaknessesLabel.text} : {parent.Weaknesses}");
                }
            }

            // 変更点を反映させる
            serializedObject.ApplyModifiedProperties();
        }