はじめに
こんにちは!今回は、ゲーム内でキャラクターが動く床に乗ったときに一緒に動く仕組みを作ってみましょう。これは、エレベーターや動くプラットフォームのあるゲームでよく使われるテクニックです。
Unityを触ったことがないという方はコチラの記事から見てみてください!
動く床の作成
まずは、動く床を作成しましょう。
オブジェクトを配置
- 新しい3Dオブジェクトの作成
ヒエラルキーウィンドウで右クリックして、「3D Object」→「Cube」を選びます。このCubeが床になります。 - 床のサイズ調整
インスペクターウィンドウで、Transformコンポーネントの「Scale」を調整して床の大きさを変更します。例えば、Xを5、Yを0.5、Zを5にすると、広い床になります。
タグを設定
- 床オブジェクトを選択し、インスペクターウィンドウで「Tag」を「MovingPlatform」に設定します
床を動かすスクリプトの作成
- プロジェクトウィンドウで右クリックして、「Create」→「C# Script」を選び、スクリプトに「MovingPlatform」と名前を付けます。次に、このスクリプトを床オブジェクトにドラッグ&ドロップしてアタッチします
- MovingPlatformスクリプトをダブルクリックして、以下のコードを追加します:
using UnityEngine;
public class MovingPlatform : MonoBehaviour
{
public Vector3 pointB;
private Vector3 pointA;
public float speed = 2.0f;
void Start()
{
pointA = transform.position;
}
void Update()
{
float time = Mathf.PingPong(Time.time * speed, 1);
transform.position = Vector3.Lerp(pointA, pointB, time);
}
}
スクリプトの解説
コード全体の説明
このスクリプトは、床(プラットフォーム)が2つの地点の間を行ったり来たりする動きをします。pointA
とpointB
がその2つの地点で、speed
は移動する速度です。
各部分の説明
- using UnityEngine;
- Unityの機能を使うための宣言です。必ず最初に書きます。
- public class MovingPlatform : MonoBehaviour
MovingPlatform
というクラスを作成しています。MonoBehaviour
を継承することで、Unityのスクリプトとして動くようになります。
- public Vector3 pointB;
pointB
は床が移動する先の地点を表す3次元ベクトルです。public
なので、Unityのインスペクターで設定できます。
- private Vector3 pointA;
pointA
は床が移動する元の地点を表す3次元ベクトルです。private
なので、スクリプト内でしか使えません。
- public float speed = 2.0f;
- 床の移動速度を設定するための変数です。デフォルトでは2.0に設定されています。
- void Start()
- ゲームが始まるときに一度だけ呼ばれる関数です。ここで
pointA
の位置を現在の床の位置に設定しています。
- ゲームが始まるときに一度だけ呼ばれる関数です。ここで
- void Update()
- 毎フレーム(画面が更新されるたび)呼ばれる関数です。ここで床の位置を計算して更新します。
- float time = Mathf.PingPong(Time.time * speed, 1);
Mathf.PingPong
関数を使って、時間経過に基づいた0から1までの値を繰り返し生成します。これにより、床が往復する動きをします。
- transform.position = Vector3.Lerp(pointA, pointB, time);
Vector3.Lerp
関数を使って、pointA
からpointB
までの間をスムーズに補間します。time
の値に基づいて床の位置を更新します。
全体の動き
- ゲームが始まると、床の元の位置
pointA
が設定されます。 - 毎フレーム、
Update
関数が呼ばれて、time
という変数に0から1までの値が交互に入ります。 transform.position
がこのtime
に基づいてpointA
とpointB
の間を移動します。- これにより、床が往復移動するようになります。
- このスクリプトでは、床がpointA(初期位置)とpointBの間を行き来するようにします。speedは床の移動速度です。
- pointBの設定
インスペクターウィンドウで、pointBの値を設定します。例えば、Xを10にすると、床はX軸方向に10ユニット動くようになります。
キャラクターが床と一緒に動く仕組み
次に、キャラクターが動く床に乗ったときに一緒に動くようにしましょう。
空のオブジェクトを作成
- ヒエラルキーウィンドウで右クリックして、「Create Empty」を選びます。
- この空のオブジェクトに「PlayerParent」と名前を付けます。
キャラクターを作成
- ヒエラルキーウィンドウで右クリックして、「3D Object」→「cube」を選びます。
- このキューブがキャラクターになります。適当に配置しておきましょう。
物理特性を追加
- インスペクター画面の「AddComponent」ボタンをクリックします。
- 「Rigidbody」を検索して追加します。
親子関係の設定
- キャラクターを「PlayerParent」の子オブジェクトにドラッグ&ドロップします。
- これで、PlayerParentを動かすとキャラクターも一緒に動くようになります。
スクリプトの作成
- プロジェクトウィンドウで右クリックして、「Create」→「C# Script」を選びます。
- スクリプト名を「PlayerOnPlatform」と名前を付けます。
- このスクリプトをキャラクター(Capsule)にドラッグ&ドロップしてアタッチします。
- PlayerOnPlatformスクリプトをダブルクリックして、以下のコードを追加します:
コード全体の説明
このスクリプトは、プレイヤーが動く床に乗ると床と一緒に動くようにし、床から降りると元の位置に戻るようにします。
各部分の説明
- using UnityEngine;
- Unityの機能を使うための宣言です。必ず最初に書きます。
- public class PlayerOnPlatform : MonoBehaviour
PlayerOnPlatform
というクラスを作成しています。MonoBehaviour
を継承することで、Unityのスクリプトとして動くようになります。
- private Transform originalParent;
originalParent
はプレイヤーの元の親オブジェクトを保存するための変数です。Transform
型を使っています。
- void OnCollisionEnter(Collision other)
- プレイヤーが何かに衝突したときに呼ばれる関数です。引数
other
には衝突したオブジェクトの情報が入ります。
- プレイヤーが何かに衝突したときに呼ばれる関数です。引数
- if (other.gameObject.CompareTag(“MovingPlatform”))
- 衝突したオブジェクトが「MovingPlatform」というタグを持っているかどうかをチェックします。
- originalParent = transform.parent;
- プレイヤーの元の親オブジェクトを
originalParent
に保存します。
- プレイヤーの元の親オブジェクトを
- transform.parent = other.transform;
- プレイヤーの親オブジェクトを衝突した動く床に変更します。これにより、床と一緒に動くようになります。
- void OnCollisionExit(Collision other)
- プレイヤーが何かとの衝突を終えたときに呼ばれる関数です。
- if (other.gameObject.CompareTag(“MovingPlatform”))
- 衝突が終わったオブジェクトが「MovingPlatform」というタグを持っているかどうかをチェックします。
- transform.parent = originalParent;
- プレイヤーの親オブジェクトを元の
originalParent
に戻します。これにより、プレイヤーは床から降りた後、床の動きに影響されなくなります。
- プレイヤーの親オブジェクトを元の
全体の動き
- プレイヤーが動く床に乗ると、
OnCollisionEnter
関数が呼ばれます。 - 衝突したオブジェクトが「MovingPlatform」というタグを持っている場合、プレイヤーの親オブジェクトが動く床に変更されます。
- これにより、プレイヤーは動く床と一緒に動きます。
- プレイヤーが動く床から降りると、
OnCollisionExit
関数が呼ばれます。 - プレイヤーの親オブジェクトが元の親オブジェクトに戻され、動く床の影響を受けなくなります。
using UnityEngine;
public class PlayerOnPlatform : MonoBehaviour
{
private Transform originalParent;
void OnCollisionEnter(Collision other)
{
if (other.gameObject.CompareTag("MovingPlatform"))
{
originalParent = transform.parent;
transform.parent = other.transform;
}
}
void OnCollisionExit(Collision other)
{
if (other.gameObject.CompareTag("MovingPlatform"))
{
transform.parent = originalParent;
}
}
}
テストプレイ
これで、キャラクターが動く床に乗ったときに一緒に動く仕組みが完成しました。Unityで実行して試してみてください。
床が動くとき、キャラクターも自然にその上で動くようになりましたね。いろんなシーンで応用できるので、自分のプロジェクトでもぜひ試してみてくださいね!
おすすめのアセット
2Dアクションプラットフォーマーキットは、Unityで簡単に2Dアクションゲームを作成できるテンプレートです。プレイヤーキャラクターの移動、ジャンプ、攻撃などの基本機能が揃っており、すぐにゲーム開発を始められます。このキットを使えば、プログラミングの知識がなくても自分だけのオリジナルゲームを作れます。
特徴
- 簡単にカスタマイズできるキャラクターコントローラー
- 多彩なエネミーAIとボスバトル
- コイン収集やパワーアップアイテムの実装
- 使いやすいレベルエディター
- モバイルデバイス対応