【问题标题】:Unity/C# what's wrong with the way I think about this problemUnity/C#我思考这个问题的方式有什么问题
【发布时间】:2020-09-01 08:10:11
【问题描述】:

我有一个名为 Item 的抽象父类 从这个我固有到装备,从这里到武器和盔甲。由于我希望我的武器具有不同的行为,因此我希望我的逻辑对类进行操作。从我的 Item 类中,我还继承了一个 Resource 类,它应该是静态的。我的 Equipment 课程不应该也不应该是 instansiable ,因为单独的剑,例如。可以锐化或损坏,以将其从基础类中更改,而无需更改所有其他剑。所以我需要克隆这些类实例。但是由于克隆一个类是一件非常不重要的事情,我想知道我是否在我的架构中做错了什么,并以错误的方式思考问题?有人有什么想法吗? /迈克尔

【问题讨论】:

  • 我认为如果你能添加一些代码会很好。我不想在脑海中想象这一点。
  • 请张贴您的 / 代码以“可视化”您的意思。正如前面已经提到的,很难想象你实际上想要实现什么。听起来您可能有兴趣使用ScriptableObjects
  • 问题是,这不是代码问题,而是一般方法问题,但也许我应该写一些伪代码来作为我的问题的基础并参考讨论

标签: c# unity3d architecture


【解决方案1】:

我认为您应该考虑为文件(xml 等)中的项目设置“统计信息”,然后创建一个工厂类,该类可以为您提供已设置所有统计信息的文件。

   public abstract ItemFactory{
     public static Sword GetSword(){
       var sword = new Sword();
       //Set stats for sword from file
       return sword;
     }
   }

【讨论】:

  • 我也想过,有一个代表行为的类,然后从Json之类的导入所有的stat变量实例
【解决方案2】:

既然可以使用引用,为什么还要使用克隆?如果我正确理解您的问题,我将使用ScriptableObjects 定义您的项目对象,这使它们成为您项目中的资产。然后可以通过检查员分配。 一般的类布局可能看起来像这样。

class Equipment : ScriptableObject
{
    public int goldCost;
}

class Weapon : Equipment
{
    public intDefaultSharpness;
}

这些是您的定义类,记住它们是用来定义每个项目类别的一般属性。所以你可能有一把剑,但没有“火龙杀手的阔剑”。如果您查看有关ScriptableObjects 的链接,您会发现允许您从这些定义类中实例化新资产的代码。现在您可以创建您的 Broadsword 等等。现在您的对象只是成为像纹理和 3D 模型这样的资产。您可以在检查器中轻松编辑它们(并且可能希望使用自定义编辑器使其变得更好)

类似于纹理或 3D 模型,我们不会在每次使用时都复制它,而是引用它。因此,当您的玩家角色持有武器时,您将拥有一个子 GameObject,它只保留对原始对象的引用和任何其他“本地”数据。

class PlayerWeapon : GameObject
{
    public Weapon template;
    public int durability;
}

好消息是,template Weapon 可以通过编辑器中的检查器进行分配,因为它只是一个普通资产。 durability 属性是这个 playerWeapon 的本地属性,GameObject 可以多次使用。

当然,这可以根据需要进行扩展。我可能会添加 getter/setter 来隐藏基于 buffs/debuffs 的额外计算。类似的东西

public int AttackStrength
{
    get 
    {
        return owner.strength + template.strength
    }
}

【讨论】:

  • 实际上我的第一个想法是使用可编写脚本的对象作为项目的模板,这些模板的实例各不相同,主要是因为此类系统上的所有教程和指南都倾向于使用这种方法。但是我只是认为它的扩展性不好,因为我担心不断创建和销毁资产会有些麻烦
  • 您不应该不断地创建和销毁资产。资产是属于项目一部分的文件——项目窗口中的东西。您可以创建实例,就像使用任何 Monobehaviour 一样。 ScriptableObjects 通常只用于保存不会更改的配置信息。
  • 您不是在创建资产,而是在引用它们。如果你有一个项目作为资产,你可以使用一个代理对象,比如一个游戏对象,来引用它并额外存储任何“修改”,比如耐久性或增益等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多