【问题标题】:How to structure terrain generator in unity?如何统一构建地形生成器?
【发布时间】:2018-07-29 16:19:33
【问题描述】:

我正在使用 Unity 学习 C#,并且正在尝试创建地形生成器。我创建了一个名为Terrain 的类,其中包含一个名为Chunk 的类数组。 Chunk 应该是方形游戏对象的数组。

代码如下所示:

public class Terrain : MonoBehaviour {

    public Chunk[] terrain;

    // Use this for initialization
    void Start () {
        terrain[0] = new Chunk(0, 0);
    }
}

Chunk 类看起来像这样:

public class Chunk : MonoBehaviour {

    public int size;
    public GameObject tile;

    private GameObject[] chunk;
    private int xCoord, yCoord;

    public void Create(int chunkX, int chunkY){
        for(int y = 0; y < size; y++) {
            for(int x = 0; x < size; x++) {
                int xCoord = x + chunkX*size;
                int yCoord = y + chunkY*size;

                chunk[x + y*size] = GameObject.Instantiate(tile, new Vector3(xCoord, yCoord), Quaternion.identity);
                x = chunkX;
                y = chunkY;
            }
        }
    }

    //Constructor
    public Chunk(int chunkX, int chunkY) {
        xCoord = chunkX;
        yCoord = chunkY;
    }
}

我收到 1 个错误和 1 个警告:

You are trying to create a MonoBehaviour using the 'new' keyword.  This is not allowed.  MonoBehaviours can only be added using AddComponent().


IndexOutOfRangeException: Array index is out of range.

我该如何解决这个问题,你能用新手的话解释为什么我不能使用new 来创建一个新块。另外,为什么数组索引超出范围?最后一个问题,这种结构有什么好处吗?您将如何改进它或以不同的方式实现它?

【问题讨论】:

  • 为什么Chunk 必须是MonoBehavior?通常行为附加到游戏对象,这就是为什么你不能直接创建它们。另一个错误很简单,你没有初始化数组,所以[0]在start方法中不存在。
  • 说实话,我仍然不明白“:MonoBehavior”是什么意思,即使我读过它。请用几句话解释一下好吗?
  • 它将你的类变成可以附加到游戏对象的东西,然后包括像 StartUpdate 这样运行的方法,以便你可以更新该游戏对象的属性。如果您不必将其附加到游戏对象,请不要从MonoBehavior 派生。在尝试编写脚本之前,您真的应该通读 User Manual,而不知道事情是如何工作的。
  • 谢谢罗恩!我会看说明书的。

标签: c# oop unity3d


【解决方案1】:

只需从您的 Chunk 类中删除 : MonoBehaviour,因为您没有任何行为。这只是您的数据的持有者类,它不遵循(也不需要)MonoBehaviour 扩展类所做的启动更新例程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多