Unity Record 4.5 - ストレージ - キャラクターをロードしたタイルマップ

この記事は最初にブログで公開されました: https://mwhls.top/4820.html
画像なし/形式エラー/今後の更新については、最初のページをご覧ください。
詳細な更新情報については、mwhls.topをご覧ください
。質問や批判がある場合は、メッセージを残していただけます。プライベート メッセージには返信されません。

概要: Unity レコード

概要: キャラクターの移動に応じて動的にロードされるタイルマップ。

アイデア-2023/08/18
  • 理由: マップのロードに使用される二重ループ、大きなマップは非常に時間がかかるため、無限のマップをシームレスにロードする効果を達成したいと考えています。
  • 読み取りの確認: これまでマップはチャンクで保存および読み取りされていましたが、保存およびロードの場所はキャラクターの位置またはアクティビティ位置に基づいて決定されるようになりました。
  • 事前のロード、アンロードの遅れ: ロード/アンロードのエッジが同じ位置にある場合、キャラクターがエッジ上をさまよう場合、連続的なロード/アンロードを避けます。
  • アンロード: ロードされた間隔 - 新しいアンロードされた間隔。
  • 読み込み中: 新しい読み込み間隔 - すでに読み込まれている間隔。
効果-2023/08/19
  • 以下は3分での効果です。
    • マップ タイルは 3x3、ロード間隔は 3x3 マップ タイル、アンロード間隔は 7x7 マップ タイルです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-EuOAPqOY-1693282112510)(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRo) PSI0OAIG HlawdodD0IMzYwIiB2aWV3Qm94PSIwiDAgNDgwIDM2MCI +PHJlY3Qgd2lkdGg9IjEwMCUiIGLAWdodD0imTAwJSIgc3R5bGU9ImZpbGw6I2NmZDRkYjtmaWxsLW9wYWNpdHk6IDAuMTsiLz48 L3N2Zz4=)]

実現しました-2023/08/19
  • つまり、上記のアイデアはコード化されており、重要でないいくつかのアイデアは省略されています。
    • 前回の記事でSec4.4の再構築を省略しましたが、書いてみると臭くて長くて使いにくいことがわかったので、次のように置き換えましたpublic string __sysConfig_path__ { get { return Path.Combine(__root_dir__, "Configs.json"); } }
    • そして、位置決めオブジェクト。Start()コルーチンはブロックを変更する必要があるかどうかを決定します。
    • スカイリムのあらゆるオブジェクトがオブジェクトになっていて、そのMODがとても強力だと聞いたので入れてみたいと思っています。
    private List<Vector3Int> _blockLoads_offsets_current = new List<Vector3Int>();
    
    public void balance_tilemap(Tilemap tilemap, Vector3Int block_offsets_new){
    
    
        List<Vector3Int> loads_new = new List<Vector3Int>();
        List<Vector3Int> unloads_new = new List<Vector3Int>();
        int x_loadBound = _game_configs.__block_loadBound__.x;
        int y_loadBound = _game_configs.__block_loadBound__.y;
        int x_unloadBound = _game_configs.__block_unloadBound__.x;
        int y_unloadBound = _game_configs.__block_unloadBound__.y;
        int x_new = block_offsets_new.x;
        int y_new = block_offsets_new.y;
    
        // load
        for (int x = -x_loadBound + 1; x < x_loadBound; x++)
            for (int y = -y_loadBound + 1; y < y_loadBound; y++)
                loads_new.Add(new Vector3Int(x_new + x, y_new + y));
        List<Vector3Int> loads_wait = loads_new.Except(_blockLoads_offsets_current).ToList();
        foreach(Vector3Int block_offsets in loads_wait){
    
    
            // Debug.Log("Load: {" + block_offsets.x + ", " + block_offsets.y + "}.");
            load_tilemap(tilemap, block_offsets);
        }
    
        // unload
        for (int x = -x_unloadBound + 1; x < x_unloadBound; x++)
            for (int y = -y_unloadBound + 1; y < y_unloadBound; y++)
                unloads_new.Add(new Vector3Int(x_new + x, y_new + y));
        List<Vector3Int> unloads_wait = _blockLoads_offsets_current.Except(unloads_new).ToList();
        foreach(Vector3Int block_offsets in unloads_wait){
    
    
            // Debug.Log("Unload: {" + block_offsets.x + ", " + block_offsets.y + "}.");
            save_tilemap_unload(tilemap, block_offsets);
        }
    
        // update state
        _blockLoads_offsets_current = _blockLoads_offsets_current.Except(unloads_wait).ToList();
        _blockLoads_offsets_current = _blockLoads_offsets_current.Union(loads_wait).ToList();
    }

おすすめ

転載: blog.csdn.net/asd123pwj/article/details/132558739