Draft for 3J Programmers
3Dテトリスは、テトリスに奥行きを加えたゲームです。 playerはleap motion(もしくはkey入力)でブロックを移動・回転して、 ブロックを落とします。
>> 完成予想動画
- 命名規則はunity documentationに従います
- クラス名はキャメルケース(SomeClass)
- メソッド名はキャメルケース(SomeMethod)
- 変数名は先頭が小文字のキャメルケース(someVariable)
- グローバル変数は、基本的に避けるべきです
- 処理は可能な限りモジュールで分割(もしくは階層化)します
- モジュールの最終目的は、重複処理の削除です
- 各モジュール間の結合度は低くしましょう
- ゲームの開始
- 新しいブロックの生成
- playerによるブロックの移動と回転
- ブロックの落下
- ブロックプールに格納
- 隙間なくブロックが揃った行の削除
- ブロックがプールから溢れていないか確認
- ゲームの終了
- スコアの報告
- ブロックの左右奥手前方向の移動
- ブロックを落とす
- 落下速度の変化
- ブロックの接触判定
- ブロックの回転
- 回転した際に壁に食い込む場合は、適切な位置まで移動させる
- ブロックプールを管理するクラス
- まず、積み上げる部分を実装させる
- 次に、隙間なくブロックが揃った行の削除
- 消えるアニメーション
- 消える行よりも上に積まれているブロックを一つ下に落とす
- ブロックの生成
- 決まった形のブロックをランダムに
- 落下予測位置の表示 -> 実装場所の検討
- 次のブロックの表示 -> Viewerクラスの作成 ?
- +α要素の現メイン案 -> Eco + tetrisより命名
- ブロックにゴミ袋や家具などのテクスチャを適用し、leap motionならではの動きを取り入れた要素を実装する
- 扱うgarbageは可燃・不燃・プラ・PET・缶・生ゴミなどを想定、それぞれに合ったモーションを設定しておく
- モーションはつぶす(左右から手を近づける)、シェイク(両手を上下または左右に同時に動かす)などを検討中
- これらの処理を加えた状態でのスコアの算出など要検討
- ToDo : テクスチャ作成、クラス実装、
-
BlockEntity
- # 各ブロックのデータ管理
- [member] block1, block2, …, block8
- 各ブロックの色と形を保持するprefabを用意しておく
- [func] CreateRandomBlock()
- ブロックをランダムに1つ生成する
- 生成されたオブジェクトの名前は 'block'
-
LeapHandAction
- # Leapで検出した手の情報の取得と、対応するイベントの呼び出し
- [func] ConnectWithBlock()
- 移動と回転の対象となるブロックを取得する
- [func] DisconectWithBlock()
- 移動と回転の対象となるブロックのコントロールを中止する
- [event] 手の移動 -> BlockController#MoveBlock()
- [event] 手の回転 -> BlockController#{Pitch, Yaw, Roll}Block()
- [event] 手の下方向の加速度 -> BlockController#DropBlock()
-
KeyAction (for debug)
- # Key入力の検出と、対応するイベントの呼び出し
- [func] 同上
-
BlockController
- # 落下させるブロックの制御
- # 新しく生成されたブロックのスクリプトとなる
- [member] blockNumber : int
- あらかじめ決めてあるブロックの番号(ブロックの形は8種類くらい?を想定)
- [member] x, y : int
- ブロックのx, y座標
- [func] MoveBlock(x, y)
- x, y座標にブロックを移動する
- [func] PitchBlock(direct)
- directは 1 or -1
- directの方向にblockをx軸中心で90度回転する
- 回転した際に壁に食い込む場合は、適切な位置まで移動させる
- [func] YawBlock(direct)
- directの方向にblockをy軸中心で90度回転する
- [func] RollBlock(direct)
- directの方向にblockをz軸中心で90度回転する
- [func] DropBlock()
- ブロックを落とす処理
- LeapHandAction#DisconectWithBlock()と、\
- BlockPoolController#ControlBlock()を呼び出すことで、\
- このブロックはLeapHandAction下の管理からBlockPoolController下の管理に移る
-
BlockPoolController
- # BlockPool(ブロックの溜まり場)の制御
- [member] blockPool : T型の3次元配列
- 配列の型については、int型で良いのか、enumにすべきか、より多くの情報を保持できる構造体(クラス)がいいのか要検討
- [func] ControlBlock(blockInfo)
- ブロックプール内での、ブロックの落下と当たり判定と行の削除を制御
- HitBlock()で衝突するまで落下させる
- 衝突後、MergeBlock()でプールに合成する(blockPoolに格納する)
- RemoveCompletedRow()で揃った行の削除
- FullPool()でプールからブロックが溢れているか確認
- NextPhase()で次のフェーズに遷移
- ブロックプール内での、ブロックの落下と当たり判定と行の削除を制御
- [func] HitBlock(blockInfo) -> bool
- ブロックプールの床もしくは、すでにあるブロックたちと接触した場合、trueを返す
- [func] MergeBlock(blockInfo)
- 落下ブロックを、プール内に合成する
- 落下ブロックはプールへの合成と同時に削除
- [func] RemoveCompletedRow()
- 隙間なくブロックが揃った行の削除
- 消える行よりも上に積まれているブロックを一つ下に落とす
- [func] FullPool() -> bool
- プールからブロックが溢れているか確認
- プールから溢れているならGameManager#GameOver()を呼び出す
- プールからブロックが溢れているか確認
- [func] NextPhase()
- BlockEntity#RandomBlock()で新しいブロックを決めて、生成する
- LeapHandAction#ConnectWithBlock()を呼び出すことで、leap motionとblockを接続させて、\
- 新しいブロックをLeapHandAction下の管理に移す
-
GameManager
- # ゲーム全体の管理
- [member] handedness : right or left
- playerの利き手の情報
- [member] gameScore : int
- ゲームスコア
- [member] elapsedTime : int
- ゲームの経過時間
- [func] GameStart()
- ゲーム開始に伴う初期化
- [func] GameOver()
- 正常ではないゲーム終了に伴う処理
- ブロックプールがあふれた場合ゲームオーバー、判定のタイミングについて要検討
- 正常ではないゲーム終了に伴う処理
- [func] GameFinish()
- 時間によるゲーム終了に伴う処理
ドキュメントについて、気になる点があればコメントしてください。