ゲームを作る上で、リプレイ機能は必須とも言えますよね。
今回は、プレイヤーが障害物などに当たって消えた場合、初めからやり直す(リプレイ)方法を紹介します。
完成動作
シーンに各GameObjectを配置
1.以下のような感じでGameObjectを配置
赤いボール(プレイヤーとして扱う)の名前は今回は”PlayerSphere”とする。
青いシリンダーはプレイヤーが当たったらプレイヤーを消すGameObject(Cylinder)


プレイヤーを消すスクリプトを作成
1.DestroyPlayer.csという名前のスクリプトを作成して、以下のコードを記載する。
using UnityEngine;
public class DestroyPlayer : MonoBehaviour
{
/// <summary>
/// 衝突した時
/// </summary>
/// <param name="collision"></param>
private void OnCollisionEnter(Collision collision)
{
// 衝突した相手にPlayerタグが付いているとき
if (collision.gameObject.tag == "Player")
{
// 当たった相手を1秒後に削除
Destroy(collision.gameObject, 1.0f);
}
}
}
スクリプトをプレイヤーを消させたいGameObjectにアタッチ
1.DestroyPlayer.csをプレイヤーを消させたいGameObject(青いCylinderオブジェクト)にアタッチする。


プレイヤーに各種設定
1.プレイヤー(PlayerSphereオブジェクト)にRigidBodyをアタッチ

2.プレイヤー(PlayerSphereオブジェクト)のタグを”Player”にする

プレイヤーをプレハブ化
1.プレイヤー(PlayerSphereオブジェクト)をプレハブ化する。
※プレイヤーをプレハブ化することで、プレイヤーが消えても再生させることができる。
1-1.HierarchyタブのPlayerSphereをクリックしたまま、Assetsにカーソルを持っていき、そこで離す。

1-2.HierarchyタブのPlayerSphereの文字の色が青くなり、AssetsにPlayerSphereのプレハブができていることを確認

プレイヤーを再生(リプレイ)させるスクリプトを作成
1.ReplayPlayer.csという名前のスクリプトを作成して、以下のコードを記載する。
using UnityEngine;
public class ReplayPlayer : MonoBehaviour
{
[SerializeField]
[Tooltip("プレイヤーのプレハブを設定")]
private GameObject playerPrefab;
// Update is called once per frame
void Update()
{
// 設定したplayerPrefabと同じ名前(今回は"PlayerSphere")のGameObjectを探して取得
GameObject playerObj = GameObject.Find(playerPrefab.name);
// playerObjが存在していない場合
if (playerObj == null)
{
// playerPrefabから新しくGameObjectを作成
GameObject newPlayerObj = Instantiate(playerPrefab);
// 新しく作成したGameObjectの名前を再設定(今回は"PlayerSphere"となる)
newPlayerObj.name = playerPrefab.name;
// ※ここで名前を再設定しない場合、自動で決まる名前は、"PlayerSphere(Clone)"となるため
// 13行目で探している"PlayerSphere"が永遠に見つからないことになり、playerが無限に生産される
// どういうことかは、22行目をコメントアウトしてゲームを実行すればわかります。
}
}
}
空のGameObjectを作成
1.Hierarchyタブで右クリックをして、”Create Empty”を選択

2.”GameObject”という名前のGameObjectが作成されるのを確認

スクリプトを空のGameObjectにアタッチ
1.ReplayPlayer.csを空のGameObjectにアタッチ


空のGameObjectのReplay PlayerコンポーネントのPlayer Prefabにプレイヤープレハブを設定
1.空のGameObjectのReplay PlayerコンポーネントのPlayer Prefabにプレイヤープレハブ(Asset内の”PlayerSphere”)を設定


完成
これでプレイヤーがプレイヤーを消すGameObjectに当たってプレイヤーが消えても、また再生(リプレイ)するようになりました!
コメント