はじめに
Unityでターン制システムを作ってみたいと思ったことはありませんか?例えばキャラクターが動いた後に他のオブジェクトが動くような仕組みです。今回は、緑色のキューブ(Player)をクリックで動かすと、1秒後に赤色のキューブが動くようにしてみましょう。
Unityを触ったことがないという方はコチラの記事から見てみてください!
Step 1: Unityでシーンをセットアップする
まず、Unityで新しいシーンを作成し、必要なオブジェクトを配置しましょう。
緑キューブを作成する
- ヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」を選び、名前を「Player」に変更します。
- プロジェクトウィンドウを右クリック、「Create」→「Material」を選択します。
- インスペクターウィンドウで、Materialの色を緑色に変更します。
- Materialを「Player」にドラッグアンドドロップして色を変更します。
赤キューブを作成する
- 色を赤色に変更します。名前を「Enemy」に変更します。
- 同じように、もう一つキューブを作成します。
物理特性を適用する
- キューブを選択してインスペクター画面の「AddComponent」ボタンをクリックします。
- 二つのキューブに「Rigidbody」を検索して追加します。
Step 2: スクリプトを作成する
次に、スクリプトを作成してキューブが動くようにします。
Enemy側のスクリプトを作成する
- プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選びます。名前を「EnemyMove」にします。
- スクリプトをダブルクリックして、以下のコードを追加します。
コード全体の説明
このスクリプトは、敵キャラクターが前方に動くためのものです。特定のメソッドが呼び出されると、1秒後に敵キャラクターが後ろに動きます。
各部分の説明
- 変数の宣言
power
: 敵キャラクターを動かす力の大きさを表します。ここではマイナスの値で、後ろに動かす力を意味します。rb
: Rigidbodyコンポーネントを参照します。
- Startメソッド
power
に-5という値を設定します。これは敵キャラクターを後ろに動かす力の大きさです。
- ComTurnメソッド
- このメソッドは、敵キャラクターが動き始めるときに呼び出されます。
StartCoroutine
メソッドを使って、ComForward
という名前のコルーチン(協調ルーチン)を開始します。
- ComForwardコルーチン
- このコルーチンは、
ComTurn
メソッドから呼び出されます。 yield return new WaitForSeconds(1.0f);
で1秒待ちます。rb
に敵キャラクターのRigidbodyコンポーネントを取得して代入します。rb.AddForce(0, 0, power, ForceMode.Impulse);
で、Z軸方向に力を加えます。ここではpower
が-5なので、後ろ方向に力が加わります。
- このコルーチンは、
全体の動き
このスクリプトを持つ敵キャラクターは、ComTurn
メソッドが呼び出されると、1秒後にZ軸のマイナス方向に動きます。これは、例えばプレイヤーキャラクターとのインタラクションの結果として動かしたいときなどに使われます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyMove : MonoBehaviour
{
private float power;
private Rigidbody rb;
void Start()
{
power = -5;
}
public void ComTurn()
{
StartCoroutine("ComForward");
}
IEnumerator ComForward()
{
yield return new WaitForSeconds(1.0f);
rb = GetComponent<Rigidbody>();
rb.AddForce(0, 0, power, ForceMode.Impulse);
}
}
Player側のスクリプトを作成する
- プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選びます。名前を「PlayerMove」にします。
- スクリプトをダブルクリックして、以下のコードを追加します。
コード全体の説明
このスクリプトはプレイヤーオブジェクトに付けられ、マウスでクリックされたときに、オブジェクトを前方に動かします。また、別のオブジェクト(Com)にアクションを起こさせます。
各部分の説明
- 変数の宣言
power
: 動かす力の大きさを表します。rb
: Rigidbodyコンポーネントを参照します。com
: “Com”という名前のゲームオブジェクトを参照します。
- Startメソッド
power
に5という値を設定します。これはオブジェクトを動かす力の大きさです。com
には、シーン内の”Com”という名前のオブジェクトを見つけて代入します。
- OnMouseDownメソッド
- マウスがオブジェクトをクリックしたときに呼ばれるメソッドです。
rb
に、プレイヤーオブジェクトのRigidbodyコンポーネントを取得して代入します。rb.AddForce(0, 0, power, ForceMode.Impulse);
で、Z軸方向に力を加えます。ForceMode.Impulse
は瞬間的な力を与えるモードです。com
オブジェクトのComMove
スクリプトのComTurn
メソッドを呼び出します。
全体の動き
このスクリプトを持つプレイヤーオブジェクトがクリックされると、そのオブジェクトはZ方向に力を受けて前方に動きます。また、”Com”という名前の別のオブジェクトにあるスクリプトのComTurn
メソッドが実行されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
private float power;
private Rigidbody rb;
public GameObject com;
void Start()
{
power = 5;
com = GameObject.Find("Com");
}
void OnMouseDown()
{
rb = GetComponent<Rigidbody>();
rb.AddForce(0, 0, power, ForceMode.Impulse);
com.GetComponent<ComMove>().ComTurn();
}
}
スクリプトをアタッチする
作成したスクリプトをドラッグアンドドロップして、それぞれ「Player」と「Enemy」オブジェクトにアタッチします。
Step 3:ゲームを実行してテスト
Unityの再生ボタンを押してゲームを実行してみましょう。
画面をクリックして赤色のキューブを動かすと、1秒後に青色のキューブが動くようになりました。
まとめ
今回は、Unityで簡単なターン制システムを作る方法を解説しました。プレイヤーがクリックすることで自分のターンが動き、次に敵が自動で動く、基本的な流れをスクリプトで実装しましたね。これをベースに、もっと複雑なルールやアニメーションを追加することで、戦略性の高いゲームを作ることもできます!
ただ、「もっと複雑なターン制ゲームを作りたいけど、一から作るのは大変そう…」と思う方もいるかもしれません。そんな方には、**Turn-Based Strategy Framework**というアセットがおすすめです。このアセットは、ターン制システムに必要な基本機能がすべて揃っていて、カスタマイズもしやすいので、自分のアイデアをすぐに形にできます。
ぜひ今回の内容を参考にしつつ、アセットも活用して、オリジナルのターン制ゲームを作ってみてください!次回は、ターンの管理をより効率的に行う方法や、エフェクトやサウンドを加えてゲームをさらに魅力的にする方法について紹介する予定です。お楽しみに!
よくある質問
Q: プレイヤーや敵の動きをもっとスムーズにしたいです。どうすればいいですか?
A: 現在のコードでは、AddForce
を使ってオブジェクトを動かしていますが、Vector3.Lerp
やVector3.MoveTowards
を使うと、よりスムーズな動きが実現できます。
Q: プレイヤーが動く方向を変えたいです。どうすればいいですか?
A: power
変数の値を変更することで、プレイヤーの動く方向を変えることができます。例えば、power
をnew Vector3(0, 5, 0)
にすると、上方向に動くようになります。
Q: 複数の敵を動かしたいです。どうすればいいですか?
A: 複数の敵を動かす場合は、PlayerMove
スクリプト内で敵のリストを作成し、順番にComTurn
メソッドを呼び出す処理を追加すると良いでしょう。