【问题标题】:Creating monsters with a for loop generating id's使用 for 循环生成 id 的怪物
【发布时间】:2013-11-24 10:48:49
【问题描述】:

我是游戏编程和 C# 的新手,但我有一些 javaScript 和 PHP 的编程经验。

好的,我们开始吧,我有一个 C# 脚本,我想用它来生成怪物。我一直在 Youtube 上关注 Tom Adamson,直到他开始生成随机值:UNITY3D C# with Tom Adamson

这是我的脚本:

using UnityEngine;
using System.Collections;

public class myMonster : MonoBehaviour {

    public class aMonster {

        //The properties
        public int id;
        public int age;
        public string name;
        public string race;
        public int health;

        //A method
        public void monsterData() {
            print("ID: "        + id);
            print("Race: "      + race);
            print("Name: "      + name);
            print("Age: "       + age);
            print("Health: "    + health);
        }

    } // End of class definition

//-----------------------------------------------------------------------------------------

    void Start () {

        aMonster[] bigMonster = new aMonster[51];

        for (int i = 1; i <= 50;) {

            bigMonster[i] = new aMonster();
            bigMonster[i].id = i;
            bigMonster[i].name = "Gorky";
            bigMonster[i].race = "Orc";
            bigMonster[i].age = 320;
            bigMonster[i].health = 200;
            i++;

            bigMonster[i] = new aMonster();
            bigMonster[i].id = i;
            bigMonster[i].name = "Runathu";
            bigMonster[i].race = "Shaman";
            bigMonster[i].age = 670;
            bigMonster[i].health = 100;
            i++;

        }

        for (int i = 1; i <= 2; i++) {
            bigMonster[i].monsterData();
        }

    }

}

当我只有 2 个怪物时,这工作正常,但是当我尝试添加第三个怪物时,我得到这个错误:

IndexOutOfRangeException:数组索引超出范围。 (包装器 stelemref) 对象:stelemref (object,intptr,object) myMonster.Start () (at Assets/myMonster.cs:50)

我已经像这样添加了第三个怪物:

bigMonster[i] = new aMonster();
            bigMonster[i].id = i;
            bigMonster[i].name = "Gorky";
            bigMonster[i].race = "Orc";
            bigMonster[i].age = 320;
            bigMonster[i].health = 200;
            i++;

            bigMonster[i] = new aMonster();
            bigMonster[i].id = i;
            bigMonster[i].name = "Runathu";
            bigMonster[i].race = "Shaman";
            bigMonster[i].age = 670;
            bigMonster[i].health = 100;
            i++;

            bigMonster[i] = new aMonster();
            bigMonster[i].id = i;
            bigMonster[i].name = "Tiny";
            bigMonster[i].race = "Spider";
            bigMonster[i].age = 90;
            bigMonster[i].health = 45;
            i++;

谁能告诉我我做错了什么?我猜 i++ 是错误的做法,因为第三个怪物导致了错误。

非常感谢任何帮助。

【问题讨论】:

  • 您错误地使用了 for 循环。您应该在每个循环中添加一个怪物,并且每个循环 i 都会递增。 for (int i = 1; i &lt;= 50;) 应该是 for (int i = 0; i &lt; 51; i++)
  • 保持 i
  • @Tobberoth:这里的用法有点奇怪,但本身并没有错。括号中的三个部分中的任何一个都可以省略,只要分号仍然存在以标记部分开始/结束的位置。当存在三种不同类型时,祝您每次迭代添加一个怪物好运。当您以可接受的方式开始做这件事时,您可能已经完成了这里正在做的事情。
  • @cHao:确实如此。我猜这个非常基本的概念只是……很奇怪。为什么要将单个怪物多次添加到阵列中,这没有任何意义。要么单独创建怪物并添加到数组中,要么使用 for 循环多次添加怪物。
  • 这很有意义,如果您考虑一下意图。如果你想要一个均匀分布的怪物,你可以预先计算出你想要多少个,然后将每个怪物添加 X 次,或者你可以简单地继续添加一组直到你有足够的数量。两者都行,但后者需要较少的准备工作。

标签: c# for-loop unity3d


【解决方案1】:
aMonster[] bigMonster = new aMonster[51];

意味着你有 51 个怪物(最大索引 = 50),但你在一个 for 循环中将 i 增加了两次,最后一次迭代有 i = 50,所以你试图达到 aMonster[51]

修复:

从 i=0 开始循环并在 i=49 结束,c# 中的索引从 0 而不是 1 开始

我还建议您将代码转换为:

    for (int i = 0; i < 50; i+=2) 
    {

        bigMonster[i] = new aMonster();
        bigMonster[i].id = i;
        bigMonster[i].name = "Gorky";
        bigMonster[i].race = "Orc";
        bigMonster[i].age = 320;
        bigMonster[i].health = 200;


        bigMonster[i+1] = new aMonster();
        bigMonster[i+1].id = i;
        bigMonster[i+1].name = "Runathu";
        bigMonster[i+1].race = "Shaman";
        bigMonster[i+1].age = 670;
        bigMonster[i+1].health = 100;

    }

for循环的增量应该在for循环的定义中完成,看起来更干净。

编辑:

最优雅和安全的解决方案,使用List&lt;aMonster&gt;()

var bigMonster = new List<aMonster>();
var id = 0;
for(int i=0; i<30; i++)
{
    bigMonster.Add(new aMonster { id=id++,name="Gorky",race="Orc",age=320,health=200 });
    bigMonster.Add(new aMonster { id=id++,name="Runathu",race="Shaman",age=320,health=200 });
    //and so on
}

每一种都会产生30个怪物,当然你可以通过修改for循环来改变这个数字

【讨论】:

  • 感谢您帮助我开始,我现在从 0 开始,以 49 结束,但是我将如何继续添加怪物?我在理解如何正确使用 for 循环时遇到问题。这是我现在所做的,它显示了同样的错误:
  • void Start () { aMonster[] bigMonster = new aMonster[50]; for (int i = 0; i &lt;= 49; i++) { bigMonster[i] = new aMonster(); bigMonster[i].id = i; bigMonster[i].name = "Gorky"; bigMonster[i].race = "Orc"; bigMonster[i].age = 320; bigMonster[i].health = 200; i++; .... } for (int i = 1; i &lt;= 3; i++) { bigMonster[i].monsterData(); } }
  • @Dan-LeviTømta 现在你在 for 循环中再增加一次,所以情况是一样的。首先,您可以使用列表并避免 indexoutofrange。我建议你在我的代码中使用新的解决方案
  • 不要改变这个 aMonster[] bigMonster = new aMonster[50];它仍然需要是 51
  • 再次感谢@wedzik,我非常感谢您帮助我。我尝试复制粘贴代码,现在出现新错误。 Assets/myMonster.cs(30,38):错误 CS0246:找不到类型或命名空间名称 List1'。您是否缺少 using 指令或程序集引用? Assets/myMonster.cs(34,16): error CS1061: Type object' does not contain a definition for Add' and no extension method Add' of type object' 找不到(您是否缺少 using 指令或程序集引用?)我显然缺少一些东西,你知道我需要什么吗?
【解决方案2】:

从0开始迭代

for (int i = 1; i <= 50;) 

【讨论】:

    【解决方案3】:

    为了让事情变得更简单,我会使用 List 而不是数组。符号也会更容易,例如:

    var bigMonster = new list<aMonster>();
    
    for(int i = 1; i <=50; )
    {
      var mon1 = new aMonster{id = i, name = "Gorky", race = "orc", age = 320, health = 200};
            i++;
      var mon2 = new aMonster{id = i, name = "Runathu", race = "Shaman", age = 670, health = 100};
            i++;
      var mon3 = new aMonster{id = i, name = "Tiny", race = "Spider", age = 90, health = 45};
            i++;
      bigMonster.Add(mon1);
      bigMonster.Add(mon2);
      bigMonster.Add(mon3);
    }
    
    foreach(aMonster a in bigMonster)
    {
      a.monsterData();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2019-03-09
      • 2021-01-14
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多