如何直接访问自定义ShapeMap类的二维数组,实现map[x,y]取值?
能不能直接用
map[x,y]获取ShapeMap里的数组值? 嘿,这个问题我太清楚了——直接这么写是不行的,原因有两个关键点:
1. 私有数组的访问限制
你的shapeMap是private int[,],属于ShapeMap类的私有成员,外部类(比如MapGenerator)没有权限直接访问这个数组。C#的封装特性就是要限制外部对私有成员的直接访问,所以这一步就卡壳了。
2. 没有实现索引器
C#里的类默认是不支持[x,y]这种索引访问语法的,要让你的ShapeMap类像数组一样用索引取值,必须显式定义索引器(Indexer),这是C#里专门用来让类支持数组式访问的语法特性。
解决方案:给ShapeMap添加公共索引器
只要在ShapeMap类里添加一个公共的索引器,就能实现map[x,y]的访问方式了,同时还能保留封装性(不用把shapeMap改成public),甚至可以加边界检查避免数组越界:
using UnityEngine; using System.Collections; using System; public class ShapeMap { private int[,] shapeMap; // 添加这个公共索引器 public int this[int x, int y] { get { // 先做边界检查,防止越界访问 if (x >= 0 && x < shapeMap.GetLength(0) && y >= 0 && y < shapeMap.GetLength(1)) { return shapeMap[x, y]; } // 越界时可以抛异常,或者返回默认值,根据你的需求调整 throw new IndexOutOfRangeException($"索引越界:x={x}, y={y},数组维度是({shapeMap.GetLength(0)}, {shapeMap.GetLength(1)})"); } // 如果需要支持设置值,就加这个set块 set { if (x >= 0 && x < shapeMap.GetLength(0) && y >= 0 && y < shapeMap.GetLength(1)) { shapeMap[x, y] = value; } else { throw new IndexOutOfRangeException($"索引越界:x={x}, y={y},数组维度是({shapeMap.GetLength(0)}, {shapeMap.GetLength(1)})"); } } } public ShapeMap(int width, int height, string seed, int randomFillPercent, int smoothAmount) { shapeMap = new int[width, height]; RandomFillMap(randomFillPercent, seed); // 注意这里原代码的方法参数要匹配! for (int i = 0; i < smoothAmount; i++) { Smooth(); } } // 修正方法参数,和构造函数的调用匹配 private void RandomFillMap(int randomFillPercent, string seed) { // 你的填充逻辑 } private void Smooth() { // 你的平滑逻辑 } }
这样修改后,MapGenerator里的int value = map[x,y];就能正常工作了!
备选方案:用公共Get方法
如果你不想用索引器,也可以写一个公共的取值方法,比如:
public int GetShapeValue(int x, int y) { if (x >= 0 && x < shapeMap.GetLength(0) && y >= 0 && y < shapeMap.GetLength(1)) { return shapeMap[x, y]; } throw new IndexOutOfRangeException(); }
然后在MapGenerator里调用int value = map.GetShapeValue(x,y);,不过索引器的写法更符合C#的语法习惯,用起来和数组一样直观。
另外提个小细节:原代码里ShapeMap的RandomFillMap方法定义是无参数的,但构造函数里调用的是带两个参数的版本,这会导致编译错误,记得把方法参数修正匹配哦!
内容的提问来源于stack exchange,提问作者user3915050
相关产品推荐
相关产品推荐

