Unity5.0.0f4 Personal(2015年6月)
前回の続きです〜
今回はプレイヤーが移動したり、内壁を壊したり、アイテムを取り回復したりといった処理を作成していきます〜
第6回目で作った抽象クラスは、ようやくここで使われることになります〜
【目標】プレイヤー用のスクリプトを完成させる
2D Roguelike 9 of 14 : Player Script - YouTube
①GameManagerスクリプトに追記
この記事で作成したGameManagerスクリプトに追記していきます〜以下ソースです〜
まずはプレイヤーの体力であるplayerFoodPointsを100で作成しています〜
シングルトンであるGameManagerに体力を作成することにより、次のレベルに移る時にSceneの読み込みをして前Sceneの情報を破棄したとしても、体力情報を保持し続けておけます〜
次にプレイヤーの順番か敵の順番かを表すplayersTurn変数をbool型で作成します〜[HideInInspector]と書いておくことにより、他クラスから使用することはできるけど、Inspector上からは編集できないようにしています〜
最後にGameOverメソッドを作成しています〜enabledをfalseにすることで、ゲーム上からGameManagerを消しています〜
②Playerスクリプト作成
続いてPlayerにつける、Playerスクリプトを作成します〜
Playerスクリプトで実現させていることは、プレイヤーの移動・内壁への攻撃・敵からの攻撃・Food回復・Soda回復・Exitで次のシーンへ移動・ゲームオーバー判定とあります〜以下ソースです〜
MovingObjectクラスを継承しているため、baseを使うことでMovingObjectクラスのメンバー変数やメソッドをPlayerクラス内で使うことができます〜詳しくは以下エッセンスをご参照下さい〜
Startメソッド
Startメソッドではまず、PlayerChopとPlayerHitアニメーションを使う時のためにAnimatorコンポーネントのキャッシュを行い、いつでも使えるようにしています〜
次に、GameManagerスクリプトからplayerFoodPointsを読み込み、プレイヤーの体力を取得しています〜
最後にMovingObjectクラスのStartメソッドを読んでいます〜baseの使い方については以下エッセンスをご参照下さい〜
Updateメソッド
Updateメソッドはプレイヤーの移動を書いているため、playerの順番で無い場合はUpdateメソッドを終了させる処理を先頭に入れています〜
続いてGetAxisRawメソッドを使い、キーボードの右ボタンを押した時にhorizontal=1、左ボタン押下でhorizontal=-1、上ボタン押下でvertical=1、下ボタン押下でvertical=-1という値を取得しています〜
GetAxisRawメソッドは1か0とハッキリしていますが、GetAxisというメソッドもあり、こちらは0から1へ向けて少しずつ数値が加算されていきます〜ちょっとずつ加速していく動きを表現したい時は、GetAxisメソッドを使うといいでしょう〜余談でした!
次にhorizontalに何か数値が入っている時、verticalは必ず0になるようにしています〜これは上下のボタンと左右のボタンを同時に押した時、斜めに移動してしまうのを防ぎます〜
最後に上下左右どこかのボタンが押された時、AtemptMoveメソッドの呼び出しをしています〜
<Wall>はジェネリック機能の型引数で、WallスクリプトのWallクラスを指定しています〜詳しくは以下エッセンスをご参照下さい〜
型引数としてWallクラスを指定し、引数としてhorizontalとvertical、つまり移動方向を渡しています〜それではAttemptMoveメソッドを見ていきましょう〜
AttemptMoveメソッド
AttemptMoveメソッドにはoverride修飾子がついているので、継承機能を使うことができます〜
まずは移動した時にfoodをマイナス1しています〜「変数--」と書くことで、1マイナスすることを意味します〜
続いてbaseを使ってMovingObjectのAttemptMoveメソッドを呼び出しています〜型引数はWall、引数はUpdateメソッドで指定したhorizontalとverticalです〜
継承先のAttemptMoveメソッドからMoveメソッド、SmoothMovementメソッドと進みプレイヤーの移動を実現させていきます〜詳しくは第6回目の記事に詳しく書いてありますので、ご参照下さい〜
内壁(Wall)にぶつかった時は継承先のAttemptMoveメソッドからOnCantMoveメソッドを呼び出し、Wallを攻撃します〜(後述)
次にCheckIFGameOverメソッドを実行し、ゲームオーバー判定を行います〜
最後にplayersTurnをfalseにすることで、敵側に順番を譲っています〜
OnCantMoveメソッド
OnCantMoveメソッドは抽象メソッド(abstract)であり、継承先であるこのPlayerクラスで必ず記述しなくてはなりません〜
ジェネリックの型引数には、Wall型を先ほど指定しました〜移動先にWallがあった場合にこのOnCantMoveが実行されます〜
まずは最初の行で、WallスクリプトのWallクラスをhitWall変数に指定しています〜
次にhitWall.DamageWallと記述し、WallクラスのDamageWallメソッドを実行しています〜これによりWallスクリプトのhpを減らすことができます〜
最後にAnimatorにて作成したTrigger型のplayerChopをtrueにし、Chopアニメーションを実行しています〜
以上で、プレイヤーの移動についてはひと通り確認できました〜あっちにいったりこっちにいったりでした、お疲れ様でした〜
OnTriggerEnter2Dメソッド
IsTriggerがtrueである「Exit」「Food」「Soda」に触れた時のイベントを設定しています〜
タグがExitだった場合、Restartメソッドを実行しています〜
Invokeメソッドは、第2引数で指定した秒数だけメソッドを実行するタイミングを遅らせます〜今回でいうと1秒遅らせます〜
タグがFood、Sodaだった場合、体力を回復させ、その後各アイテムを無効にして非表示にしています〜
Restartメソッド
Exitまで到達した時に、1秒遅れて実行されるメソッドです〜
mainシーンを再度読み込むことにより、シングルトンであるGameManagerで保持しているプレイヤーの体力とレベル以外を初期状態に戻し、次のステージへ進みます〜
OnDisableメソッド
Restartメソッドを実行した時にこのPlayerスクリプトも一旦無効(Disable)状態になりますが、その時直前に呼び出されるのがこのOnDisableメソッドです〜
プレイヤーの体力をシングルトンであるGameManagerへ保存しています〜
LoseFoodメソッド
LoseFoodメソッドは、敵キャラに攻撃された時に呼び出されます〜
まずはプレイヤーAnimatorで作成したTrigger型のplayerHitをtrueにし、アニメーションさせています〜
次に引数loss分だけ体力を減らし、最後にCheckIfGameOverメソッドを呼び出し、ゲームオーバー判定を行っています〜
CheckIfGameOverメソッド
UpdateメソッドかLoseFoodメソッドにて体力が尽きた時に呼び出されます〜
プレイヤーの体力が0以下になった時、シングルトンであるGameManagerのGameOverメソッドを実行し、ゲームオーバーとなります〜
継承とジェネリック機能が難しく、理解するのにかなり時間がかかってしまいました〜
今回学んだことは今後も活用していきたいと思います〜
それでは、今回はここまでです〜
ありがとうございました〜
【Unity開発7】Unity公式チュートリアル2Dローグライクの導入【2Dローグライク1】
【Unity開発7】アニメーションを作りたい!【2Dローグライク2】
【Unity開発7】Floorやアイテムを作成したい!【2Dローグライク3】
【Unity開発7】床や敵キャラ、アイテム等を自動生成させたい!【2Dローグライク4】
【Unity開発7】BoardManagerを呼び出すGameManagerを作成する【2Dローグライク5】
【Unity開発7】キャラクターを動かすための抽象クラス作成【2Dローグライク6】
【Unity開発7】破壊可能な壁(Wall)を作成したい!【ローグライク7】
【Unity開発7】プレイヤーのアニメーターを設定したい!【ローグライク8】
【Unity開発7】プレイヤー用のスクリプトを設定したい!【ローグライク9】
【Unity開発7】敵キャラクターのスクリプトを作成したい!【2Dローグライク10】
【Unity開発7】敵キャラクターのアニメーターを設定したい!【2Dローグライク11】
【Unity開発7】uGUIでUIの表示とレベル機能を実装したい!【2Dローグライク12】
【Unity開発7】BGMと効果音を付ける【2Dローグライク13】
【Unity開発7】タッチパネルに対応させたい!【2Dローグライク14(Fin)】