まず、javascriptからjavascriptを呼ぶ場合、ひとつのGameObjectにそれぞれのjavascriptファイルをアタッチしてやる。
たとえば、呼び出し側
#pragma strict var test:TestJS; test = GetComponent("TestJS"); function Start () { print(test.getNum()); }
呼び出される側(ファイル名"TestJS")
#pragma strict var num:int = 4; public function getNum():int{ return num; }
の2つを同一GameObjectにアタッチすれば機能する。GetComponentは関数の外、変数定義のブロックで使うことができることに注意。
さて、上の例で呼び出される側をC#の関数に変更する場合、
呼び出される側(ファイル名"TestCS")をそのままC#に書き換えて、
using UnityEngine; using System.Collections; public class TestCS : MonoBehaviour { public int num = 4; public int getNum(){ return num; } }
としても、
Assets/MyScripts/TestMain.js(2,10): BCE0018: The name 'TestCS' does not denote a valid type ('not found').
というエラーメッセージがでてうまくいかない。"TestCS"などない!と言っている。どうもjavascriptのメンバーとしてC#は直接呼び出せないようだ。
試行錯誤の末、動いたのは次のスクリプト。
//#pragma strict function Start () { var test = GetComponent("TestCS"); print(test.getNum()); } function Update () { }
ポイントは、
- #pragma strictを外す
- GetComponent("TestCS")は関数内に移動。(たとえばfunction Start())
- スクリプトをあらわす変数(test)は型宣言しない(できない)。
の3つ。
また、スクリプトのコンパイル順序にも注意する。(特別なフォルダー名 - Unityな日々(Unity Geek))
しかし、これは対処療法的な結果。本当にこうしなければならないのか、もう少し調査が必要。特に型宣言できないとパフォーマンス的にもよくなさそう。もうちょっときれいな書き方はないのだろうか。