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

如何直接访问自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:16:08