unity3d 如何在C#中构建预定义的对象数组?

mbzjlibv  于 2022-11-25  发布在  C#
关注(0)|答案(2)|浏览(161)

首先,我是一个业余程序员,在过去的7年里断断续续地学习,和项目中使用Node.JS。现在我决定转向另一种主要语言,并开始学习C#,学习游戏开发等。我正在构建一个技能树,我可以“我真的不明白如何在没有一堆空的GameObjects(Unity)保存信息的情况下,以干净有序的方式存储我需要的每项技能的信息。
我知道(至少是我最喜欢的方式)如何在Node.JS中实现这一点,但是我找不到将其转换为C#的正确信息。
Node.JS范例

var skillTree = [
   {
      name: "Skill1",
      effect: skill1Func,
      unlocked: true,
      prereqs: [ ]
   },
   {
      name: "Skill2",
      effect: skill2Func,
      unlocked: false,
      prereqs: [1, 5]
   }
];

正如您所看到的,它只是一个对象数组,所有对象都遵循相同的属性,但属性是预先确定的,而不是添加的。我只是找不到正确的路径来存储这些信息,以便在C#中使用,所以如果有人能帮助我,将不胜感激!

ckx4rj1h

ckx4rj1h1#

This answer基本上拥有一切。
无论如何,我想添加一个Unity特定的建议/扩展:
而不是“硬编码”这在一个脚本中,并使用基于索引的int[] PreReqs不是更动态和可扩展的简单地创建和配置技能在统一编辑器?
因此,我将使用ScriptableObject,它基本上允许您创建技能资产,这些技能资产位于资产中,并且不附加到特定的GameObject

[CreateAssetMenu]
public class Skill : ScriptableObject
{
    [SerializeField] private SkillEffect effect;
    [SerializeField] private Skill[] preReqs;

    public string Name => name;
    public SkillEffect Effect => effect;
    public bool Unlocked;
    public Skill[] PreReqs => preReqs;
}

然后你可以通过Assets-〉右键单击-〉Create-〉Skill创建示例,命名并配置它。这样你就可以很容易地在preReqs中直接将它们彼此链接起来,而不必依赖于任何索引。
在最终的消费者组件中,您将最终在一个字段中引用所有这些属性

public Skill[] skillTree;

根据您对Effect的需求,我们还提供了另一个扩展:例如,如果Effect不是enum,而是一个自定义方法,则可以简单地将此Skill设置为abstract类型,并基于它拥有不同的子技能,例如

public abstract class Skill : ScriptableObject
{
    [SerializeField] private Skill[] preReqs;

    public string Name => name;
    public abstract void Effect();
    public bool Unlocked;
    public Skill[] PreReqs => preReqs;
}

然后例如

[CreateAssetMenu]
public class SayHelloSkill : Skill 
{
    public override void Effect()
    {
        Debug.Log("Hello World!");
    }
}

您可以向该方法传递所需的任何参数,并基本上在这些参数上执行任何代码,同时创建每个技能的示例并像以前一样在skillTree中引用它们。

fgw7neuy

fgw7neuy2#

通常你会创建一个类对象来定义数据的结构。然后你可以创建一个该类类型的变量,并在构造函数中填充数据。例如:

public class skillItem {
    public string Name { get; set; }
    public SkillEffect Effect { get; set; }
    public bool Unlocked { get; set; }
    public int[] PreReqs { get; set; }
}

public skillItem[] skillTree = new skillItem[] {
    {
        Name = "skill1",
        Effect = skill1Func,
        Unlocked = false,
        PreReqs = new int[] { 1, 5 }
    },
    {
        Name = "skill2",
        Effect = skill2Func,
        Unlocked = false,
        PreReqs = new int[] { 20, 30 }
    }
}

相关问题