unity上加载2D地图(1)

18年年初,跳到了现在的公司,在刚进来时,CTO跟我们讲了要做的游戏类型,2D地图,3D人物(虽然后来又变成3D场景),固定视角的摄像机,随后做地图这个活落到了我身上。

过程怎么想的我忘了,过去的时间有点远,现在只是记录整理一下。因为我想BB的细一点,所以会分为几篇。

先说一下我的思路,我是把世界坐标0,0放在左上角,然后通过循环加载贴图,当然,贴图的大小是固定的,1024*1024,然后把贴图放入

因为主程带来的框架,所以我用ngui的uitexture来做的2D地图。下面粘贴lua代码:

 

function show(self,posMap)

self:setMapShowRegion()

local posX = posMap.x * self.posScale

local posY = -posMap.y * self.posScale

    

 

local left = math.floor((posX - self.screenW/2)/self.cellWide-0.5)

local top = math.floor((posY - self.screenH/2)/self.cellHigh-0.5)

local right = math.floor((posX + self.screenW/2)/self.cellWide+0.5)

local buttom = math.floor((posY + self.screenH/2)/self.cellHigh+0.5)

 

self.mapCountW = right - left + 1

self.mapCountH = buttom - top + 1

self.mapCount = self.mapCountW*self.mapCountH

self.forMinY = top

self.forMinX = left

 

MapTitle.getInstance():getStartPos(Vector3(self.forMinX,self.forMinY,posMap.z),posMap)

for i=self.forMinY,buttom,1 do

for j=self.forMinX,right,1 do

self:loadMapTexture(j,i)

end

end

end

 

写了show方法作为2D地图加载的入口方法,通过传入的鼠标点击世界坐标来作为地图加载的中心点,根据

屏幕的大小Screen.width和Screen.height来算出在屏幕的左、右、上、下边缘分别所在的格子数(因为服务器那边是根据格子数来算像素坐标的),在这里我做了一个小技巧,就是当摄像机边缘在一块地图大于等于0.5时,显示往外延伸的下一块地图块,小于0.5时就显示自己这一块

### Unity 2D中实现无限循环地图的功能 在Unity 2D中实现无限循环地图的功能,通常需要结合地形生成、对象池化以及相机跟随等技术来完成。以下是一个完整的解决方案,包括代码示例和注意事项。 #### 地图生成逻辑 无限循环地图的核心思想是通过程序化生成或复用现有的地图块(Tiles),并在玩家移动时动态更新可见区域的地图内容。这可以通过以下方式实现: 1. **地图块复用**:预先创建一定数量的地图块,并在超出屏幕范围后将其复用到新的位置。 2. **相机跟随**:确保相机始终跟随玩家,并根据相机的视野范围动态加载或卸载地图块。 3. **无缝过渡**:确保地图块之间的衔接平滑,避免出现明显的边界或重叠。 #### 示例代码 以下是一个简单的代码示例,展示如何在Unity 2D中实现无限循环地图功能: ```csharp using UnityEngine; public class InfiniteMap : MonoBehaviour { public GameObject tilePrefab; // 地图块预制体 public int tilesOnScreen = 5; // 屏幕上同时显示的地图块数量 public float spawnOffset = 10f; // 地图块生成的偏移量 private Queue<GameObject> activeTiles = new Queue<GameObject>(); private Vector3 nextSpawnPosition; void Start() { nextSpawnPosition = transform.position; for (int i = 0; i < tilesOnScreen; i++) { SpawnTile(); } } void Update() { if (transform.position.x >= nextSpawnPosition.x - spawnOffset) { SpawnTile(); RemoveTile(); } } void SpawnTile() { GameObject newTile = Instantiate(tilePrefab, nextSpawnPosition, Quaternion.identity); activeTiles.Enqueue(newTile); nextSpawnPosition += Vector3.right * spawnOffset; } void RemoveTile() { if (activeTiles.Count > 0) { GameObject tileToRemove = activeTiles.Dequeue(); Destroy(tileToRemove); } } } ``` #### 注意事项 - 确保地图块的大小和`spawnOffset`一致,以避免出现间隙或重叠[^4]。 - 如果地图块包含复杂的动画或物理交互,可以考虑使用对象池化技术来优化性能[^5]。 - 在实际项目中,可能需要根据地图块的内容调整相机的视野范围和生成逻辑。 #### 性能优化 为了提高性能,可以采取以下措施: - **对象池化**:避免频繁的`Instantiate`和`Destroy`操作,改用对象池管理地图块。 - **异步加载**:对于较大的地图块或资源密集型内容,可以使用异步加载技术减少卡顿。 - **LOD(Level of Detail)**:根据距离相机的远近,动态调整地图块的细节级别。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值