講座みたいなもの 2回目です。
サンプルゲームを詰めていたため少し更新に間があいてしまいました 申し訳ない。今回はサンプルプロジェクトのスクリプト概要についてです。
ゲーム全体のスクリプトの概要ですが
●ゲームコントローラー
●プレイヤー
●エネミー
●バレット(弾)
●背景スクロール
●背景モデル
●GUI
●サウンドコントローラー
●カメラ
などで構成されています
http://dl.dropbox.com/u/18978109/2DSTG_prj110521.zip
プロジェクトファイルへのリンクです↑

全体の概念図
■ゲームコントローラー
全体を統括するのがゲームコントローラーでメインループだと考えればいいかと思います。
static型の変数 例えばプレイヤースコア、プレイヤーのライフ、ハイスコア などを記述してあり 『static var XXXX:型』で指定してあれば どのスクリプトからでも『gameController.XXXX = ....』という形でアクセスが可能です。
ゲーム中のイベントを記述することも簡単で、例えば『if(Time.time==120){なにか実行文}』としておけば、プレイ時間120秒の時にメッセージを出すなどのイベントを起こすことになります。
ゲームオーバー処理 や GUI表示関係も まとめてあります。
他にもカメラの移動制御に命令を出したり BGMのコントロールをしたりといった
ゲームを動かす本体となるループが入ったスクリプトです。
■プレイヤー
スクリプトはキーの操作に応じて機体を前後上下に移動する部分と アイテムを取ったときに、弾の撃ち方やオプションを不可する部分 そして敵や背景の衝突時にライフを減らす部分のスクリプトで組まれています。
■エネミー
最もUnityらしい作り方です。
エネミーコントローラー =エネミーのアニメーションと移動を制御します。
エネミーウェポン= 弾の発射方式を指定します。
ダメージスクリプト= ダメージを受けたらヒットポイントを減らすスクリプトです。
多少変化はありますが、主にエネミー関係はこれら3種類のスクリプトをインスペクタにアタッチして作成されています。
スクリプトはそれぞれ使い回しが効くように作成しているため 例えば 背景の
柱にダメージスクリプトをアタッチすれば破壊できる柱になり エネミーコントローラーをアタッチすれば移動する背景ができます。

■バレット(弾)
直進する弾が基本で、プレイヤーを追跡するスクリプトをアタッチすればホーミングミサイルが作成できたり 壁で反射したりなどといった制御が可能です。
エネミーのウェポンは発射するまでの制御で、バレットのスクリプトは弾の跳び方を制御します。
バレットのスクリプトはコリジョンの当たり判定が出たときに 当たったオブジェクトに対してダメージメッセージを送信します。applyDamage(ダメージ量)
が相手のスクリプトに記述されていれば 一定ダメージ量を相手のオブジェクトのヒットポイントから減らします。
■スクロール背景
一番奥の宇宙の背景で 3枚のポリゴンプレーン(星 隕石 宇宙空間)にテクスチャを貼りつけて それぞれスピードを変えながら ゲームカメラの進行方向とは逆の左に向かって移動させています。 テクスチャはループするように描いてあるので、ある程度左に進んだら元のスタート位置に戻っています。


■背景
背景のモデルにコリジョンが作成されていれば 衝突判定が出ます。
改めて後に解説しますが、タグ及びレイヤーで『BG』を指定してあれば背景のコリジョンに衝突があったという値が返ります。
ゲーム中では OnTriggerEnter()またはPhysics.Raycast()を用いて背景との
判定をとっています。
■カメラ
カメラは2つ以上設置してあります。一つがメインカメラでプレイに応じて右方向に自動で進みます。もう一つがスクロール背景用カメラで こちらは自由に動かすことで様々な背景を表示できます。例えばグラディウスVの立体的な背景を動かすようなことを考えています。プロバージョンの場合エフェクトをカメラ単位でかけることも可能です。 カメラの合成にはレイヤーおよびマスクを使用します。
■GUI
スコアなどの2DGUIの表示関係を制御します。現在のプロジェクトではゲームコントローラーに内包しています。
■サウンドコントローラー
BGMのボリュームコントロールやサウンドをアサインすることで音源のチェンジャーのような動作をします。
など
エネミーの制御などオブジェクトの数が多い物を同じスクリプトの使い回しが可能なように記述するのがUnityエンジンのゲームの作り方としてはスマートなようです。
■例文
すこし補足です。
エネミーの動きを制御するスクリプト(enemyController.JS)のなかで次のような
ルーチンのコールをしていますが
function Update(){
if(flag==true){
A();
}
}
function A(){
flag=false;
........
flag=true;
}
これはUpdate()文というのが止まること無くループし続けるためfunction A()の処理が終わらないうちにfunction A()が呼び出されてしまうのを避けています。
具体的にはアニメーションが終わる前に再びアニメーションが呼び出されるために
ガクガクとした動きになってしまうわけです。
同様な実行をするのに以下のような書き方もできます。
function Start(){
.
.
.
.
MainRoutine();
}
function MainRoutine(){
while(true){
yield A();
yield B();
yield C();
}
}
function A(){
yield WaitForSeconds();
}
function B(){
yield WaitForSeconds();
}
function C(){
yield WaitForSeconds();
}
こちらのほうがフラグも使わずスマートです。 ほかにもやり方がありそうなのでいろいろ考えてみてください。ちなみに下の方法だとスクリプトの先頭で
#pragma strict を指定しないとエラーが帰ってくるかもしれません。
プロジェクトの値を変更をして動作を確かめてみてください。
次回からこれらのスクリプトについて解説をしていきます
ついでにモデルとアニメーションを追加してゲームらしい体裁を整えていこうと考えています。
次回もっと早めに更新します。。。。。という予定ですw
追記:ストパンSTGのほうの更新はもちっと待ってください。 ファイルが消されるのを容量のせいだと思っていたんですが、どうやらunity3D形式のファイルのアップをFC2のホームページが認めていないみたいなんです。
だもので、ファイルを他の場所に移します。
あと当初は初心者でも簡単に動かせることを目指したので 自動照準にしたのですけど 操作性に難有りなので、マウスを使用することも考えています。 といってもイベント関連の制御なども入れ込まねばならないのでしばらく後です。 お待ちいただいてる方々申し訳ないです。
サンプルゲームを詰めていたため少し更新に間があいてしまいました 申し訳ない。今回はサンプルプロジェクトのスクリプト概要についてです。
ゲーム全体のスクリプトの概要ですが
●ゲームコントローラー
●プレイヤー
●エネミー
●バレット(弾)
●背景スクロール
●背景モデル
●GUI
●サウンドコントローラー
●カメラ
などで構成されています
http://dl.dropbox.com/u/18978109/2DSTG_prj110521.zip
プロジェクトファイルへのリンクです↑

全体の概念図
■ゲームコントローラー
全体を統括するのがゲームコントローラーでメインループだと考えればいいかと思います。
static型の変数 例えばプレイヤースコア、プレイヤーのライフ、ハイスコア などを記述してあり 『static var XXXX:型』で指定してあれば どのスクリプトからでも『gameController.XXXX = ....』という形でアクセスが可能です。
ゲーム中のイベントを記述することも簡単で、例えば『if(Time.time==120){なにか実行文}』としておけば、プレイ時間120秒の時にメッセージを出すなどのイベントを起こすことになります。
ゲームオーバー処理 や GUI表示関係も まとめてあります。
他にもカメラの移動制御に命令を出したり BGMのコントロールをしたりといった
ゲームを動かす本体となるループが入ったスクリプトです。
■プレイヤー
スクリプトはキーの操作に応じて機体を前後上下に移動する部分と アイテムを取ったときに、弾の撃ち方やオプションを不可する部分 そして敵や背景の衝突時にライフを減らす部分のスクリプトで組まれています。
■エネミー
最もUnityらしい作り方です。
エネミーコントローラー =エネミーのアニメーションと移動を制御します。
エネミーウェポン= 弾の発射方式を指定します。
ダメージスクリプト= ダメージを受けたらヒットポイントを減らすスクリプトです。
多少変化はありますが、主にエネミー関係はこれら3種類のスクリプトをインスペクタにアタッチして作成されています。
スクリプトはそれぞれ使い回しが効くように作成しているため 例えば 背景の
柱にダメージスクリプトをアタッチすれば破壊できる柱になり エネミーコントローラーをアタッチすれば移動する背景ができます。

■バレット(弾)
直進する弾が基本で、プレイヤーを追跡するスクリプトをアタッチすればホーミングミサイルが作成できたり 壁で反射したりなどといった制御が可能です。
エネミーのウェポンは発射するまでの制御で、バレットのスクリプトは弾の跳び方を制御します。
バレットのスクリプトはコリジョンの当たり判定が出たときに 当たったオブジェクトに対してダメージメッセージを送信します。applyDamage(ダメージ量)
が相手のスクリプトに記述されていれば 一定ダメージ量を相手のオブジェクトのヒットポイントから減らします。
■スクロール背景
一番奥の宇宙の背景で 3枚のポリゴンプレーン(星 隕石 宇宙空間)にテクスチャを貼りつけて それぞれスピードを変えながら ゲームカメラの進行方向とは逆の左に向かって移動させています。 テクスチャはループするように描いてあるので、ある程度左に進んだら元のスタート位置に戻っています。


■背景
背景のモデルにコリジョンが作成されていれば 衝突判定が出ます。
改めて後に解説しますが、タグ及びレイヤーで『BG』を指定してあれば背景のコリジョンに衝突があったという値が返ります。
ゲーム中では OnTriggerEnter()またはPhysics.Raycast()を用いて背景との
判定をとっています。
■カメラ
カメラは2つ以上設置してあります。一つがメインカメラでプレイに応じて右方向に自動で進みます。もう一つがスクロール背景用カメラで こちらは自由に動かすことで様々な背景を表示できます。例えばグラディウスVの立体的な背景を動かすようなことを考えています。プロバージョンの場合エフェクトをカメラ単位でかけることも可能です。 カメラの合成にはレイヤーおよびマスクを使用します。
■GUI
スコアなどの2DGUIの表示関係を制御します。現在のプロジェクトではゲームコントローラーに内包しています。
■サウンドコントローラー
BGMのボリュームコントロールやサウンドをアサインすることで音源のチェンジャーのような動作をします。
など
エネミーの制御などオブジェクトの数が多い物を同じスクリプトの使い回しが可能なように記述するのがUnityエンジンのゲームの作り方としてはスマートなようです。
■例文
すこし補足です。
エネミーの動きを制御するスクリプト(enemyController.JS)のなかで次のような
ルーチンのコールをしていますが
function Update(){
if(flag==true){
A();
}
}
function A(){
flag=false;
........
flag=true;
}
これはUpdate()文というのが止まること無くループし続けるためfunction A()の処理が終わらないうちにfunction A()が呼び出されてしまうのを避けています。
具体的にはアニメーションが終わる前に再びアニメーションが呼び出されるために
ガクガクとした動きになってしまうわけです。
同様な実行をするのに以下のような書き方もできます。
function Start(){
.
.
.
.
MainRoutine();
}
function MainRoutine(){
while(true){
yield A();
yield B();
yield C();
}
}
function A(){
yield WaitForSeconds();
}
function B(){
yield WaitForSeconds();
}
function C(){
yield WaitForSeconds();
}
こちらのほうがフラグも使わずスマートです。 ほかにもやり方がありそうなのでいろいろ考えてみてください。ちなみに下の方法だとスクリプトの先頭で
#pragma strict を指定しないとエラーが帰ってくるかもしれません。
プロジェクトの値を変更をして動作を確かめてみてください。
次回からこれらのスクリプトについて解説をしていきます
ついでにモデルとアニメーションを追加してゲームらしい体裁を整えていこうと考えています。
次回もっと早めに更新します。。。。。という予定ですw
追記:ストパンSTGのほうの更新はもちっと待ってください。 ファイルが消されるのを容量のせいだと思っていたんですが、どうやらunity3D形式のファイルのアップをFC2のホームページが認めていないみたいなんです。
だもので、ファイルを他の場所に移します。
あと当初は初心者でも簡単に動かせることを目指したので 自動照準にしたのですけど 操作性に難有りなので、マウスを使用することも考えています。 といってもイベント関連の制御なども入れ込まねばならないのでしばらく後です。 お待ちいただいてる方々申し訳ないです。