Custom Inspector Script Resetting Information
I created a Custom Editor for a GunObject class which should allow you to select a MonoScript (which is a class that derives from FireBehaviour) and then create an instance of that class which is stored in the GunObject.
It works perfectly fine until I press the Play button or select a different target for the Inspector, which causes the information displayed in the Inspector is reset.
Here is the Editor Script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(GunObject))]
public class WeaponScriptEditor : Editor {
private SerializedProperty behaviour;
private MonoScript behaviourScript;
public void OnEnable() {
behaviour = serializedObject.FindProperty("behaviour");
}
public override void OnInspectorGUI() {
serializedObject.Update ();
FireBehaviour b=null;
behaviourScript = (MonoScript)EditorGUILayout.ObjectField ("Fire Behaviour", behaviourScript, typeof(MonoScript), false);
if (behaviourScript != null && behaviourScript.GetClass ().IsSubclassOf (typeof(FireBehaviour))) {
b = (FireBehaviour)ScriptableObject.CreateInstance (behaviourScript.GetClass ());
Editor editor = Editor.CreateEditor (b);
EditorGUILayout.LabelField ("Fire Behaviour Editor:");
editor.OnInspectorGUI ();
AssetDatabase.AddObjectToAsset (b, target);
behaviour.objectReferenceValue = b;
} else {
EditorGUILayout.LabelField ("Script must derive from FireBehaviour!");
}
serializedObject.ApplyModifiedProperties();
}
}
Here is the GunObject Class:
using UnityEngine;
using UnityEngine.Events;
using System.Collections;
using UnityEditor;
[CreateAssetMenu()]
public class GunObject : ScriptableObject {
public FireBehaviour behaviour;
public void Act() {
if (Input.GetButton ("Primary Fire")) {
behaviour.PrimFire ();
}
if (Input.GetButton ("Alt Fire")) {
behaviour.AltFire ();
}
if (Input.GetButton ("Reload")) {
behaviour.Reload ();
}
}
}
Here is the FireBehaviour Class:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FireBehaviour : ScriptableObject {
public virtual void PrimFire () {}
public virtual void AltFire () {}
public virtual void Reload () {}
}
I've tried a few different things including AssetDatabase.SaveAssets among others, but nothing I find online seems to work.
Also, AssetDatabase.AddObjectToAsset keeps adding new instances to the asset every time OnInspectorGUI is called, so I was wondering if there was a better way to go about that.
Thanks for any help! I could really use some.