Unityに関連する記事です

 3Dアクションゲームの設計をします。

まずは、やりたいことを箇条書きにしてみます。


・モチーフは無双系のアクションゲーム。たくさん出てくる敵をどんどん蹴散らす、スピード感と爽快感があるゲームにする。

・Wave式のステージクリア型にする。
・Waveごとに敵が生成されるので、それをノルマ数だけ倒すことでWaveクリアとする。
・トータルのWave数と、各Waveごとのノルマ数は設定可能なようにする。
・指定したトータルWave数をクリアできればゲームクリアとなる。
・Waveには制限時間があり、その時間内にノルマ数の敵を倒せなければゲームオーバー。
・ここまでのWave関連の管理用にクラスを1つ用意する(WaveManagerクラス)

・PlayerのキャラクターにはUnityちゃん(無料のアセット)を使用する。
・武器を持たせたいので、こちらも無料のアセットから用意する。
・Playerの行動は、攻撃用のボタンによる攻撃とジャンプボタンによるジャンプを入れる。
・上下キーで画面の奥と手前に移動。左右キーで左右に移動する。(左右で回転ではない)
・攻撃ボタンを連続でタイミングよく押したときに、連続攻撃がつながるようにする。
・Playerの設定項目は、最大HP、攻撃力、移動速度、ジャンプ力を設ける。
・Playerは、敵の攻撃を受けるとノックバック(のけぞり)して、敵の持つ攻撃力の分だけHPが減少する。
・PlayerのHPが0になったらゲームオーバー。コンティニューはなし。
・ここまでのPlayer関連をまとめて管理するためのクラスを用意する(PlayerControllerクラスとする)

・ゲーム画面を映すためのカメラは、Playerの後方上部より、画面前方を常に映すようにする。
・Playerの移動に合わせて等間隔の距離を取りながらカメラを追従するようにする。
・ここまでのCamera関連の制御を管理するクラスを用意する(CameraControllerクラスとする)

・敵のモデルには無料アセットを利用する。攻撃などの行動を行わせたいのでRigタイプはHumanoidのものを利用する。
・敵は時間が経過するごとに、数か所ある生成位置の内の1つに1〜3体ずつ生成される。
・敵の設定項目は、HP、攻撃力、移動速度を設ける。
・この数値には最小値と最大値を設定でき、1体ずつ、その範囲内でランダムな値を取得する。
・敵にはHPがあり、Playerが攻撃することで減少させることができ、0になると倒せる。
・敵を倒した場合、ランダムにPlayerのHPを回復するアイテムを生成する。
・ここまでの敵関連をまとめて管理するためのクラスを用意する(EnemyControlerクラスとする)

・Playerの武器を切り替えられるようにする。
 Playerにレベルや敵の討伐数などの目的要素を設けて、その目的要素に応じて武器が追加されて、切り替えが可能になる。
 ∈能蕕ら切り替えが可能。
・Playerの武器を管理するためのクラスを用意する(WeaponControllerクラスとする)


それでは、これを元にゲームの仕様を考えていきましょう。

プレイヤーを移動させる、とは?

 ユーザー的な観点、ゲーム的な観点で行くと、プレイヤーを移動させるというのは、コントローラーを通じて
自分の分身であるキャラクターを操作して、ゲーム内の空間を移動するということになると思います。

 ですが、プログラムはそうではありませんね。先ほどのプレイヤーを移動させるという内容を
一連の処理として「日本語」から「プログラム」への変換をしてあげないと、処理として成立しません。

 それでは、プログラム的な観点、Unity的な観点としてプレイヤーを移動させるということを考えてみましょう。
これはつまり、「プレイヤーという役割を持つゲームオブジェクトを、今いる地点から別の地点へと移動させる」処理を行う、ということになります。

 さらに具体的に言えば、ゲームオブジェクトにはプレイヤーとしてふるまうため、必要なコンポーネントをアタッチする、ということですし
スクリプトを作成して、プログラムを通じてゲームオブジェクトを移動させる、という処理が = プレイヤーを移動させる、というゲーム内での挙動になります。

プログラムの設計図を広げてみよう

 すでにここまでいくつかのサンプルアプリを作成していく中で、プレイヤーの役割を持つゲームオブジェクトを移動させるという処理を持つアプリがあったと思います。
それらを参考にしながら、どうすればゲームオブジェクトを移動させることができるか、実装を考えてみましょう。

 ただし、ここで設計図をさらに広い視点で見ておく必要があります。
何故ならば、プログラム(Unity)には、ゲームオブジェクトを移動させる手段が何種類か存在しています。
それらの中には、今回のプレイヤーを移動させるという処理には合わない方法もあります。
 そのためには、ユーザーがどのような挙動であればプレイヤーを移動させるという認識を持ってゲームを遊ぶかを考えないとなりません。

 多くのユーザーがプレイヤーを移動させるという挙動に期待するのは、コントローラー(キーボード)を入力した際に
入力した分の時間だけ、その方向に、なめらかに移動を行う、ということになるでしょう。
 つまり、キー入力と同時に移動はするものの、とんでもないスピードで動いてしまったり、あるいは壁などをすり抜けて一瞬で移動してしまったり
そういった挙動は期待している挙動とは言えないものになります。(もちろん、すべてのゲームがそうである訳ではありませんが、本ゲームではそのようなふるまいを期待しています。)

 結論とすると、ゲームオブジェクトが移動すればどんな処理でもよい、ということにはならないということですね。
こうやって動いてほしいというイメージを持ちながら、そのためにはどのようなプログラムにすればよいのかも一緒に考えていく必要があるということです。

プロトタイプを作成してみよう

 いきなりプレイヤー役の素材を使って動かしてもよいのですが、それよりもまずはプロトタイプ(試作)をしてみる所から始めましょう。

 まずは新規の3Dプロジェクトを作成します。そしてヒエラルキー上で右クリックしてメニューを出し、3D object => Cube を作成します。
これが今後、プレイヤーとしての役割を持つゲームオブジェクトだと考えてください。(名前もPlayerに変更しておいて構いません)

問題


 Playerとしての役割を考えたとき、この出来たばかりのゲームオブジェクトではコンポーネントがいくつか足りていません。
  先ほどの移動させる方法をよく考えた上で、Playerに必要なコンポーネントをアタッチしてください。(自作スクリプトも含みます)

 ∈までのアプリ、あるいはGoogleなどの検索を用いてもよいので、このPlayerを適切だと思われる移動のプログラムで移動をさせてみてください。
  キー入力はキーボードの上下左右に反応し、上下の場合にはZ軸、左右の場合にはX軸による移動を行えるようにしてください。
  なにを参考にして頂いても構いませんが、かならず、自分でスクリプトを書いてください。コピペは学習になりません。

 書いたスクリプトには、コメントをつけてください。きちんとプログラムの内容が理解できていないと書くのは難しいため
  自分で自分のプログラムにコメントが書けるということは、処理の内容を把握しているということになりますね。

 い修里曚、プレイヤーの移動のために必要であれば、適宜、必要なゲームオブジェクトを作成してください。
  (例えば、プレイヤーが移動するために地面の役割を持つゲームオブジェクトが必要であれば、それを作成してください)
 

回答補足

 .廛譽ぅ筺爾魄榮阿気擦襯好リプトが完成したら、それをSlackに貼り付けてください(スニペットで大丈夫です)

 △泙Playerとなったゲームオブジェクトのインスペクターのスクショも一緒に貼り付けてください。

 もしもプレイヤーの移動のプログラムが難しい、わからない、という場合であっても、必ず、それまでに試してみたスクリプトをSlackに貼り付けてください。
  学習において過程はとても大切です。

次回の課題

 無事にプレイヤーの移動が実装できたとき、このままではゲームとして成立しないであろう、いくつかの足りない要素があります。
 それを次回の課題にしますので、そちらも考えてみてください。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます