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 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 think I may have achieved this. 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 everything seems to work fine with this.


My main concern is with how I am attaching the objects together. Currently I am attaching the editor object as a sub-asset to the runtime asset, and I'm concerned with how Unity might treat this 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 this object. </summary>
 public static GraphEditor Editor(this 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}", this, 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 anything in the runtime part of the code references either UnityEditor or anything in the editor folder it won't work.

Have you figured out a solution though, because this 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.

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

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

Help with Missing Monobehaviours and Asset Serialization? 0 Answers

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

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

Unity loses association to ScriptableObject after exiting playmode 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