• 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 Yooya · Jan 04, 2019 at 04:15 AM · scripting problemeditorserializationassetdatabase

Seperating editor and runtime data with ScriptableObjects

My goal is to have a very strong separation between my editor and runtime code, and I t$$anonymous$$nk I may have ac$$anonymous$$eved t$$anonymous$$s. In my current implementation I am using two ScriptableObjects, one that is in the assets folder, and the other in the editor folder. The object in the asset folder holds the processed data, and the editor folder object handles serializing all the unprocessed data. For the most part everyt$$anonymous$$ng seems to work fine with t$$anonymous$$s.


My main concern is with how I am attac$$anonymous$$ng the objects together. Currently I am attac$$anonymous$$ng the editor object as a sub-asset to the runtime asset, and I'm concerned with how Unity might treat t$$anonymous$$s in a build. Will the sub-asset cause an error, because the script couldn't be found? Am I fine if I just don't access it? Or maybe due to it being a sub-asset I'm not maintaining separation? I really would just like to know if my solution is a reasonable one, and if it isn't - is there a better one?


 /// <summary> Returns the editor assigned to t$$anonymous$$s object. </summary>
 public static GraphEditor Editor(t$$anonymous$$s IGraphObject value)
 {
     GraphEditor graphEditor = null;
 
     if ( value is ScriptableObject graphObject )
     {
         var path = AssetDatabase.GetAssetPath(graphObject);
         var assets = AssetDatabase.LoadAllAssetsAtPath(path);
 
         // find existing editor
         foreach (var asset in assets)
         {
             if ( asset is GraphEditor editor )
             {
                 graphEditor = editor;
             }
         }
 
         // not found
         if ( graphEditor == null )
         {
             // create new editor
             graphEditor = ScriptableObject.CreateInstance<GraphEditor>();
             graphEditor.GraphObject = value;
 
             // save to asset
             AssetDatabase.AddObjectToAsset(graphEditor, path);
             AssetDatabase.SaveAssets();
         }
     }
     else if ( value != null )
     {
         // invalid object
         Debug.LogWarningFormat( "{0} must be of type {1}", value, typeof(ScriptableObject) );
     }
 
     return graphEditor;
 }

 /// <summary> In editor representation of a graph that manages the elements and serialization. </summary>
 public class GraphEditor : ScriptableObject
 {
     [SerializeField]
     private ScriptableObject graphObject;
 
     /// <summary> Reference to the casted serializable graph. </summary> 
     public IGraphObject GraphObject
     {
         get { return graphObject as IGraphObject; }
         set
         {
             if ( graphObject == null )
             {
                 graphObject = value as ScriptableObject;
             }
             else
             {
                 Debug.LogWarningFormat("{0} is already assigned to {1}", t$$anonymous$$s, graphObject);
             }
         }
     }
 }

 [CreateAssetMenu]
 public class GraphObject : ScriptableObject, IGraphObject
 {
 
 }
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
0

Answer by tnyLe · Sep 24, 2019 at 07:00 AM

It's hard to tell but if anyt$$anonymous$$ng in the runtime part of the code references either UnityEditor or anyt$$anonymous$$ng in the editor folder it won't work.

Have you figured out a solution though, because t$$anonymous$$s is tripping me up.

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.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

200 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 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

How does the Unity Editor actually add variables to public/protected fields when you drag objects onto the field? 1 Answer

Asset variables needs [SerializeField] to be saved when reopening Unity. 1 Answer

How can I overwrite .asset using AssetDatabase.CreateAsset? 2 Answers

Help with Missing Monobehaviours and Asset Serialization? 0 Answers

Custom Editor for Map/Dictionary in Unity 0 Answers


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