/// <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; } }
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(); }