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 /
This question was closed Feb 06, 2020 at 01:59 PM by RahulRaman for the following reason:

The question is answered, right answer was accepted

avatar image
0
Question by RahulRaman · Feb 06, 2020 at 12:01 PM · c#scripting problemmonobehaviour

MonoBehaviours with same name (different namespaces) in same script

What I want

I am trying to work on different versions of same MonoBehaviour class in Unity but I want their name to be same and in the same folder.

What I do

I created the c# script say "test.cs" I defined two namespaces in them "test.A" and "test.B", and add the code of the MonoBehaviour class "test" in both namespaces, save the script and open Unity.


test.cs :

 using UnityEngine;
 
 namespace test.A
 {
     public class test: MonoBehaviour
     {
         public Type1 object1;
         // Some code
     }
 }
 
 namespace test.B
 {
     public class test: MonoBehaviour
     {
         public Type2 object1;
         // Some other similar code
     }
 }


What I expect

I expect unity to compile both the classes differently and I be able to add these classes differently in "Add Component>Scripts>" + "test.A>test" or "test.B>test"

What I get

Unity skips the namespace "test.A" and I only get to add the class in "test.B"


What I want to know

Why is this happening in Unity?

Is there a way to do this or will I have to go the other way by creating different scripts for different version of the class with different names?

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

  • Sort: 
avatar image
1
Best Answer

Answer by Bunny83 · Feb 06, 2020 at 12:53 PM

That's because the file name has to match the classname. So there can only be one class in one file. That file asset in your project is your link to the class. You can not have one asset represent two different classes at the same time. What "might" work is when you place them in two seperate files in different folders, both with the same filename.


Unity is mainly an authoring software. Unity can't compile your code "differently". All classes from one compiler group is compiled into one assembly. In general any C# compiler can only group things based on files. If you include a file when compiling an assembly all of its content will be compiled into that assembly. You can not somehow make the compiler and compile one half of a file in one assembly and the other half into another. Every "asset" in Unity has to have a direct link to an asset stored in your project . For scripts that's the script file which is represented as a MonoScript instance (only inside the editor). One MonoScript can only represent one class (No matter if it's a MonoBehaviour, ScriptableObject or Editor derived class).


Of course Unity could have introduced a new sub asset which would appear below the actual script asset in Unity like it happens with FBX files for example. However this has grown historically. In the past there was no support for namespaces at all. So it was completely impossible to have the same class more than once.


IMHO there's no real point in Unity to use the same class name twice. It just creates confusion. It also doesn't allow for easy switching. Since they are in different namespaces you have to adjust the namespace everywhere you might access your class. Just having the same name does not mean they are connected in any way.


A namespace is not meant to distinguish different class purposes, that's still the duty of the class name. A namespace just groups things into categories which somehow belong together. You might want to read through the naming guidelines for namespaces for .NET. Specifically

DO NOT give the same name to types in namespaces within a single application model.

Keep in mind that those are not rules but guidelines. Though they server a good purpose and have evolved from a lot of experience. Even Unity has "violated" some of these guidelines (the Random class for example). Though Unity is a very specialized subset of .NET development. So it's fine to have slightly different rules in that domain.

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 RahulRaman · Feb 06, 2020 at 01:53 PM 0
Share

Thanks for your answer, I got to learn much more from your answer.

avatar image RahulRaman · Feb 06, 2020 at 02:06 PM 0
Share

@Bunny83 I yet have one more question.

Why must $$anonymous$$onoBehaviours have same name as their file?

avatar image Bunny83 RahulRaman · Feb 06, 2020 at 04:04 PM 0
Share

To be honest we don't really know the exact technical reason behind this. It might be related to how things are serialized. Apart from that it's the most natural thing since, as I mentioned, the script file asset in your project is like a "handle" for the class inside the file. So when defining a a $$anonymous$$onoBehaviour named "$$anonymous$$yAwesomeClass" and that class is bound to the script file it is defined in, the most logical name choice for the file is that class name.


Another reason that just sprung into my $$anonymous$$d is that in the past we had 2 additional .NET scripting languages. One was Boo (a phyton inspired syntax) and the other was UnityScript (a Javascript inspired syntax). In UnityScript you did not need to define a class because it generally treated the file and its file name as a class. UnityScript often had a very short syntax to define basic things. UnityScript is no longer supported however if you want to know how it used to look like, this Unity wiki article covers a lot of it's syntax.


Deprecating UnityScript was one of the best changes in Unity. They now focus much more on what C# can actually do. It was a huge burden that was carried along. Though a lot of the early design choices they made are still stuck with Unity. They definitely could change this behaviour, however such changes would be breaking changes. In other words most existing projects would need to be modified.

Follow this Question

Answers Answers and Comments

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

WaitForSeconds() and WaitForSecondsRealtime() negative number concern!!!! 4 Answers

Refrencing Monobehaviour in the Editor 3 Answers

Enabling multiple Monobehaviour Components in a game object 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