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
1
Question by techmage · Jul 06, 2017 at 03:33 AM · editoreditor-scriptingreflection

How to switch script in editor via code?

You can switch the Unity inspector to debug mode and then drag new scripts into the 'Script' slot on any of your components. Your component will then use this new script and also retain all the Serialized values that were on it before.

I want to do this same thing, except via code. I want to switch all the components on a prefab to using a different script, but have those components retained their serialized data.

I was trying to dig through the API with reflection. Unfortunately this m_Script field is not in the MonoBehaviour. Looking through unity decompiled it looks like it is stored in a SelectableEditor class?

This is starting to look like a struggle so I was curious has anyone dug into trying to do this before? Would you mind sharing any insights?

Comment
Add comment · Show 1
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 toddisarockstar · Jul 06, 2017 at 03:58 AM 0
Share

adding scripts is easy as: gameObject.AddComponent("name of script"); it doesnt even need to be in a scene as long as it's in your asset folder. to remove one you would say: Destroy(this);

if you really wanted to move a script to another object without changing current variables I would personally attach it to a child object and have the script address the parent. then all you would do is switch the parenting. I cant think of a practicle reason why you would want to do that though.

1 Reply

· Add your reply
  • Sort: 
avatar image
3

Answer by Bunny83 · Jul 06, 2017 at 03:55 AM

The actual class of a MonoBehaviour is just stored in the serialized data (basically on the native C++ side of Unity). The only way to change it is through the serialization system. That means through SerializedObject and SerializedProperty.

     MonoBehaviour yourScriptInstance;
     MonoScript yourReplacementScript;

     SerializedObject so = new SerializedObject(yourScriptInstance);
     SerializedProperty scriptProperty = so.FindProperty("m_Script");
     so.Update();
     scriptProperty.objectReferenceValue = yourReplacementScript;
     so.ApplyModifiedProperties();

To get the replacement MonoScript reference you can use an editor script and an ObjectField where you could assign the script you want to replace. Alternatively you can use MonoScript.FromMonoBehaviour();. Unfortunately you need an instance of that script in order to use that method. There is no version that directly takes a type reference. So you could do:

     var tmpGO = new GameObject("tempOBJ");
     var inst = tmpGO.AddComponent<YourReplacementScript>();
     MonoScript yourReplacementScript = MonoScript.FromMonoBehaviour(inst);
     DestroyImmediate(tmpGO);

ps: you may need to mark the object as dirty in order to actually apply the change. Editing objects outside of the context of the inspector sometimes behaves a bit strange.

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

92 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

Related Questions

How to have two inspectors of different types thats objects they are inspecting change 0 Answers

Instance gotten with reflection is throwing a null reference when trying to access its fields with reflection. 1 Answer

How to tell if an animation clip is playing in the editor(NOT in playmode) with an editor script 1 Answer

reflection propertyinfo.getvalue compiles fine but gives erros in editor 1 Answer

Is there a tool to create managed dll wrapper? 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