Unity 2021.3 2D中无法调用Tilemap类方法的问题求助
Unity 2021.3自定义Tilemap类引发CS1061错误的解决办法
问题场景
在Unity 2021.3开发2D游戏时,自定义了Tilemap类,调用WorldToCell和SetTile方法时触发CS1061错误,提示'Tilemap'没有这些方法的定义。已尝试重装Unity、更换版本、检查拼写,均未解决,代码与教程一致。
问题代码
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public class Tilemap : MonoBehaviour { [SerializeField] private Tilemap floorMap; private TileBase floorTile; public void PaintFloorTiles(IEnumerable<Vector2Int> floorPositions) { PaintTiles(floorPositions, floorMap, floorTile); } private void PaintTiles(IEnumerable<Vector2Int> floorPositions, Tilemap floorMap, TileBase floorTile) { foreach (var position in floorPositions) { PaintSingleTile(floorMap, floorTile, position); } } private void Start() { Vector2 position = new Vector2Int(1, 2); Debug.Log(position); Debug.Log((Vector3)position); } private void PaintSingleTile(Tilemap tileMap, TileBase tile, Vector2Int position) { var tilePosition = tileMap.WorldToCell((Vector3Int)position); tileMap.SetTile(tilePosition, tile); } }
错误信息(翻译后)
Assets\Scripts\Environment\LevelCreation\Tilemap.cs(29,37): error CS1061: 'Tilemap' 不包含 'WorldToCell' 的定义,也找不到接受第一个类型为 'Tilemap' 参数的可访问扩展方法 'WorldToCell'(是否缺少 using 指令或程序集引用?)
问题原因
自定义类名Tilemap和Unity内置的UnityEngine.Tilemaps.Tilemap类完全重名,导致编译器将所有Tilemap类型引用都指向你自己写的自定义类,而自定义类中并没有WorldToCell和SetTile这两个方法,因此触发错误。
解决方法
方法1:重命名自定义类(推荐)
直接把自定义的Tilemap类改成其他不冲突的名称,比如LevelTilemap,这样编译器就能正确识别Unity内置的Tilemap类:
// 修改类名 public class LevelTilemap : MonoBehaviour { [SerializeField] private Tilemap floorMap; // 现在这里的Tilemap会自动指向Unity内置类 // 其余代码保持不变... }
方法2:使用完整命名空间限定Unity内置Tilemap
如果不想修改自定义类名,就在所有引用Unity内置Tilemap的地方,加上完整的命名空间UnityEngine.Tilemaps.Tilemap,明确告诉编译器要调用的是Unity的内置类:
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public class Tilemap : MonoBehaviour { [SerializeField] // 加上完整命名空间 private UnityEngine.Tilemaps.Tilemap floorMap; private TileBase floorTile; public void PaintFloorTiles(IEnumerable<Vector2Int> floorPositions) { PaintTiles(floorPositions, floorMap, floorTile); } // 参数类型加上完整命名空间 private void PaintTiles(IEnumerable<Vector2Int> floorPositions, UnityEngine.Tilemaps.Tilemap floorMap, TileBase floorTile) { foreach (var position in floorPositions) { PaintSingleTile(floorMap, floorTile, position); } } private void Start() { Vector2 position = new Vector2Int(1, 2); Debug.Log(position); Debug.Log((Vector3)position); } // 参数类型加上完整命名空间 private void PaintSingleTile(UnityEngine.Tilemaps.Tilemap tileMap, TileBase tile, Vector2Int position) { var tilePosition = tileMap.WorldToCell((Vector3Int)position); tileMap.SetTile(tilePosition, tile); } }
内容的提问来源于stack exchange,提问作者Inette
相关产品推荐
相关产品推荐

