Unity 3d C#和Javascript腳本互相調用 解決方案javascript
1.背景知識java
腳本的編譯過程分四步:編輯器
1. 編譯全部 」Standard Assets」, 「Pro Standard Assets」 or 「Plugins」 目錄下的代碼this
2. 編譯全部「Standard Assets/Editor」, 「Pro Standard Assets/Editor」 or 「Plugins/Editor」 目錄下的代碼spa
3. 編譯除了上面列出來的目錄和Editor目錄以外的全部代碼.net
4. 編譯Editor目錄下的代碼3d
這樣的話,若是你但願某個Javascript能被其餘腳本引用,那麼把它放到第一組的某個目錄裏,而後把要使用它的代碼放在第三組的某個目錄裏就行了。blog
一樣,若是但願某個C#代碼能被其餘Javascript腳本引用,也必須把這個C#腳本放到第一組的某個目錄裏,Javascript代碼放到第三組的某個目錄裏。ip
須要注意的是,代碼一旦放在第一組目錄中,它們必定是最早被編譯的,因此它們將不可能直接引用其餘組的腳本,可是能夠經過SendMessage方式間接引用,可能會有一些效率方面的損失。這也形成了一個結果,兩個非同種語言編寫的腳本之間不能互相引用,不然沒法區分出應該讓哪一個腳本優先編譯。get
另一點是,第一組目錄中的腳本一旦從新編譯,會使得第三組目錄中的全部代碼也從新編譯,這將會增長總的編譯時間。因此,對於可能會常常變更的代碼,儘可能不要放到第一組目錄中去,除非它們由於被其餘腳本引用的緣由不得不放到這裏。
編輯器(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