当前位置: 首页 > news >正文

Unity记录4.3-存储-点击Tilemap保存或读取区块

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

汇总:Unity 记录

摘要:点击tilemap,文件 保存/读取 该地图区块数据。

思路-2023/08/17

  • 保存和读取上,都很土,都是两层循环,暂时没找到可以批量处理的。
    • 如果大家有更好的方式欢迎留言,我找到更好的方式之后也会在这里更新。
  • 分块:地图被分为若干块,每块大小一样,以避免大地图长时间加载。
  • 存储形式:地图暂时以二维数组保存,二维数组的xy即地图块内的xy,值为tile ID(见上篇Sec. 4.2)。
  • 保存:Tilemap中,tile.name为tile的文件名,因此tilemap保存为ID数组时,需要将tile转name,在从name转ID。
  • 读取:与保存相反,ID需要转为tile,因此一个额外的ID2tileName字典被设计,即ID转name转tile。
  • Tile保存:在读取中,一个10x10的block会循环100次,其中包含诸多重复Tile。在上篇中,Tile通过文件读取。为减少IO操作,Tile文件在被首次读取时,会被记录,因此一个name2tile字典被设计。

数据结构-2023/08/16

    public struct TileInfo{public string ID;public string name;public string description;public string path;};public struct TilesInfo{public string version;public string date;public Dictionary<string, TileInfo> tiles;}public struct TilemapInfo{public int[] block_offset;public List<List<string>> map;}private static TilesInfo tilemap_info;private Dictionary<string, TileBase> name2tile;private Dictionary<string, string> ID2tileName;public Vector3Int block_size;

初始化相关-2023/08/16

  • 加载上篇的TilesInfo,即名字转路径,用于从本地读取tile。
    void load_tiles_info(){// load configstring tiles_info_path = "Assets/Resources/Saved/TilesInfo.json";string jsonText = File.ReadAllText(tiles_info_path);tilemap_info = JsonConvert.DeserializeObject<TilesInfo>(jsonText);// initname2tile = new Dictionary<string, TileBase>();ID2tileName = new Dictionary<string, string>();// init ID2tileNameID2tileName.Add("0", "");foreach (var tile_kv in tilemap_info.tiles){ID2tileName.Add(tile_kv.Value.ID, tile_kv.Key);}}

转换函数-2023/08/16

  • tile名为空,ID为"0"时表示无tile。
    public TileBase map_name_to_tile(string name){if (name == ""){// No tilereturn null;}if (name2tile.ContainsKey(name)){// Tile have been loadedreturn name2tile[name];}else{// Load tilestring tile_path = tilemap_info.tiles[name].path;TileBase tile = Resources.Load<TileBase>(tile_path);name2tile.Add(name, tile);return tile;}}public TileBase map_ID_to_tile(string ID){return map_name_to_tile(ID2tileName[ID]);}public string map_tile_to_ID(TileBase tile){if (tile == null){return "0";}else{return tilemap_info.tiles[tile.name].ID;}}

保存与加载-2023/08/17

  • 保存与加载代码的结构类似,
    • 首先生成文件名,得到地图块在tilemap上的位置,
    • 遍历 待保存/待读取 的数据,将地图块中的相对位置转为tilemap中的绝对位置,
    • 将绝对位置上的数据 记录至二维数组/SetTile到tilemap
    public void save_tilemap(Tilemap tilemap, int[] block_offsets){// file namestring filename = "Map_" + block_offsets[0] + "-" + block_offsets[1] + ".json";string file_path = "Assets/Resources/Saved/" + filename;// Get actual position of blockVector3Int map_offset = new Vector3Int(block_offsets[0] * block_size[0], block_offsets[1] * block_size[1]);// Init tilemap structTilemapInfo tilemap_info = new TilemapInfo {};tilemap_info.block_offset = block_offsets;tilemap_info.map = new List<List<string>>();// Loop for savingfor (int x = 0; x < block_size[0]; x++){List<string> map_row = new List<string>();for (int y = 0; y < block_size[1]; y++){// Get actual position of tileVector3Int tile_offset = new Vector3Int(map_offset[0] + x, map_offset[1] + y);TileBase tile = tilemap.GetTile(tile_offset);// Record tile infostring tile_ID = map_tile_to_ID(tile);map_row.Add(tile_ID);}tilemap_info.map.Add(map_row);}// savestring tilemap_info_json = JsonConvert.SerializeObject(tilemap_info, Formatting.Indented);File.WriteAllText(file_path, tilemap_info_json);}public void load_tilemap(Tilemap tilemap, int[] block_offsets){// read filestring filename = "Map_" + block_offsets[0] + "-" + block_offsets[1] + ".json";string file_path = "Assets/Resources/Saved/" + filename;if (!File.Exists(file_path)){// No datareturn;}string jsonText = File.ReadAllText(file_path);TilemapInfo block_info = JsonConvert.DeserializeObject<TilemapInfo>(jsonText);// Get actual position of blockVector3Int map_offset = new Vector3Int(block_offsets[0] * block_size[0], block_offsets[1] * block_size[1]);// Loop for loadingfor (int x = 0; x < block_size[0]; x++){List<string> map_row = new List<string>();for (int y = 0; y < block_size[1]; y++){// Get actual position of tileVector3Int tile_offset = new Vector3Int(map_offset[0] + x, map_offset[1] + y);string tile_ID = block_info.map[x][y];// Load tile TileBase tile = map_ID_to_tile(tile_ID);tilemap.SetTile(tile_offset, tile);}}

点击以保存/读取-2023/08/17

  • 和Sec. 3.1的拖动鼠标放置tile的事件一样实现,首先鼠标位置转tilemap坐标,再转block位置,再运行保存函数与读取函数。
  • 效果和想象的一样,挺好
    if (input_base.isKeydown("Fire2")){Vector3Int pos_tilemap = tilemap_modify.WorldToCell(input_base.get_mouse_pos(1));int[] block_offset = {Mathf.Abs(pos_tilemap.x) / tilemap_base.block_size[0], Mathf.Abs(pos_tilemap.y) / tilemap_base.block_size[1]};if (pos_tilemap.x < 0){block_offset[0] = -block_offset[0] - 1;}if (pos_tilemap.y < 0){block_offset[1] = -block_offset[1] - 1;}Debug.Log("Mouse pos: [" + pos_tilemap.x + ", " + pos_tilemap.y + "].");Debug.Log("Block offset: [" + block_offset[0] + ", " + block_offset[1] + "].");tilemap_base.save_tilemap(tilemap_modify, block_offset);} if (input_base.isKeydown("Fire3")){Vector3Int pos_tilemap = tilemap_modify.WorldToCell(input_base.get_mouse_pos(1));int[] block_offset = {Mathf.Abs(pos_tilemap.x) / tilemap_base.block_size[0], Mathf.Abs(pos_tilemap.y) / tilemap_base.block_size[1]};if (pos_tilemap.x < 0){block_offset[0] = -block_offset[0] - 1;}if (pos_tilemap.y < 0){block_offset[1] = -block_offset[1] - 1;}Debug.Log("Mouse pos: [" + pos_tilemap.x + ", " + pos_tilemap.y + "].");Debug.Log("Block offset: [" + block_offset[0] + ", " + block_offset[1] + "].");tilemap_base.load_tilemap(tilemap_modify, block_offset);} 

相关文章:

Unity记录4.3-存储-点击Tilemap保存或读取区块

文章首发见博客&#xff1a;https://mwhls.top/4816.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 汇总&#xff1a;Unity 记录 摘要&#xff1a;点击tilemap&#xff0c;文件 保存/读取 该地图区块数据…...

【小吉测评】哔哩哔哩接入AI?!效果如何?

文章目录 &#x1f384;前言⭐申请方式&#x1f3f3;️‍&#x1f308;注意 &#x1f6f8;简介&#x1f354;上手体验&#x1f6f8;进行数学计算&#x1f970;可以写代码吗 &#x1f384;前言 最近人工智能特别火&#xff0c;chatgpt&#xff0c;Claude2&#xff0c;文心一言等…...

微信开发之一键踢出群聊的技术实现

简要描述&#xff1a; 删除群成员 请求URL&#xff1a; http://域名地址/deleteChatRoomMember 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…...

基于Spring Boot 的 Ext JS 应用框架之coworkee

Ext JS 官方提供了一个人员管理的完整应用框架 - coworkee。该框架的显示如下: 该框架的布局特点如下: 布局方式: 左右布局, 左侧导航栏默认收合特点:左侧导航区占用空间小, 工作区较大, 适合没有二级导航栏,工作区需要显示的内容较多的系统。如果导航栏是横向底部,就…...

HOT100打卡—day10—【DP+多维DP】—最新8.29(剩6题)

DP 1 70. 爬楼梯 70. 爬楼梯 一次做&#xff0c;AC代码&#xff1a; 疑问&#xff1a;怎么判断用搜索还是dp&#xff1f;这题&#xff0c;我没有受过dp训练所以第一反应是用dfs搜索&#xff0c;找到所有符合要求的叶子。 class Solution { public:int dp[50]; // step1&a…...

【不会用这个工具,你的Linux服务器就是个摆设!】

01 Tcpdump Tcpdump 是一个强大的网络监控工具&#xff0c;它允许用户有效地过滤网络上的数据包和流量。 这可以获得有关 TCP/IP 和网络上传输的数据包的详细信息。 当你遇到网络协议问题一筹莫展的时候&#xff0c;这时候往往可以通过tcpdump来看网络的通讯过程中发生了什么…...

09 生产者分区机制

kafka如何保证消息的有序 可以通过key-ording策略解决。kafka可以为每条消息定义消息键&#xff0c;也称为key&#xff0c;通常是带有业务属性的比如用户id之类的。有相同消息键的消息会被发到同一个分区。下面实现了key-ordering策略&#xff0c;对key的hashcode进行取模来决…...

亚马逊鲲鹏系统是怎么操作测评的

亚马逊鲲鹏系统可以注册亚马逊买家号、养号、下单留评等&#xff0c;是一款功能比较齐全的测评软件&#xff0c;具体操作如下&#xff1a; 首先我们需要先准备好买家账号&#xff0c;账号可以直接去购买已经注册好了的账号&#xff0c;也可以准备好账号所需要的一些邮箱、ip、…...

电脑上的视频如何导入苹果手机?

AirDroid支持Windows、macOS、android、iOS相互传输文件、视频、图片等。 想要从电脑传输文件到iPhone也很简单&#xff0c;在电脑和iPhone都安装AirDroid&#xff0c;连接同一网络&#xff0c;然后登录同一个帐号就可以了。可绑定的iPhone数量不限&#xff0c;只要都登录同一…...

tsmc standard cell命名规则

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 CKMUX2代表二输入clock mux&#xff0c;D2代表驱动强度X2&#xff0c;6T代表row高为6track&#xff0c;16P96C代表gate length和poly pitch&#xff0c;LVT就是low voltage thr…...

基于ssm医院在线挂号预约系统源码和论文

基于ssm医院在线挂号预约系统源码和论文072 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 课题研究的目的及意义&#xff1a; 专家号难求&#xff0c;是医院现场挂号存在的主要问题之一&#xff0c;每一名专…...

mysql binlog 浅谈

如何开启MySQL的binlog日志 在MySQL中&#xff0c;binlog指的是binary log&#xff0c;二进制日志文件。这个文件记录了MySQL所有的DML操作。通过binlog日志&#xff0c;我们可以做数据恢复&#xff0c;做主从复制等等。对于运维或架构人员来说&#xff0c;开启binlog日志功能…...

three.js(八):内置的三维几何体

三维几何体 BoxGeometry 立方体TetrahedronGeometry 四面体OctahedronGeometry 八面体DodecahedronGeometry 十二面体IcosahedronGeometry 二十面体PolyhedronGeometry 多面体SphereGeometry 球体ConeGeometry 圆锥CylinderGeometry 圆柱TorusGeometry 三维圆环TorusKnotGeomet…...

IDEA 性能优化

前言 IDEA 基于JVM&#xff0c;是内存紧张型的应用&#xff0c;即使是16GB内存也很一般。 机器配置&#xff1a; win10 proi7-4720hq 3.2G 4c8tddr3-1600IDEA 2023.2.1 本文优化在不升级硬件的前提下使用 优化 调整JVM堆内存及GC IDEA 自身的JVM运行时配置&#xff0c;启动…...

react 获取表单中输入框的值

通过使用useState钩子来创建一个状态变量&#xff0c;你可以同时获取多个Input框的值。 1获取input框的值&#xff1a; import React, { useState } from react;function MyComponent() {const [forms, setForms] useState({name: ,nation: ,});const handleInputChange (e…...

[虚幻引擎 UE5] EditableText(可编辑文本) 限制只能输入数字并且设置最小值和最大值

本蓝图函数可以格式化 EditableText 控件输入的数据&#xff0c;让其只能输入一定范围内的整数。 蓝图函数 调用方法 下载蓝图&#xff08;5.2.1版本&#xff09;https://dt.cq.cn/archives/618...

Docker技术--Docker容器管理

1.Docker容器相关的指令(单个容器操) 我们之前在Docker中部署了一个实际应用的案例wordpress,其中使用到了一些相关于容器的指令,那么下面我们一起来总结使用。 Docker指令的语法规则如下所示: Docker + 命令关键字 [+参数选项] -1类:关闭、开启、重启、开启自启 systemct…...

three.js(七):内置的二维几何体

二维几何体 PlaneGeometry 矩形平面CircleGeometry 圆形平面RingGeometry 圆环平面 PlaneGeometry 矩形平面 PlaneGeometry(width : Float, height : Float, widthSegments : Integer, heightSegments : Integer) width — 平面沿着X轴的宽度。默认值是1。height — 平面沿着Y…...

golang-bufio 缓冲读

缓冲 IO 计算机中我们常听到这样的两种程序优化方式&#xff1a; 以时间换空间以空间换时间 今天要来看的缓冲IO就是典型的以空间换时间&#xff0c;它的基本原理见上图。简单的解释就是&#xff1a;程序不再直接去读取底层的数据源&#xff0c;而是通过一个缓冲区来进行读取…...

前端 js实现 选中数据 动态 添加在表格中

如下图展示&#xff0c;表格上方有属性内容&#xff0c;下拉选中后&#xff0c;根据选中的内容&#xff0c;添加在下方的表格中。 实现方式&#xff0c;&#xff08;要和后端约定&#xff0c;因为这些动态添加的字段都是后端返回的&#xff0c;后端自己会做处理&#xff0c…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...