You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态创建的Tilemap瓦片在编辑器与Android构建显示,WebGL构建为何不显示?

WebGL构建中动态创建Tilemap瓦片不显示的解决方案

嘿,我之前在WebGL上也踩过Tilemap动态创建Tile的坑,咱们来一步步解决这个问题。

首先,核心原因是WebGL的资源打包和ScriptableObject序列化机制和编辑器/Android不一样:动态创建的Tile(不管是new Tile()还是ScriptableObject.CreateInstance<Tile>())在WebGL构建中很容易因为资源未被正确打包、序列化信息丢失,导致瓦片无法渲染。

下面是几个靠谱的解决方案:

1. 改用提前创建的Tile资源(最稳妥)

别在代码里动态生成Tile了,直接在Project窗口创建Tile资源:

  • 右键Project窗口 → 2D → Tile,创建一个比如FloorTile的资源
  • 把你的floorSprite拖到这个Tile的Sprite字段里
  • 脚本里直接引用这个Tile资源,而不是动态创建:
using UnityEngine;
using UnityEngine.Tilemaps;

public class TileTest : MonoBehaviour {
    public Tilemap tilemap;
    // 引用提前创建好的Tile资源
    public Tile floorTile;

    void Start () {
        tilemap.SetTile(new Vector3Int(1, 1, 0), floorTile);
        tilemap.SetTile(new Vector3Int(-1, -1, 0), floorTile);
    }
}

这样Unity的构建系统会自动把这个Tile资源包含到WebGL包中,不会出现丢失的情况。

2. 如果必须动态创建Tile(特殊场景)

如果你的需求必须动态生成Tile,那得确保资源被WebGL正确识别:

  • 把你的floorSprite放到Resources文件夹里,这样WebGL构建时不会剔除它
  • 动态创建Tile后,确保它的所有属性都被正确赋值,并且可以尝试手动触发Tilemap的刷新:
tilemap.SetTile(new Vector3Int(-1, -1, 0), tile);
tilemap.RefreshAllTiles(); // 强制刷新Tilemap

另外,要注意WebGL不支持某些反射或动态序列化的操作,尽量避免在运行时创建ScriptableObject,除非你对Unity的资源打包机制非常熟悉。

3. 检查Tilemap的Shader和材质

有时候问题出在Shader兼容性上:

  • 确保Tilemap使用的是Tilemap/Standard这类WebGL兼容的Shader,不要用只支持移动端或编辑器的Shader
  • 检查Tilemap的材质是否正确,有没有丢失引用的情况

4. 调试WebGL报错

打开浏览器的开发者工具(F12),看Console面板有没有报错信息:

  • 有没有资源加载失败的提示?比如你的floorSprite没被打包进去
  • 有没有Tile相关的空引用错误?比如动态创建的Tile是null

按照上面的步骤来,基本就能解决WebGL上动态Tile不显示的问题了。

内容的提问来源于stack exchange,提问作者kungphu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:31:48