Unityに関連する記事です

製作物の概要


 Unity の機能である「TileMap(タイルマップ)」・「NavMeshAgent(ナビメッシュエージェント)」・「Cinemachine(シネマシン)」を主に活用して、
上から見下ろし画面(トップビュー)型のリアルタイムストラテジーゲームを製作します。

 ゲームイメージとしては半熟英雄や伝説のオウガバトルのようなものになります。


Gameビュー画像




 ゲームのルールは発展編にて肉付けします。この手順では、ゲームの土台となる部分を作成します。

 ゲーム画面は、タイルマップという機能を利用して、2D用の画像を敷き詰めてゲームのフィールドとなる画面を作成します。
画面はタップのみで制御を行い、複数のタイルマップを利用することで、タップした地点にキャラの移動できる地形と移動できない地形の制御を実装します。

 時間の経過によってキャラが目標地点まで移動を行います。
ゲーム内には自軍の拠点と敵軍の拠点とがあり、自軍の拠点を防衛しつつ、敵軍の本拠地を制圧することがゲームの目的になります。

 スマホで遊ぶことを前提とし、ゲーム画面は複数のカメラを利用して制御を行います。
カメラがキャラにフォーカスしている場合にはキャラ固定になっており、自動的にカメラがキャラを追従します。カメラの自由な操作はできません。
カメラがキャラにフォーカスしていない場合にはフリーカメラとなり、画面をスワイプすることで自由に画面スクロールを行えます。。
カメラを俯瞰視点に変更することもでき、その場合にはゲーム画面がすべて見えるようにカメラが俯瞰視点になります。

 この機能には Unity の Cinemachine (シネマシン)を活用します。



 この教材ではこれらのシステム的な実装を目的としています。
そのため、完成したからといってゲームとして完全に遊べる状態になる訳ではありません

 ですが、ここでしっかりと土台を作成することができれば、あとは自分のアイディアを元にして
タワーディフェンスゲームを作っていくことが可能です。

 このゲームの素材にはぴぽや様とイラストAC様の素材を利用させていただいております。
ぴぽや様
https://pipoya.net/sozai/
イラストAC様
https://www.ac-illust.com/


<動画 .織奪廚砲茲覦榮庵賄世侶萃蠅伴動経路移動>

<動画◆^榮扱佻のグラフィカル表示>

<動画 キャラの切り替えとカメラの変更>

<動画ぁ{轤彁訶瀬メラの切り替え>

<動画ァ.侫蝓嫉訶瀬メラの切り替えと、ドラッグによるカメラの移動>

<動画Α〇間の経過によるライトの切り替え>

システムとルール


 汎用的な2Dのリアルタイムストラテジーゲームを製作するためのツール教材になっています。
そのため実装しているのはシステム面のみで、そのほかのルールはありません。

<実装するシステム>
 ・タイルマップを利用したゲーム画面製作
 ・画面の指定したタイルのタップを感知する処理と位置の判定処理
 ・味方キャラ、および敵キャラの移動経路表示の自動生成
 ・味方キャラ、および敵キャラの経路に沿った自動移動
 ・味方キャラ、および敵キャラのアニメーションの管理
 ・タップした地点を感知し、味方キャラの移動先として設定し、NavMesh と連動させる処理
 ・味方キャラの選択時にカメラのフォーカス先をアクティブであるキャラに切り替える機能
 ・俯瞰視点カメラの切り替え機能
 ・Light2D を利用した光源による時間の表現処理
 ・味方キャラ、および敵キャラのデータベースによる管理と運用
 ・ステージのデータベースによる管理と運用
 ・エフェクトや UI アニメの演出処理

 以上の部分における、ロジックの考え方や、実装の方法などを学習します。
簡単に解説しておきます。


<タイルマップを利用したゲーム画面製作>


 Unity の機能の1つであるタイルマップという機能を利用して、2D用の画像を敷き詰めてゲームのフィールドとなる画面を作成します。
複数のタイルマップをレイヤー構造にして重ねて利用することで、タップを感知してキャラの移動可能なタイルと移動できないタイルの制御を実装します。

 今回は2つのタイルマップを重ねて1つのタイルマップとしていますが、3つ以上のタイルマップに分けることも可能です。


<ベース部分(移動できるタイルマップ)>



<移動できないタイルマップ>



<2つのタイルマップを一緒に表示して合成>




<画面の指定したタイルのタップを感知する処理と位置の判定処理>


 ゲームのベースとなる部分の1つです。

 カメラやタイルマップに関連するコンポーネントが持つメソッドを利用して、画面のタップを感知し、
その位置にあるタイルマップの情報を取得する処理を実装します。タイルマップの情報を取得することにより、
この位置情報を利用してタップした地点をキャラの移動先の設定を行えるようになります。

 Unity に用意されている下記の複数のメソッドを組み合わせて、機能を作成します。

 ・Grid.WorldToCell メソッド
 ・Camera.ScreenToWorldPoint メソッド
 ・Tilemap.GetColliderType メソッド


<味方キャラ、および敵キャラの移動経路表示の自動生成>


 演出でもあり、ゲームのシステム的な部分でもある機能です。

 現在のキャラの位置を起点に、目標地点までの移動経路を画面に自動生成します。
これには LineRenderer コンポーネントを利用します。
 
 移動先がわかりやすいように青い線の画像を設定していますが、画像は任意に設定できます。


<移動経路を表示>



<味方キャラ、および敵キャラの経路に沿った自動移動>


 ゲームのベースとなる部分の1つです。

 味方キャラを選択している状態で画面をタップすることで、そのタップした位置を目標地点として移動を開始するように制御を行います。
経路に沿った移動処理は NavMesh の機能を利用して実装を行います。


<味方キャラ、および敵キャラのアニメーションの管理>


 複数のスプライト画像を利用して移動用のアニメーションを作成し、そちらを制御します。
命令自体は同じ内容ですが、各キャラごとに用意しておくことにより、そのキャラのアニメを再生するようにします。

 このような汎用的な構成で処理を構築しておくことの重要性を学習します。


<タップした地点を感知し、味方キャラの移動先として設定し、NavMesh と連動させる処理>


 ゲームのベースとなる部分の1つです。

 タップした地点がキャラの移動できる地点であった場合には、その地点を NavMesh と連動し、自動的に経路を計算して移動を行います。

 移動中であっても、新しい場所をタップすることで、現在の移動をキャンセルして、新しい目標地点へ移動を開始しまさう。


<動画 タップ地点に味方キャラを移動>
動画ファイルへのリンク


<味方キャラの選択時にカメラのフォーカス先をアクティブであるキャラに切り替える機能>


 一度に操作できる味方キャラは1体だけです。そのため、選択している味方キャラはアクティブ状態になります。
アクティブ状態のキャラがいる状態でタイルをタップすることで、そのキャラが移動を行います。

 ここではアクティブ状態の切り替え、そしてアクティブ状態のキャラにカメラのフォーカスを切り替える機能を作成します。

 アクティブ状態のキャラが移動している間に切り替わった場合でも、移動を行っているキャラは目的地点まで移動を行います。


<アクティブ状態の切り替えとカメラのフォーカスの切り替え>
動画ファイルへのリンク


<各カメラの切り替え機能>


 戦略ゲームのため、画面を広く確認する手段がないとどんな風にゲームを攻略していいか、イメージがわきにくくなります。

 味方キャラにフォーカスしているカメラの他に、俯瞰視点のカメラを用意し、切り替えボタンを押すことで
ゲーム画面全体を上から見下ろして、どういった状態であるかを確認できる機能を作成します。

<俯瞰視点カメラの切り替え機能>
動画ファイルへのリンク



 またフリー視点カメラも用意しておくことで、ドラッグによるカメラの移動を行うことでステージの確認を行うことが出来るようにします。

<フリー視点カメラの切り替え機能>
動画ファイルへのリンク


<Light2D を利用した光源による時間の表現処理>


 2Dゲームを制作する際に URP を選択しておくことで、2D用のライトを利用することが出来ます。

 この機能を利用して、ゲーム内の時間経過に合わせて昼夜の表現を演出します。


<光源による時間の表現処理>
動画ファイルへのリンク


動画ファイルへのリンク

 2Dゲームを制作する際にコアを選択している場合、途中から URP に変更することで利用できます。
(ただし、マテリアルなどの変更処理が必要になります)


<味方キャラ、および敵キャラのデータベースによる管理と運用>


 スクリプタブル・オブジェクトという Unity の持つクラスをデータベース化できる機能を利用して、各キャラのデータを事前に登録しておきます。


<キャラのデータのデータベース>




 この手法によりキャラの運用管理や保守(数字の修正)を簡便化し、複数のキャラのプレファブを用意せずにキャラを生成出来るようにします。
 
 プレイヤーには情報として所有しているキャラを設定できるようにします。所有しているキャラのみが配置の選択可能なキャラになる制御も実装します。
このような機能を実装しておくことで、ゲーム内で新しいキャラをアンロックしていくモードを実装することが可能になります。

 敵キャラについても同様にスクリプタブル・オブジェクトを作成して、敵キャラのみのデータベースを作成して管理し、運用を行います。


<敵キャラのデータのデータベース>



<ステージのデータベースによる管理と運用>


 ステージも同様です。こちらはタイルマップで作成したステージをプレファブ化して登録しておきます。
そちらに、ステージの名前や拠点、出現する敵、クリア報酬などを設定できるようにします。


<ステージのデータのデータベース>


 

<エフェクトや UI アニメの演出処理>


 DOTwenn アセットやその他のアセットを利用して、画面の演出を行います。
敵が破壊された場合には 2D 用のパーティクルを生成して、破壊されたことを伝えるようにしています。

 拠点の耐久力についてはゲージがアニメ演出しながら減少するように制御を行っています。

<動画>
動画ファイルへのリンク



 発展編ではこのシステムをベースに、どのようなゲームにするのかを考えて肉付けしていき、色々な楽しみ方を設計出来ます。
 

完成図


 今回は Main というリアルタイムストラテジーゲーム画面のシーンのみで作成しています。
Title シーンもありませんので、必要であれば、タイトルについては自分で考えて楽しいイメージの設計を行って実装をしてみてください。



 ゲームを実行すると、メインとなるリアルタイムストラテジーの画面からゲームがスタートします。
その中で実装されている各システムの確認を行っていくようになります。

 また、どのような仕様を追加していくかも一緒に検討を行うようにします。


学習内容


 2Dタイルマップのリアルタイムストラテジーゲームを製作していくことで、習得することを目標とする技術を記載しておきます。

 また、スクリプトに関しては、たくさん書いて覚える、ということを主軸として記述を行っています。
一見、合理的・機能的には見えない処理もありますが、あくまでも書いて覚えるための手順書になっています。

 そのため、学習状況によっては、もっとスマートに書けるのでは? と感じる方もいると思いますが
そうした「気づき」を感じた方は自分なりの記述方法を考えて、よりよいスクリプトを書いていく練習としてこの教材を活用してください。

 ・設計に沿った製作作業
 ・アセットストアからインポートしたアセットの利用方法について
 ・Sprite Editor機能
 ・Tile Pallete を利用した Tilemap の作成方法
 ・Sorting Layer の設定
 ・TileMap によるステージ作り、コライダーの設定方法、レイヤー分けによる重複構造
 ・Grid.WorldToCell メソッド
 ・Camera.ScreenToWorldPoint メソッド
 ・Tilemap.GetColliderType メソッド
 ・LineRenderer による経路の自動生成処理
 ・RequireComponent 属性
 ・Header 属性
 ・Summary(サマリー)機能
 ・アニメーション関連(Animatorビュー、アニメーションのステート、トランジション、パラメータ)
 ・Mathf.Approximately メソッド
 ・Animator.SetFloat メソッド
 ・NavMesh による Bake
 ・Layer Collision Matrix の設定
 ・Debug.DrawRay メソッド
 ・LayerMask.GetMask メソッド
 ・TryGetComponent メソッドと out キーワード宣言
 ・CanvasGroup コンポーネント
 ・スクリプタブル・オブジェクトの作成とデータの登録
 ・クラス内に enum を作成する(入れ子構造)
 ・[System.Serializable(シリアライザブル)]属性
 ・List の初期化
 ・シングルトンデザインパターンによるクラスの作成
 ・スクリプタブル・オブジェクトをゲーム内で利用できるようにする方法
 ・シングルトンデザインパターンによるクラスの活用
 ・スクリプタブル・オブジェクトを利用する方法
 ・引数と戻り値を使った処理の実装例
 ・Vector2.magnitude 変数
 ・引数を利用して処理の振る舞いを変更する実装例
 ・引数を利用して外部のクラスの情報をスクリプト内に取得する方法の実装例
 ・Debug.Log メソッドの活用方法
 ・Button.onClick.AddListenerメソッド
 ・Canvas 内にゲームオブジェクトを自分で考えて配置する
 ・enum だけのスクリプト・ファイルの作成
 ・クラス内に別のクラスを作成する(入れ子クラス)
 ・プレファブの解除(アンパック)方法
 ・Behaviour.enabled 変数
 ・Selectable.interactable 変数
 ・複数のスクリプトを経由する処理を読み解く
 ・Linqの機能の実装例  FirstOrDefault メソッド〜
 ・string.IsNullOrEmpty メソッド
 ・Enum.GetNames メソッド
 ・PlayerPrefs クラス ーSetStringメソッド、Save メソッド、HasKey メソッド、GetString メソッドー
 ・String.Split メソッド
 ・コンストラクタ ーインスタンスしたクラスにコンストラクタを利用して値を代入する方法ー
 ・Linqの機能の実装例◆ OrderBy メソッド〜
 ・Enum.Parse メソッド
 ・int.Parse メソッド
 ・foreach 文による処理の流れを把握する
 ・作成したメソッドを自由にデバッグする方法を覚える



発展・応用編として、以下の技術についても学習します。

 ・実装内容による



重点学習箇所

1.タイルマップの利用方法


 2D用の画像データを Unity にインポートし、それを活用してタイルマップを作成します。
ベースとなる部分を作成してから、別のタイルマップ上に地形を配置していく手法を学習します。
また画面のタップ(マウスクリック)を感知して、どの位置のタイルマップをタップしたのかを判定する方法も学習します。


2.DOTweenの使い方


 DOTweenの基本的な使用方法と応用方法について学習します。

 ・ゲームスタート演出やゲームクリア演出



<動画 ゲームスタート演出>
動画ファイルへのリンク

 DOTween ではこのように移動関連の処理や演出関連の処理を実装することができます。
画面が華やかになるとともに、一気にゲームの見た目のレベルがアップします。


3.データベースを活用し、1つのプレファブから、異なる内容の同種類のゲームオブジェクトを作成する


 配置するキャラを作成する際に、複数の異なるプレファブを作成するのではなく、予めデータベースを作成して キャラの情報を登録しておいて
1つのプレファブから、用意してあるデータを反映して、それぞれが別のキャラになるよう、異なるゲームオブジェクトとして振る舞わせています

 合わせて敵キャラやステージのデータなどもデータベース化し、そのデータを読み込むようなロジックの設計を学習します


4.スクリプタブル・オブジェクトの活用


 Unity にはスクリプタブル・オブジェクトという、データベースを作成して利用する機能があります。
今回のゲームは、この機能を活用することによって、【3】のプレファブの振る舞いを変更する処理を実行しています。

 スクリプタブル・オブジェクトの内容はインスペクターから変更が可能ですので、保全管理することも容易になっています。



 Unityの持つ機能を上手く活用していくことで、こういったゲーム内の処理を実装することが出来ます。


 以上でこの手順は終了です。

 => 次は 設計を考える です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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