Unity

Unity無料教材!『i-school』2Dタップシューティング基礎編を学習してみた

Unityの学習方法はたくさんあります。公式のチュートリアルや書籍、ブログ、YouTubeやUdemyなどの動画教材、有料のオンラインスクールなどがあります。

今回は『i-school』というオススメのサイトを紹介させてもらいます。

i-school
https://i-school.memo.wiki

i-schoolはUnityのゲーム制作を学ぶためのサイトで、無料で利用できます。豊富な教材があり、どれを始めればいいか迷うこともあるかもしれません。

Unity初心者の悩み
ゲーム開発を始めたいけれど、どの教材を選べばいいのか、どうやって始めればいいのかわからない。特に、初心者向けのわかりやすい教材が欲しい。

今回はその中から1つ、『2Dタップシューティング』を学習しましたので、その内容を共有したいと思います。

i-schoolの『2Dタップシューティング』について

ゲーム内容

i-schoolの『2Dタップシューティング』は、プレイヤーは動かず、マウスをクリックすると弾を発射するゲームです。敵は画面上部から現れ、一定数の雑魚が出現するとボスが登場します。プレイヤーの下の拠点に敵が当たるとライフが減り、ライフがゼロになるとゲームオーバーになります。ボスを倒すとゲームクリアです。

基礎編の学習内容

基礎編では、このようなゲームを作成するための一連の流れを学びます。マウスをクリックして弾を発射し、ボスを倒すというゲームの作り方を学ぶことができます。さらに、発展編や拡張編では、攻撃の種類の追加や経験値要素など、さらに高度な内容を学ぶことができます。

基礎編の学習時間

参考までに、現在、私はUnityのチュートリアルを少し、本の教材を3冊、Udemyの教材を3つほど(ヴァンサバ風ゲーム、脱出ゲームを2つ)、YouTubeの動画を見ながらFlappyBirdなどを作ってみました。Unityの学習レベルでは初心者だと思います。

基礎編の最後の手順28が終わるまでにかかった日数は10日ほどで、1日3時間はやってたので、合計30時間はかかっていたと思います。サクサクできる人はもっと早いかもしれませんが、早く終わればいいと言うわけではないです。一つ一つ理解しながらやるのをお勧めします。

学習の振り返り

基礎編の学習を終えて、次の発展編に進みたいところですが、学んだ内容の復習も大切です。このブログでは、学んだ内容や感じたことを振り返りながら、学習の成果や感想を共有していきます。

このブログが、i-schoolに興味を持った方や、これから学ぼうと考えている人の参考になれば幸いです。

学習内容と感じだこと

最初は文章の多さに圧倒されましたが、それは丁寧に説明されているため、「よく分からないけど同じように真似して進めるか」という気持ちにならず、要素やプログラムの流れをしっかり理解することができました。

動作確認の動画や、Unityのインスペクターの画像も掲載されており、自分の作成している物と比較しながら確認できるのが良かったです。

Scriptも掲載されていますが、最初は隠されており、「まずは自分で考えてみてください」と促されました。これにより、自ら考えることの重要性を学びました。

アセットを使用しているので、プレイヤーキャラクターや敵エネミーの画像、ヒット時のエフェクトが華やかでモチベーションが上がります。

やっぱり作ってて見た目は大事

また、プレイヤーキャラクターは移動しないため、他のアセットを探して自分好みしたり、自分で作ったオリジナルのキャラクターにすることも可能です。

実際に作ってみた

それでは、実際に作ってみて学んだ内容を振り返りたいと思います。
基礎編は手順28まであります。

各手順を振り返る

手順のタイトルがリンクになっていますので、各ページへ飛ぶことができます。

手順1~7

手順1:Unityのプロジェクトを作る
最初にUnityプロジェクトを作成します。

手順2:アセットのインポート
必要なアセットをプロジェクトにインポートします。

手順3:Canvas作成
Canvasの作成は解像度に関連しています。CanvasのサイズがGameビューの解像度と同じであるため、サイズの変更が制限されることに気づきました。

手順4:プレイヤーキャラクターの設定
プレイヤーキャラクターの設定には、画像配置とPrefabの使用の2つの方法があります。Prefabを使う方法は、キャラクターを画面外に配置し、別のカメラで映してRenderTextureに反映させることで、テレビ番組のワイプのような効果を実現できます。この方法には多くの可能性を感じます。

Scene画面

実際のゲーム画面

手順5:バレットの作成
プレイヤーが発射する弾の作成です。当たり判定を設定するColliderをセットします。

手順6:バレットの基本制御の実装
Bulletスクリプトを作成し、マウスクリックで弾が飛んで行くようにします。
RequireComponentというコンポーネントを自動でアタッチしてくれるスクリプトの記述方法を知りました。ほかにも便利なHeader属性、Summary機能なども学びました。

手順7:スクリプト同士の繋がりを実装
PlayerControllerスクリプトを作成し、異なるスクリプト間での関数の呼び出しや情報のやり取りを実装します。これにより、ゲーム内のさまざまな要素が連動し、より複雑な挙動を実現できます。例えば、プレイヤーキャラクターの動きと攻撃を別々のスクリプトで管理し、それらを連携させることができます。
また、Instantiateメソッドを使い、Prefab化したバレットをクローンとして生成させます。

手順8~11

手順8:タップした位置情報をゲーム内に反映する処理の実装
プレイヤーがマウスをクリックした位置を取得し、その情報をゲーム内で活用します。具体的には、クリックした位置を3D空間の座標に変換して、その方向にバレットを発射するなどの処理を行います。このような位置情報の取得と利用はゲーム開発において重要であり、Input.mousePositionやCamera.ScreenToWorldPointなどの関数を使って実装します。また、ベクトル演算(Vector3.ScaleやVector3.normalizedなど)を使って正確な方向や距離の計算を行います。

手順9 -エネミーの作成と制御
ゲーム内に敵キャラクターであるエネミーを配置し、EnemyControllerスクリプトを作成してエネミーの動きを制御します。

手順10 -バレットとエネミーとの接触判定の実装
ColliderのIsTrigger属性とOnTriggerEnter2Dメソッドを使用して、バレットとエネミーが接触したかを判定します。また、Tagを使用して特定のオブジェクトとの接触判定を制御します。

手順11:バレットの情報を利用してエネミーを破壊する制御を実装
エネミーにHPを実装し、バレットに攻撃力を与えます。バレットの攻撃力分だけエネミーのHPを減らすことで、エネミーの破壊を実現します。また、TryGetComponentを使ってコードを簡略化する方法も学びました。

手順12~18

手順12:プレイヤーの拠点の実装
拠点エリアのオブジェクトを配置し、DefenseBaseスクリプトを作成して、エネミーが拠点エリアに接触した際にエネミーを消滅させます。

手順13:エネミーの情報を利用してプレイヤーの拠点の耐久力を減算する制御の実装
エネミーと拠点エリアの接触時に、エネミーの攻撃力分だけ拠点の耐久値を減らします。また、後続のコーディングをスムーズに進めるためのTODOコメントの使い方も学びました。

手順14:耐久力用のゲージと数字表示の作成
RectTransformのアンカーを利用して、ゲーム画面の下部に耐久力ゲージを配置しました。Sliderを使用してゲージを実装し、HPゲージ風に見せるための設定や調整を行いました。

手順15:耐久力用のゲージと数字表示のスクリプトによる制御処理の実装
耐久力ゲージと数字表示のスクリプトを作成し、耐久値の表示と変化時の更新処理を実装しました。Mathf.Clampメソッドを使用して耐久値の範囲を制限し、耐久値がマイナスにならないようにしました。

手順16:スクリプトによる耐久力用ゲージの制御処理の実装
DOTweenを導入して、耐久力ゲージの減少をアニメーション化しました。これにより、耐久値が減少する際に滑らかなアニメーションが表示されるようになります。

手順17:エネミーのHPゲージの作成とスクリプトによる制御の実装
エネミーにHPゲージを実装し、その制御用スクリプトを作成しました。また、エネミーのオブジェクトをPrefab化しました。これにより、複数のエネミーを簡単に生成できるようになります。

手順18:エネミーの自動生成処理の実装
EnemyGeneratorオブジェクトと対応するスクリプトを作成し、Prefab化したエネミーを自動生成する処理を実装しました。左右ランダムな位置からエネミーを生成するように設定し、一定時間ごとに新しいエネミーを生成します。

手順19~23

手順19:ゲーム終了判定の実装
GameManagerオブジェクトとそれに対応するスクリプトを作成し、ゲーム全体の管理を行います。DefenseBaseスクリプトと連携して、耐久値が0になった際にゲーム終了判定を行います。ゲーム終了判定のロジックを実装しますが、演出はまだ含まれていません。

手順20:ゲーム終了判定の値を利用した制御処理の実装
GameManagerとPlayerController、GameManagerとEnemyGeneratorとの連携をします。ゲーム終了判定が出た場合には、バレットの発射やエネミーの生成を停止します。これにより、ゲーム終了後のプレイヤーとエネミーの操作を制御します。

手順21:バレットによるヒット・エフェクトの実装
アセットを使用してバレットとエネミーの接触時にエフェクトを表示する処理を実装しました。エフェクトがバレットの子オブジェクトになっているため、バレットが消滅すると一緒にエフェクトも消えてしまう問題がありましたが、Transform.SetParentメソッドを使用してこの問題を解決しました。

手順22:エネミーによるヒット・エフェクトの実装①
エネミーがプレイヤーの拠点に接触した際のエフェクトを実装します。前回の内容を復習しながら、エフェクトの制御方法を確認します。

手順23:エネミーによるヒット・エフェクトの実装②
前回のエフェクト問題に対する別の解決策を探ります。staticクラスを使用する方法について学習しますが、初心者にとっては難しいかもしれません。

手順24~28

手順24:エネミーの生成完了状態とボスの討伐状態の追加とゲーム終了判定の実装
一定数のエネミーが生成されたら新たなエネミーの生成を停止し、ボスの生成やボス討伐のロジックを構築します。TODOリストなどを活用して、ゲームの進行状況に応じた制御を実装します。

手順25:ボスの作成と生成処理の実装
既存のエネミーPrefabを使用してボスエネミーを作成し、ボスとしての特性を設定します。スクリプトからサイズやHP、移動方法などを調整し、再利用するPrefabを活用することで効率的にボスを実装します。

手順26:ステージクリア表示の作成と実装
ゲームクリア時の演出を実装します。CanvasGroupコンポーネントを使用してUIの一括処理を行い、DOTweenを利用してフェード演出を追加します。

手順27:ゲームオーバー表示の作成と実装
ゲームオーバー時の演出を実装します。DOTweenのDOTextを使用して文字を一文字ずつ表示するエフェクトを追加します。

手順28:実装全体の振り返り
全体を振り返ると、このページが最も重要だと感じます。
プログラムの流れや設計について自分で考えることが必要であり、学習する際も常に意識するべきです。今後何か新しいことを学ぶ際も、この考え方は欠かせません。

基礎編はこれで完成になります。

まとめ

この教材は、完成したゲームだけでなく、プログラムの組み方や新しいメソッドや要素について学ぶのにとてもおすすめです。操作手順が丁寧に説明されており、初心者でも最後まで取り組むことができる内容だと思います。

i-schoolの教材はオススメ!

i-schoolはとてもいいサイトです。

今回の教材に限らず、いい教材がたくさんあります。
是非Unityの学習に役立ててみてください。

この記事を読んで挑戦したり、実際に取り組んだ方々のコメントをお待ちしています。

基礎編を終え、次は発展編をやろうと思います。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です