Nanashi-softプログラマ専用Unityでゲーム開発


◇Unityでゲーム開発 -JavaScript:クラスについて-

○クラスの宣言方法

まず,根本的なところで,そもそも JavaScriptではクラス宣言をしていません
.jsファイルを生成して,いきなりスクリプトを書き始めていますよね?
ここには暗黙のルールが存在します

・JavaScriptではクラス名=ファイル名が宣言されている
・JavaScriptでは MonoBehaviourクラスを継承している

『JavaScriptでは』です。C#の場合,クラス宣言が必須になっています
実はそのC#のクラス宣言を見て,JavaScriptでの宣言方法を推測しました


JavaScriptで明示的にクラス宣言をする方法は,全体を class宣言で囲みます
class 『ファイル名(拡張子.jsは省く)』 extends MonoBehaviour {
~ココにいつものスクリプト~
};

何も書いていなくても,このように宣言されているわけです
その為,他のクラスから『ファイル名.メソッド名』などでアクセス可能なのです

○クラスを継承する方法

新しいクラスを作って,それを継承したいと思います
JavaScriptは,その名称的に Java言語の仕様に沿っているところが多く,多重継承が禁止されています

class クラス名 extends MonoBehaviour, 親クラス { ←こ れはダメ
みたいな書き方はできないわけです

MonoBehaviourクラスの継承が実質必須である為,子クラスしか作れません(裏技的な事をすればできるのでしょうが)
ですから,親クラスで MonoBehaviourクラスを継承して,子クラスに継承します

class 親クラス名 extends MonoBehaviour {
}

class 子クラス名 extends 親クラス名 {
}
こういう風に書けば,子クラスで Monoクラスも使えます

○別のクラスにアクセスする方法

アクセスしたい変数やメソッドを static宣言すれば可能です
実際にスクリプト例を書いた方が早いです

・test_A.jsファイル
class test_A extends MonoBehaviour {
	static public var hensu_a : int;

	static public function mesodo() : int {
		return hensu_a;
	}
}

・test_B.jsファイル
class test_B extends MonoBehaviour {
	function Start() {
		var work : int;

		work = test_A.hensu_a;		//変数の値を取得
		test_A.hensu_a = work * 2;	//変数に値を代入

		work = test_A.mesodo();	//メソッド実行
	}
}

このようにします

○別のクラスから変数に直接アクセスを禁止する方法

変数をどこからでも自由に書き換えられるような宣言をすると,バグ発生時にとても苦労します
必ずメソッドを介して読み書きするように設計する方が好ましいです

・test_A.jsファイル
class test_A extends MonoBehaviour {
	static private var hensu_a : int;	//他のクラスから直接アクセス不可

	//変数読み込みメソッド
	static public function getMesodo() : int {
		return hensu_a;
	}

	//変数書き込みメソッド
	static public function putMesodo(work:int) {
		hensu_a = work;
	}
}

・test_B.jsファイル
class test_A extends MonoBehaviour {
	function Start() {
		var work : int;

//		work = test_A.hensu_a;		//できません(コンパイルエラー)
//		test_A.hensu_a = work * 2;	//できません(コンパイルエラー)

		work = test_A.getMesodo();	//変数読み込みメソッド呼び出し
		test_A.putMesodo(work * 2);	//変数書き込みメソッド呼び出し
	}
}

このように,private宣言を行うと,他のクラスから直接アクセスできなくなります
更に,staticも外すと,他のクラスからはアクセスできなくなります

○1ファイルに複数クラスを記述する方法

可能ですが,注意点があります

例えば,neko.jsファイルに,以下のように記述したとします
class neko extends MonoBehaviour {
	function Start(){
		Debug.Log("猫です");
	}
}
class inu extends MonoBehaviour {
	function Start(){
		Debug.Log("犬です");
	}
}

これを実行すると,「猫です」とだけ表示されます
ファイル名=クラス名以外のクラスは,システムから呼び出される事はありません

nekoクラスから,inuクラスを呼び出してやる必要があります
その為には,staticを宣言する必要もあります
class neko extends MonoBehaviour {
	function Start(){
		Debug.Log("猫です");

		inu.Start();	//inuクラスの初期化を呼び出し
	}
}
class inu extends MonoBehaviour {
	static function Start(){
		Debug.Log("犬です");
	}
}

inuクラスのStartは,通常のオーバーライド呼び出しではないので,混乱を避ける為に別の名前にした方が好ましいです
プロジェクトの実行順リストにも,inuクラスは表示されませんし

○他のファイルから,複数クラスを記述したファイルのクラスにアクセスする方法

普通に可能です
上の,inuクラスに,usagi.jsからアクセスする例を書くと
class usagi extends MonoBehaviour {
	function Start(){
		inu.Start();	//inuクラスの初期化を呼び出し
	}
}

この usagiクラスを先に実行するようにしても,何の問題も無く処理されます


TOPプログラマ専用Unityでゲーム開発