Unity记录4.5-存储-随角色加载的Tilemap

文章首发见博客:https://mwhls.top/4820.html
无图/格式错误/后续更新请见首发页。
更多更新请到mwhls.top查看
欢迎留言提问或批评建议,私信不回。

汇总:Unity 记录

摘要:随着角色移动而动态加载的tilemap。

思路-2023/08/18
  • 原因:地图加载使用的双重循环,大地图会非常耗时,并且我希望能实现一个无限地图无缝加载的效果。
  • 确定读取:前面已将地图分区块保存读取,现在根据角色位置或活动位置,来确定保存与加载的位置。
  • 加载提前,卸载滞后:避免加载/卸载边缘同位置时,角色在边缘徘徊出现连续加载/卸载。
  • 卸载:已加载区间 - 新卸载区间。
  • 加载:新加载区间 - 已加载区间。
效果-2023/08/19
  • 下面是三分钟的效果。
    • 地图块为3x3,加载区间为3x3个地图块,卸载区间为7x7个地图块。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EuOAPqOY-1693282112510)(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0ODAiIGhlaWdodD0iMzYwIiB2aWV3Qm94PSIwIDAgNDgwIDM2MCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc3R5bGU9ImZpbGw6I2NmZDRkYjtmaWxsLW9wYWNpdHk6IDAuMTsiLz48L3N2Zz4=)]

实现-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();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值