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
下雨了,沒傘的孩子就得拼命奔跑!