13

Unity3Dでターン制のバトルゲームを作成していて、2つのシーン(タウンシーンとバトルシーン)があります。キャラクターがモンスターと出会うたびに、ゲームはキャラクターが戦闘を行う戦闘シーンにジャンプし、敗北した後、町のシーンに戻ります。

問題は、キャラクターが戦闘シーンに入ったときと同じ状態(キャラクターの位置、ステータスなど)でどのように町のシーンに戻るかです。

使用する場合

Application.LoadLevel('battlescene');

それから

Application.loadLevel('townScene');

そうすれば、タウンシーンは最初から始まります。中断したところからタウンシーンを継続させるにはどうすればよいですか?

4

4 に答える 4

16

これを達成する方法は2つあると思います。それはすべて、ターゲットプラットフォームとリソースの重要性によって異なりますが、ここで説明します。

1)リソースが問題ではない場合

通常のシーンとバトルシーンのオブジェクトをすべて1つのシーンにまとめることができます。

  • 2つの空のゲームオブジェクトを作成します(1つはタウンシーンオブジェクト用、もう1つはバトルシーンオブジェクト用)。その後、ゲームキャラクターのバージョンを2つまたは1つ持つことができます。次に、戦闘がトリガーされたときにカメラを町のシーンから戦闘シーンに切り替え、戦闘が終了したときに町のシーンに戻すだけのスクリプトを記述します。

  • 各キャラクターのバージョンが1つある場合は、ゲームキャラクターコントローラーの動作をバトルモードとノーマル/タウンモードに変更するスクリプトを追加するだけです。

  • 各キャラクターのバージョンが2つある場合は、適切なキャラクターコントローラースクリプトを記述し、使用しているキャラクターに応じてゲームキャラクターをアクティブ化/非アクティブ化する必要があります。これは、ファイナルファンタジー7、8、9のようなゲームが同じ効果を達成した方法です。ゲームキャラクターには2つのバージョンがありました。1つはバトルモード用で、もう1つは通常モード用です。

2)リソースが問題である場合(そして私はより効率的な方法だと思います)

Application.LoadLevelAdditive関数を使用できます。この関数を使用すると、別のシーンをロードして、現在のシーンのすべてを破棄するのではなく、新しいシーンとそのすべてのオブジェクトを取得して、現在のシーンに追加できます。したがって、基本的には次のように使用できます。

  • 別のバトルシーンを作成し、シーン内に空のゲームオブジェクトを作成して、シーン内のすべてのオブジェクトを保持します。

  • あなたのnoramlシーンでも同じことをしてください。

  • バトルモードに移行する必要がある場合は、次を使用します。

    Application.LoadLevelAdditive('battlescene');

  • そして、その後バトルシーンをアンロードしたい場合は、バトルシーンのすべてが含まれているため、バトルシーンゲームオブジェクトを破棄するコードを記述するだけでアンロードできます。

最初の方法と同様に、2つの異なるバージョンのキャラクターを使用するかどうかを決定できます。2つのバージョンを使用することの利点の1つは、ゲームモデルを詳しく説明しないことで時間を節約したい場合(特にゲームが非常に大きい場合)、町のシーンに縮小されたモデルを使用することで処理能力を節約できることです。バトルシーンがキャラクターが戦っている場所を表す小さなステージであると仮定して、バトルシーンに洗練されたより詳細なモデルを使用します。ファイナルファンタジーVIIを考えてください。考慮すべきことです。

それがお役に立てば幸いです。私はそれをすべて急いで書いたが、lemmeは何かを片付ける必要があるかどうかを知っている。

于 2012-11-21T06:10:22.967 に答える
4

あなたはc#のスクリプトでそれを行うことができます

void onYourFunction()
{
    Time.timeScale = 0; //pauses the current scene 
    Application.LoadLevelAdditive("YourNextScene"); //loads your desired other scene
}

また、ゲームをアクティブに戻したい場合は、Time.timeScale=1を使用できます。

于 2014-08-29T07:38:13.133 に答える
2

これは古い投稿ですが、使用できる方法がもう1つあります。これは、シーンの状態を保存するためです。これは、ユーザーがApplication.LoadLevelAdditiveを使用して2つのシーンをロードするためのリソースを持っているとは思わない場合に便利です。この方法では、リソースを2倍使用できる可能性があります。

状態を保存する(ファイルまたはDBに変更される可能性のあるすべての情報を保存する)と、後でレベルをロードして、メモリに残さないようにすることができます。これを使用してゲームを保存することもできます。

于 2014-07-22T18:27:19.650 に答える
0

私はそれが古いポストにあることを知っています。しかし、私の場合、別の非常に簡単な解決策を見つけました。ルートシーンに戻るとすぐに、一方のシーンからすべてのゲームオブジェクトを非アクティブ化し、もう一方のシーンをアクティブにしてから再度アクティブ化します。

[Button]
    public void UnPauseScene()
    {
        EndlessSceneCamera.gameObject.SetActive(true);
        Time.timeScale = 1;
        levelStatus = LevelStatus.Running;

        foreach (var go in activeGameObjectsBeforeScenePaused)
        {
            go.SetActive(true);
        }
    }

    [Button]
    public void PauseScene()
    {
        //EndlessSceneCamera.gameObject.SetActive(false);
        levelStatus = LevelStatus.Pause;
        Time.timeScale = 0;

        var allGameObjects = FindObjectsOfType<GameObject>().ToList();
        activeGameObjectsBeforeScenePaused = allGameObjects.Where(x => isActiveAndEnabled).ToList();
        foreach (var go in activeGameObjectsBeforeScenePaused)
        {
            go.SetActive(false);
        }
    }
于 2021-05-25T16:54:14.353 に答える