Unity でポータル システムを作成する

ポータルは多くのゲームで人気の機能で、プレイヤーがさまざまな場所の間をシームレスにテレポートできるようにします。このチュートリアルでは、Unity でポータル システムを作成するためのさまざまな手法について説明します。基本的なテレポート、ビジュアル ポータル用のレンダリング テクスチャの使用、プレイヤーの方向と勢いを維持するポータル メカニズムの実装について説明します。

プロジェクトの設定

まず、基本的な Unity プロジェクトを設定しましょう。

  1. 新しい Unity プロジェクトを作成します。
  2. スクリプトを整理するために、Scripts という名前の新しいフォルダーを追加します。
  3. プレイヤー キャラクターと 2 つのポータル オブジェクトを含むいくつかの基本オブジェクトを使用して、新しい 3D シーンを作成します。

基本的なテレポート

ポータル システムの最も単純な形式は、プレイヤーが瞬時に 1 つの場所から別の場所に移動する基本的なテレポートです。

テレポートスクリプトの作成

using UnityEngine;

public class TeleportationPortal : MonoBehaviour
{
    public Transform destination;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            other.transform.position = destination.position;
            other.transform.rotation = destination.rotation;
        }
    }
}

このスクリプトを両方のポータル オブジェクトに添付し、宛先を対応するポータルに割り当てます。

ビジュアルポータ​​ルにレンダリングテクスチャを使用する

より没入感のあるポータル システムを作成するには、レンダリング テクスチャを使用してポータルの反対側にあるものを表示できます。

レンダリングテクスチャの設定

  1. プロジェクト ウィンドウを右クリックし、作成 > レンダリング テクスチャ を選択して、新しいレンダリング テクスチャを作成します。
  2. これを繰り返して、2 番目のレンダリング テクスチャを作成します。
  3. シーン内に各ポータルに 1 つずつ、合計 2 つの新しいカメラを作成し、各カメラにレンダリング テクスチャを割り当てます。
  4. ポータルの目的地に合わせてカメラの位置を設定します。

レンダリングテクスチャの適用

using UnityEngine;

public class Portal : MonoBehaviour
{
    public Camera portalCamera;
    public Material portalMaterial;

    void Start()
    {
        portalMaterial.mainTexture = portalCamera.targetTexture;
    }
}

このスクリプトを各ポータルにアタッチし、対応するポータル カメラとマテリアルをレンダリング テクスチャに割り当てます。

プレイヤーの方向性と勢いを維持する

ポータル システムをよりリアルにするには、プレイヤーがポータルを通過するときにその向きと勢いを維持する必要があります。

強化されたテレポートスクリプト

using UnityEngine;

public class EnhancedPortal : MonoBehaviour
{
    public Transform destination;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            CharacterController playerController = other.GetComponent();
            Rigidbody playerRigidbody = other.GetComponent();

            // Disable the CharacterController to allow manual position and rotation updates
            if (playerController != null)
            {
                playerController.enabled = false;
            }

            // Maintain orientation
            Vector3 relativePosition = destination.InverseTransformPoint(other.transform.position);
            other.transform.position = destination.TransformPoint(relativePosition);

            // Maintain momentum
            if (playerRigidbody != null)
            {
                Vector3 relativeVelocity = destination.InverseTransformDirection(playerRigidbody.velocity);
                playerRigidbody.velocity = destination.TransformDirection(relativeVelocity);
            }

            // Re-enable the CharacterController
            if (playerController != null)
            {
                playerController.enabled = true;
            }
        }
    }
}

このスクリプトを各ポータルに添付し、対応する宛先を割り当てます。

ポータルシステムのテスト

ポータル システムをテストするには、次の手順に従います。

  1. プレイヤーキャラクターをポータルの 1 つの近くに配置します。
  2. ゲームを実行するには、Play を押します。
  3. プレイヤーキャラクターをポータル内に移動し、テレポートと視覚効果を観察します。

結論

Unity では、ポータル システムを作成するためのさまざまな手法を検討しました。基本的なテレポートから始めて、レンダリング テクスチャを使用してビジュアル ポータルを追加し、プレイヤーの方向と勢いを維持できるようにシステムを強化しました。これらのコンセプトは、特定のゲーム プロジェクトのニーズに合わせてさらに拡張およびカスタマイズできます。