Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by caykroyd · Aug 15, 2019 at 09:44 PM · scriptableobjectcustom editor

Calling OnValidate on a ScriptableObject with a list of ScriptableObjects

I have created a Container ScriptableObject which has a list of instantiated BaseNode ScriptableObjects, and a custom editor to display all their attributes in the inspector.

My Inspector looks like this:

alt text

In this example, I display an integer from my container class, as well as an integer from each of the nodes in the list.

I would like to run some code when validating my Container inspector attributes. However, unlike when I have a list of pure C# objects, when I modify a field from the BaseNode list (ex. "nodeAttribute" from Node 0), OnValidate is not called in my Container object. Instead, it is only called in my BaseNode object.

Is there a way to make it such that, when I change a field from a Node, my Container.OnValidate() is called?

Note that when I modify the "containerAttribute" field, the OnValidate is called as expected.

BaseNode.cs:

 public class BaseNode : ScriptableObject
 {
     [SerializeField] int nodeAttribute;  
     
     void OnValidate()
     {
         Debug.Log("Node On Validate");
     }
 }

Container.cs:

 public class Container : ScriptableObject
 {
     [SerializeField] int containerAttribute;
     [HideInInspector] public List<BaseNode> Nodes;
 
     private void OnEnable()
     {
         Nodes = new List<BaseNode>();
         AddNew(typeof(BaseNode));
         AddNew(typeof(BaseNode));
         AddNew(typeof(BaseNode));
     }
 
     // Instantiates a new ScriptableObject and adds it to the list 
     public void AddNew(Type assetType)
     {
         BaseNode newAsset = (BaseNode)CreateInstance(assetType);
 
         AssetDatabase.AddObjectToAsset(newAsset, this);
 
         AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(newAsset));
         AssetDatabase.SaveAssets();
         AssetDatabase.Refresh();
 
         Nodes.Add(newAsset);
     }
 
     void OnValidate()
     {
         Debug.Log("Container On Validate");
     }
 }


ContainerEditor.cs:

 public class ContainerEditor : Editor
 {
     Dictionary<ScriptableObject, Editor> editor;
     
     private void OnEnable()
     {
         editor = new Dictionary<ScriptableObject, Editor>();
     }
 
     public override void OnInspectorGUI()
     {
         //Serialize other attributes
         base.OnInspectorGUI();
 
         // Get the instance that is using the editor
         Container container = (Container)target;
 
         serializedObject.Update();
 
         // Create a sub-inspector for each Scriptable Object
         for (int i = 0; i < container.Nodes.Count; i++)
         {
             EditorGUILayout.Space();
             GUILayout.Label("Node " + i+":");
 
             ScriptableObject node = container.Nodes[i];
 
             if (!editor.ContainsKey(node))
                 editor.Add(node, Editor.CreateEditor(container.Nodes[i]));
 
             editor[node].OnInspectorGUI();
         }
 
         serializedObject.ApplyModifiedProperties();
     }
 }












inspector.png (24.1 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
1

Answer by Meishin · Aug 17, 2019 at 11:43 AM

Hi @caykroyd,

I like your coding style :D

i haven't tested it but did you try classic Events / Delegates ?

For example with delegates ;

in BaseNode.cs, define delegate

 public delegate void OnValidateEvent();
 public event OnValidateEvent onValidateEvent;

then in the OnValidate function of the BaseNode, call delegate methods

 if(onValidateEvent != null) 
    onValidateEvent.invoke();

Create and put whatever you want in a container onValidateEvent function, or event call OnValidate function directly

 private void onValidateEvent(){
    target.SendMessage("OnValidate", null, SendMessageOptions.DontRequireReceiver);}

and finally register method when creating a new node

 newAsset.onValidateEvent += this.onValidateEvent();
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

112 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

[Custom Editor] MonoBehaviour vs Scriptable Object 0 Answers

"Unbroken Reference" problem when using a custom Editor to Save/Load a ScriptableObject Asset 0 Answers

Creating a Scriptable Object Custom Editor Footer 0 Answers

ScriptableObject Custom Asset Error on Build and First Starting Unity 0 Answers

CustomEditor for an ScriptableObject asset only works after recompile. 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges