Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

javascriptからC#のスクリプトを呼ぶ

まず、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))

しかし、これは対処療法的な結果。本当にこうしなければならないのか、もう少し調査が必要。特に型宣言できないとパフォーマンス的にもよくなさそう。もうちょっときれいな書き方はないのだろうか。