Unity入門!はじめてのゲーム制作!
この記事は、こんな人にオススメ
- 手軽に簡単3Dのアクションゲームを作りたい!
- 無料でお金をかけずに制作したい!
- 短期間で作りたい!
- 一度もUnityでゲームを完成させたことがない!
これまでUnity公式の2Dアクションゲームのチュートリアルをやり終えた事はありますが、中途半端で「ゲーム」とは呼べないお粗末なものでした。
私は3Dアクションゲームが大好きでよくプレイします。
ウィッチャーシリーズやゼルダのブレワイなどのジャンルです。
そこで普段遊んでる3Dアクションゲームに挑戦してみようと奮起しまして、初心者向けの入門講座など見ていましたら、なんと無料でめっちゃくちゃわかりやすい動画を発見しました!
動画と一緒にUnityをいじっている内に、あれよあれよと形になって完成までたどり着けました!
備忘録を兼ねて制作記録を公開しようと思います。
まずは、完成したゲームはこちら!
できあがった3Dアクションゲーム
タカミネさんのおそうじ大作戦
操作は、矢印キー
カメラは、CinemachineのVirtual Camera(自動追従)
主な内容
60秒間の制限時間の中で、敵を倒してスコアを稼ぐ。
制作期間
制作期間は、毎日ちょっとずつやって2週間ほど。
まとまった時間が取れる人なら、1日でできると思います。
比較動画(作り始めと完成)
最初の方はこんな感じでした。
マップもオブジェクトがなくさっぱり、アイテムもただの丸い玉でした。
Unity3Dアクションゲーム制作におすすめ動画
【3Dアクションゲーム】作り方
- キャラクターの移動とカメラ
- アニメーションの切り替え(走る、剣を振るなど)
- フィールドに敵を発生させる方法
- キャラクターに持たせた剣で攻撃する方法
- 敵をやっつけた時にエフェクトを発生させる方法
- 剣を振った時などゲームに効果音をつける方法
- 敵が追いかけてくる方法
- 敵のHP(体力)実装
- キャラクターのHP(体力)実装
- 敵の動き制御
- ゲームオーバー実装
- フィールドの整地
- 時間性の実装
- スコアを作る方法
一部を紹介しましたが、リストやチャンネルにはもっと多くの動画があります。
こちらの再生リストでは、制作〜完成させて配布する所までまとめられていて、最後までわかりやすかったです。
この動画を見て一緒にコードを書いていくと、3Dアクションゲームが完成します!
動画の文字が見えにくい所は、ブラウザの拡張機能で動画を拡大表示させて見ました。
動画の応用編!
いくつか動画のコードをいじって自分が使いやすいように変更しています。
特にキーボード操作に慣れていないので、簡単なものに変更しました。
応用①:キャラクターをVRMに変更
VRMの出力:VRM1.0
UniVRM:最新版(バージョン0.122.0)
UnityでVRMを使うための準備
①「unitypackage」をダウンロード
②Unityにパッケージをインストール
はじめて「VRM1.0」を出力しましたが、便利でした。
プロジェクトにD&Dでインポートができます。
シロウマ家にお仕えしているレイ様専属のメイドさん。優しく微笑む一方で、レイを甘やかすことなくビシバシと厳しく面倒を見ている。
迷☆探偵の助手-Remaster-
応用②:キャラクターの操作
動画では、WASDを使って移動、スペースキーで攻撃するスクリプトが紹介されています。
これを矢印キーで移動に変更しました。
PlayerController
void Move()
{
if (canMove == false)
{
return;
}
speed = Vector3.zero;
rot = Vector3.zero;
isRun = false;
if (Input.GetKey(KeyCode.UpArrow))
{
rot.y = 0;
MoveSet();
}
if (Input.GetKey(KeyCode.DownArrow))
{
rot.y = 180;
MoveSet();
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rot.y = -90;
MoveSet();
}
if (Input.GetKey(KeyCode.RightArrow))
{
rot.y = 90;
MoveSet();
}
transform.Translate(speed);
PlayerAnimator.SetBool("run", isRun);
}
応用③:カメラの自動追従
動画では、矢印キーを使ってカメラを制御するスクリプトが紹介されています。
移動を矢印キーに変更したので、カメラは普段から使い慣れている「Cinemachine」のVirtual Cameraにしました。
スクリプト不要なので、使いやすく感じました。
Virtual Cameraの調整
わりと細かく設定できます。
特に「Body」の設定で見え方や追従の仕方が大きく変わります。
私の設定はこんな感じ。
PlayerControllerのカメラが不要になったので、そのカメラオブジェクトは非表示にしました。
どれくらいまずいかわかりませんが、不要なカメラの回転操作を削除しました。
void Rotation()
{
var speed = Vector3.zero;
//削除
//if (Input.GetKey(KeyCode.LeftArrow))
//{
// speed.y = -RotationSpeed;
//}
//if (Input.GetKey(KeyCode.RightArrow))
//{
// speed.y = RotationSpeed;
//}
Camera.transform.eulerAngles += speed;
}
応用④:回復アイテム
ここからは再生リストの動画にはない処理です。
回復するアイテムが欲しかったので、追加で作りました。
ゲーム内のプレゼントボックスが回復アイテムです。
プレゼントボックスは、無料のアセットを使用しています。
Unity Asset Store
Supercyan Character Pack Free Sample
参考にしたのはこちらの動画
ここで「public bool JumpFlag = false;」と言うコードが登場します。
アイテム取得の判定は「Flag」を立ててやるといいのか!
と、学びましたので、まずは回復アイテムに貼り付けるスクリプトを書きました。
HealItem
using UnityEngine;
public class HealItem : MonoBehaviour
{
public int healAmount; // 回復量
public GameObject Effect; // 回復エフェクト
public bool ItemFlag = true; // アイテムの表示フラグ
private void Start()
{
// 初期状態の確認と設定
gameObject.SetActive(ItemFlag);
}
private void Update()
{
// ItemFlagが変わったときにオブジェクトを表示/非表示にする
if (gameObject.activeSelf != ItemFlag)
{
gameObject.SetActive(ItemFlag);
}
}
private void OnTriggerEnter(Collider other)
{
if (ItemFlag && other.CompareTag("Player"))
{
// プレイヤーオブジェクト内の StatusManager を取得
StatusManager statusManager = other.GetComponentInChildren<StatusManager>();
if (statusManager != null)
{
statusManager.Heal(healAmount); // プレイヤーのHPを回復
var effect = Instantiate(Effect);
effect.transform.position = new Vector3(transform.position.x, transform.position.y + 1.0f, transform.position.z);
Destroy(effect, 8);
}
ItemFlag = false; // アイテムを非表示にする
gameObject.SetActive(false); // 即座に非表示にする
}
}
}
説明
キャラクターのHP管理は「StatusManager」で敵と同じく管理しています。
なので、キャラクターが回復アイテムのコライダーに触れた時のみ、回復させたいので条件をFlagの状態と「other.CompareTag(“Player”)」としました。
あとは、敵が発生するスクリプト「EnemyManager」を応用させて、回復アイテムが発生する場所を作ります。
ゲーム性の面で、いつでも回復できると易しいと感じたので、回復アイテムの発生場所に「使用しないと消え、何秒かののち再びリポップする」と言う処理を加えました。
うまくいかなかった所
ゲームのウィンドウサイズや解像度
ビルド設定が不慣れだったので、フルスクリーンで起動して困った。
左下の「プレイヤー設定」から、解像度など変更できるのでそこでウィンドウ化で思い通りに出力できました。
ビルド後のFPS数値
ビルド後、動かすマシンによってプレイヤーの速度がまちまちで、かなりもっさりした動きに感じていました。
この問題は、プロジェクトのテストプレイ(ゲーム画面)で、FPSの数値が高くなりすぎていることが原因でした。
確か、300とかそれくらい出ていました。
FPSの値は60にしたかったので、以下のリンクを参考に「PlayerController」に設定を書き加えました。
void Start()
{
Application.targetFrameRate = 60; // 任意の目標フレームレートを設定
}
ゲームオーバー後に時間を止める処理
ゲームオーバーでライフがなくなったあと、そのままタイマーが動き続けてクリアUIが表示されてしまいました。
そこで「GameOver」のUpdate内に時間を止める処理を付け加えました。
//ゲーム内の時間を止める
Time.timeScale = 0f;
はじめてだけど、ゲームらしくなった!
これまでJavaScriptベースのRPGMakerでゲーム制作をしていましたが、動画のお陰でしょうか、UnityのC#は比較的わかりやすいように感じました。
難しい処理をするとなるともっとたくさん学ばなければいけないと思いますが、初心者の第一歩としては、楽しく完成まで到達することができたと思います。
まだゲームとして基本的な所までしか実装できていませんので、もう少しアップデートで賑やかにしたいです。
今後アプデでやりたいこと
- リザルト画面作成
- スコアランキング
- ステージ増設
- プレイアブルキャラクター
- 強化アイテム
もし同じように作ってみてわからないことなどあれば、Xで気軽にリプをお送りください。お力になれる可能性が…ちょっとですがあります!なれなかったらすみません!
私もまだまだUnity初心者ですが、ゲーム制作を応援する気持ちだけは熱いのでゲーム制作ライフを共に楽しみましょう。
これは全てこちらの無料動画を見て制作しました。