- Home /
Unity compilation order
Hello, I am working on a C# project which needs to utilize a js library. However that js library its self utilizes..... C# libraries!
To get this to work properly, I will obviously need to set up a build order like this:
Step 1: Build C# libraries that the js library uses Step 2: Build the JS library Step 3: Build my own code
I read that one can use the Standard Assets folder to control the order of compilation... So I set up a little mockup of my problem...
First, I created a project with two script files:
One.cs:
using UnityEngine;
using System.Collections;
public class One : MonoBehaviour
{
void Start ()
{
Debug.Log(Two.myFunc());
}
}
Two.js:
#pragma strict
public static function myFunc()
{
return "Twrooooooo!";
}
Finally, my hierarchy was setup as so:
Test.scene
One.cs
Standard Assets
-Two.js
This worked great! Perfectly!
However, my mockup was not complete, so I extended it, changing two.js to:
#pragma strict
public static function myFunc()
{
return "Twrooooooo!" + Three.myFunc();
}
And adding a third file, Three.cs:
using UnityEngine;
using System.Collections;
public class Three : MonoBehaviour
{
public static string myFunc ()
{
return " and Thwreeeeeeeeeee!";
}
}
I then made the heirarchy look more like this:
Scene.scene
One.cs
Standard Assets
-Standard Assets
--Three.cs
-Two.js
And now, I am getting the error:
Assets/Standard Assets/Two.js(4,32): BCE0005: Unknown identifier: 'Three'.
So it appears that I cannot have multiple layers of standard assets folders for maximal control of build order!
This leaves me wondering, how CAN I control my build order to achieve a three stage building of my assets? Is this possible? I do not have Unity Pro.
Answer by Eric5h5 · Sep 15, 2012 at 11:17 PM
That can't work, sorry. You should convert the JS library to C#.
Hello, eric5h5! That is sad to hear :( Do you know of another way to control compilation order? I would love to convert the library to c#, however its creator has specifically asked me not to, so, I would very much like to find a workaround other than converting the lower-level c# libraries to js.
There is no way to control compilation order other than the folder system. There really isn't any work-around. It's fine to mix languages if you have, for example, library code in C# and the rest in JS, but you simply can't mix them if you have scripts in the same "level" and want them to reference each other. And there are only two "levels": Standard Assets/Plugins, and everything else. (Strictly speaking there's also the Editor "level", but that obviously won't work for code that needs to be in a build.)
Darn! :( I would love to see some sort of compilation order feature in newer versions of Unity... Perhaps something like a script directive! Any chances of that happening sometime in the future?
Just wanted your opinion on the likelihood of an idea like this -- Has someone already suggested it, etc. Thank you for your answers and replies!
Answer by Bunny83 · Jul 23, 2013 at 11:49 PM
Just found this question and just want to add:
If the "innermost" C# library doesn't have dependencies on stuff in the outermost library (which would create a circular dependency) you could compile the inner C# library yourself, either in MonoDevelop of in Visual Studio and place the dll along with the JS library files. That way both, the JS stuff and the precompiled C# library, are part of the first pass group and can by used by the UnityScript stuff.