【问题标题】:Instantiating gameObject based on Type根据 Type 实例化 gameObject
【发布时间】:2018-11-21 00:34:40
【问题描述】:

所以基本上我正在努力解决一个问题,希望这里有人能指出我正确的方向。

我随机生成项目,并试图实例化所述项目,唯一的问题是,虽然我能够实例化父项目,但我不会预先知道生成的项目是否是“武器/盔甲”等等,都是Item的继承子代。所以我能够得到生成项目的类型,但是在将该类型转换回要实例化的脚本/对象时遇到问题。

例如: 物品 > 武器 > 剑。 我可以生成一把剑,并获得剑的类型,但是我无法实例化一把剑,因为我只有类型而不是真正的剑。

由于我的 Sword 类在它的 Start 方法中加载了数据,然后是 Weapon,然后是 Item,我不能仅仅实例化一个 Item 并知道它是一把剑。 也许我做错了。

感谢您的阅读!

【问题讨论】:

  • 1) 工厂(“让我成为一个东西”)和 2) 项目注册表(“找到我知道的东西的模式”)。
  • 谢谢!我现在正在阅读有关工厂的信息。有简单的例子或链接吗?
  • @Draco18s 我不确定如何将您的评论标记为一个很好的答案,但非常感谢您。教鱼在这个领域非常重要,我学到了很多东西,我只是不知道从哪里开始。工厂看起来很棒!
  • @Holden 查看可编写脚本的对象,您可以创建一个数据库,然后快速进行查找。 SO 已经存在了一段时间,它们非常适合这种特殊情况。
  • @LevonRavel 谢谢!我也会阅读这些内容 =)

标签: c# unity3d


【解决方案1】:

创建武器enum

public enum WeaponType {sword, crossbow, q36SpaceModulator }

用它来告诉你的factory (@Draco18s comment) 要建造什么——在这种情况下制造武器的方法。

public class WeaponFactory {
    public Weapon Create (WeaponType thisWeapon) {
       Weapon newWeapon; 

       switch (thisWeapon) {
          case WeaponType.sword :
             newWeapon = BuildSword();
             break;

          case WeaponType.crossbow:
             newWeapon = BuildCrossbow();
             break;

          // and so on...
          default:  // we don't have whatever-you-asked-for
       }

       return newWeapon;
    }

    private Weapon BuildSword() { return new Sword(); }

}

// somewhere in code...
// you may have other parameters for particular weapon attributes
var sword = royalArmory.Create(Weapon.sword);

【讨论】:

  • 我很喜欢这个概念,但是在需要制造武器的时候,我只知道类型。我不确定如何将武器的类型转换为武器类型枚举值。
  • 1) 研究 MSDN 中的 Type 类。 “名字”在某处。还有enum。了解ToString 的作用。 2)我不明白为什么/如何你只有一个 Type 对象。代码首先如何知道Type? UI 向程序传达了什么信息?
  • 老实说,我可能一开始就做错了,但基本上我正在尝试随机生成我能做的一切。当我点击“开箱”时,我会在那里随机生成一个物品,然后确定它是武器、盔甲、靴子等,然后是什么类型的武器。这就是我最终使用 Type 的地方,以便我可以看到它是哪种类型。
  • 但是什么是“类型”?当然,它代表了您的应用程序域中的具体事物。但是按照编码,它是一个 C# Type 类对象还是仅仅是一个字符串?你总是把它大写——它是你发明的一个类吗? “我有类型”是什么意思?某个类(什么类?)的对象有一个名为“type”的属性,它是一个设置为值“sword”的字符串?一些代码可能会有所帮助。
  • 只是通用类型。在此之前我没有太多使用它,所以它是一座需要翻越的小山。我想我已经解决了这个问题,但是现在我遇到了一个问题,当我返回一个 newWeapon 时,Unity 中的 start 方法不会运行,除非它在一个 gameObject 中,所以我需要弄清楚如何“初始化”创造时的新武器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多