天天看點

Unity 3d C#和Javascript腳本互相調用 解決方案(非原創、整理資料,并經過實踐得來)

 Unity 3d C#和Javascript腳本互相調用 解決方案

1.背景知識

腳本的編譯過程分四步:

1. 編譯所有 ”Standard Assets”, “Pro Standard Assets” or “Plugins” 目錄下的代碼

2. 編譯所有“Standard Assets/Editor”, “Pro Standard Assets/Editor” or “Plugins/Editor” 目錄下的代碼

3. 編譯除了上面列出來的目錄和Editor目錄之外的所有代碼

4. 編譯Editor目錄下的代碼

這樣的話,如果你希望某個Javascript能被其他腳本引用,那麼把它放到第一組的某個目錄裡,然後把要使用它的代碼放在第三組的某個目錄裡就好了。

同樣,如果希望某個C#代碼能被其他Javascript腳本引用,也必須把這個C#腳本放到第一組的某個目錄裡,Javascript代碼放到第三組的某個目錄裡。

需要注意的是,代碼一旦放在第一組目錄中,它們一定是最先被編譯的,是以它們将不可能直接引用其他組的腳本,但是可以通過SendMessage方式間接引用,可能會有一些效率方面的損失。這也造成了一個結果,兩個非同種語言編寫的腳本之間不能互相引用,否則無法區分出應該讓哪個腳本優先編譯。

另外一點是,第一組目錄中的腳本一旦重新編譯,會使得第三組目錄中的所有代碼也重新編譯,這将會增加總的編譯時間。是以,對于可能會經常變動的代碼,盡量不要放到第一組目錄中去,除非它們因為被其他腳本引用的原因不得不放到這裡。

編輯器(Editor)相關的代碼編譯順序及引用規則與此類似,隻不過目錄在第二組和第四組中定義。

2.C#調用javascript

using UnityEngine;

using System.Collections;

public class CS_test : MonoBehaviour {

void OnGUI(){

if(GUI.Button (new Rect(100,70,200,100),"c >> js")){

JS_test js = (JS_test)GameObject.Find ("Main Camera").GetComponent("JS_test");

string s = js.Call();

Debug.Log(s);

}

public string Call(){

return "from CS";

注意的問題:

此時,這個js要先被編譯,js放在Standard Assets檔案夾中先編譯後被C#調用。

3.Javascript 調用C#

using UnityEngine;  

using System.Collections;  

public class CSMain : MonoBehaviour {  

    void CSTest(string test)  

    {  

        Debug.Log("CS" + test);  

    }  

}  

JS

function OnGUI()  

{  

    if(GUI.Button( Rect(100,100,100,50),"CS"))  

       var csTest = this.GetComponent("CSMain");  

        csTest.CSTest("fff");  

function Test(test:String)  

    Debug.Log("JS " + test);  

注意:1.要将C#檔案放在Standard Assets檔案夾中先編譯後被Javascript調用。

2.将Javascript最上方的#pragma strict 删掉。否則會報錯:(方法名)  is not a member of 'UnityEngine.Component'. 詳見http://blog.csdn.net/qqmcy/article/details/9729695

參考資料:http://all-ipad.net/call-javascript-function-in-c-sharp/

http://blog.csdn.net/qqmcy/article/details/9729695

下雨了,沒傘的孩子就得拼命奔跑!

繼續閱讀