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 $$anonymous$$ · Dec 16, 2017 at 06:19 AM · c#jsontextassetimporter

How to create a TextAsset in a ScriptedImporter?

I'm trying to write a ScriptedImporter (the new experimental feature) that can import a third party data format into JSON. I've got all my conversion code done and working great.

But when it's time to implement the OnImportAsset() I'm stuck as to what I should provide to the ctx.SetMainAsset(). It's expecting a UnityEngine.Object so I can't just give it the string containing the JSON. So my assumption is that I should pass in a TextAsset, but its text field is read only and I have not found a way to instantiate a dynamic TextAsset by passing a string.

Should I use another asset type instead?

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

2 Replies

· Add your reply
  • Sort: 
avatar image
1
Best Answer

Answer by Bunny83 · Dec 16, 2017 at 12:59 PM

Unfortunately you can't create "TextAsset" instances manually. So if you want to just store the information as a string / text you would need to wrap it in a simple ScriptableObject

 public MyImportedType : ScriptableObject
 {
     public string text;
 }

 MyImportedType inst = ScriptableObject.CreateInstance<MyImportedType>();
 inst.text = yourJSONText;
 // pass "inst" as asset.

I'm just wondering what type data format you're reading in. Storing the result as JSON seems a bit strange to me as JSON is also just an intermediate format. For example when importing a model you should create a Mesh right away. If you import a graphic format you should create a Texture asset.


It seems you want to use the "ScriptedImporter" not as an importer but rather a simple file converter. Just converting a file may be done outside Unity and just import the converted result.


Of course you could simply create a new text file next to the original source file and write your content to that file. This will of course create an actual TextAsset but it's of course seperate from the source file.

Comment
Add comment · Show 1 · 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
avatar image $$anonymous$$ · Dec 17, 2017 at 01:57 AM 0
Share

Well that didn't work out. Whereas I can successfully provide any other kind of assets to Set$$anonymous$$ainAsset(), trying to pass in a (valid) ScriptableObject will blow up everything (even a simple one with a single public string in it). It will silently import the resource, but if you click on it, the Editor start spam$$anonymous$$g errors indefinitely: AssetImporterEditor: assetEditor has null targets! UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) NullReferenceException: Object reference not set to an instance of an object UnityEditor.Editor.OnHeaderIconGUI (Rect iconRect) (at /Users/builduser/buildslave/unity/build/Editor/$$anonymous$$ono/Inspector/Editor.cs:456) etc etc. Oh well, it IS an experimental feature after all :-/

avatar image
0

Answer by $$anonymous$$ · Dec 17, 2017 at 12:49 AM

Thank you for your answer! Digging more last night I pretty much came to the same conclusion, which is fine really, and your answer helped me confirm this.

In fact that made me realize I may want to generate a ScriptedObject that is the final data object I'll use in game. My source data can target different data structures, I've had the idea to use a convention in the filename that will dictate which data class to deserialize to.

Using your MyImportedType example, I could name my data file:

hardLevels.MyImportedType.xlsx

which would look for the middle part (MyImportedType) and through reflection I'd instantiate the proper ScriptedObject class to deserialize and save my main asset with.

Anyway, I'm getting off topic, thanks again for your answer!

Comment
Add comment · Show 3 · 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
avatar image Bunny83 · Dec 17, 2017 at 03:16 AM 0
Share

You can't create scriptableobjects with reflection. ScriptableObjects need to be created with ScriptableObect.CreateInstance. There's a generic version (which i used in my example) but also a version that take a System.Type. If you don't create the scriptable object instance with CreateInstance but with "new" or the .NET Activator class, the class instance will become a fake-null instance.

avatar image $$anonymous$$ Bunny83 · Dec 17, 2017 at 04:31 AM 0
Share

Yeah I remembered that, which mean I would probably have to setup a factory ins$$anonymous$$d. But turns out it's a moot point, at least for the time being, as ScriptedImporter will crash when provided a ScriptableObject (and yes, properly instantiated through ScriptableObect.CreateInstance). Someone filled a bug report about this back in November and I voted for it, but I have no idea if that's going to get fixed anytime soon. The joys of playing with experimental features ;-)

avatar image $$anonymous$$ Bunny83 · Dec 17, 2017 at 04:37 AM 0
Share

Just in case someone else is having the same issue as I do, I've downgraded my Unity to 2017.1.2p4 and it's working great. Looks like Unity broke the ScriptableObject support to ScriptedImporters starting from 2017.2.X and upward. Hopefully someone at Unity notice it soon!

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

421 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 avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image 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

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

Write data to Json database using SimpleJson.cs 1 Answer

Handling inheritance with JSONUtility.ToJSON 1 Answer

Assign public variables in design time... through code! 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