无法实例化新的 class C#

Can't instantiate new class C#

我正在使用最新版本的 unity,我有一个 class 和 属性 public AllStats BaseStats { get; set; },其中 class AllStats 是这样实现的:

public class AllStats : IEnumerable<Stats>
{
    private MagicPower magicPower;
    public MagicPower MagicPower
    {
        get { return magicPower; }
        set
        {
            magicPower = value;
            Add("Magic Power", magicPower);
        }
    }

    private DebuffDuration debuffDuration;
    public DebuffDuration DebuffDuration
    {
        get { return debuffDuration; }
        set
        {
            debuffDuration = value;
            Add("Debuff Duration", debuffDuration);
        }
    }

    private Defense defense;
    public Defense Defense
    {
        get { return defense; }
        set
        {
            defense = value;
            Add("Defense", defense);
        }
    }

    private MagicDefense magicDefense;
    public MagicDefense MagicDefense
    {
        get { return magicDefense; }
        set
        {
            magicDefense = value;
            Add("Magic Defense", magicDefense);
        }
    }

    private CriticalPower criticalPower;
    public CriticalPower CriticalPower
    {
        get { return criticalPower; }
        set
        {
            criticalPower = value;
            Add("Critical Power", criticalPower);
        }
    }

    private CriticalChance criticalChance;
    public CriticalChance CriticalChance
    {
        get { return criticalChance; }
        set
        {
            criticalChance = value;
            Add("Critical Chance", criticalChance);
        }
    }

    private Multistrike multistrike;
    public Multistrike Multistrike
    {
        get { return multistrike; }
        set
        {
            multistrike = value;
            Add("Multistrike", multistrike);
        }
    }

    private CooldownReduction cooldownReduction;
    public CooldownReduction CooldownReduction
    {
        get { return cooldownReduction; }
        set
        {
            cooldownReduction = value;
            Add("Cooldown Reduction", cooldownReduction);
        }
    }

    private Evasion evasion;
    public Evasion Evasion
    {
        get { return evasion; }
        set
        {
            evasion = value;
            Add("Evasion", evasion);
        }
    }

    private Resistance resistance;
    public Resistance Resistance
    {
        get { return resistance; }
        set
        {
            resistance = value;
            Add("Resistance", resistance);
        }
    }

    private readonly Dictionary<string, Stats> _items = new Dictionary<string, Stats>();

    public void Add(string element, Stats config)
    {
        _items[element] = config;
    }

    public Stats this[string element]
    {
        get { return _items.ContainsKey(element) ? _items[element] : null; }

        set { _items[element] = value; }
    }

    public IEnumerator<Stats> GetEnumerator()
    {
        return _items.Values.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _items.Values.GetEnumerator();
    }
}

但是,当我尝试像这样创建这个 class 的新实例时:

BaseStats = new AllStats()
        {
            MagicPower = new MagicPower(Level.CurrentLevel),
            DebuffDuration = new DebuffDuration(Level.CurrentLevel),
            Defense = new Defense(Level.CurrentLevel),
            MagicDefense = new MagicDefense(Level.CurrentLevel),
            CriticalPower = new CriticalPower(1),
            CriticalChance = new CriticalChance(1),
            Multistrike = new Multistrike(1),
            CooldownReduction = new CooldownReduction(1),
            Evasion = new Evasion(1),
            Resistance = new Resistance(1)
        };

我得到空引用异常。这是为什么 ?这曾经在正常 visual studio 中工作,但似乎旧版本的 unity 导致了一些问题。我该如何解决这个问题?

这里是 Stats Class :

    public enum StatsOrders
{
    MagicPower,
    DebuffDuration,
    Defense,
    MagicDefense,
    CriticalPower,
    CriticalChance,
    Multistrike,
    CooldownReduction,
    Evasion,
    Resistance
}

public abstract class Stats : IStats
{
    public double PointsInStats { get; set; }

    public bool IsSuccessfulHit(double baseStats)
    {
        return Increase(baseStats)*10 >= new RngCrypto().Next(1, 1001);
    }

    public double Increase(double baseInput)
    {
        return CalculateIncreament(baseInput, PointsInStats);
    }

    protected abstract double percentageIncrease { get; set; }

    protected Stats(double pointsInStats)
    {
        PointsInStats = pointsInStats;
    }

    protected double CalculateIncreament(double baseInput, double pointsInStats)
    {
        string a = (baseInput * (pointsInStats / percentageIncrease)).ToString("N1");
        return double.Parse(a);
    }
}

每当您升级时都会使用枚举,您会收到一小段 window 通知,其中包括更新的统计信息,此枚举有助于保持它们的有序性。

还有IStats接口:

public interface IStats
{
    double PointsInStats { get; set; }
    bool IsSuccessfulHit(double baseStats);
    double Increase(double input);
}

你在做什么,我可能会误解,但我看不出与 Unity 或游戏引擎有任何联系。

假设您正在处理,例如,"different varieties of projectile"。好的?这是一个拥有约 300 万玩家的游戏示例。您在游戏引擎中所能做的就是拥有 GameObject。游戏引擎中没有任何其他东西。

没有 "objects",没有 "inheritance" - 除了 GameObject,什么都没有。 (它带有集成到GPU芯片的transfor张量和渲染周期,因此它是一个游戏引擎。)

Unity 中除了 "GameObject" 什么都没有。请注意,您根本不能以任何方式修改、更改、改变或确实对 GameObject 做任何事情。 Unity 甚至 含糊不清 面向对象或结构化。 Unity 就像我的厨房一样面向对象 table。

也不要忘记,游戏引擎与编程完全没有联系,在编程中您有诸如 "classes" 之类的概念,可能是也可能不是 "instantiated" 等等。游戏引擎中唯一的东西就是一大堆 GameObjects - 这些都是实际的、特定的东西。

(您可以说它们是 "instantiated",但这完全没有抓住要点 - 游戏引擎中 只有单例 ,没有概念上的方法可以有一个"not instantiated"游戏对象。说出来也没意义。假设你用的是Photoshop,你在页面上放了"a colored line"。你不会不要说 "oh, that's an instantiated colored line" - 它只是..图像中的彩色线条之一。photoshop 就是彩色线条。)

无论如何......在某个地方或其他地方你将拥有每个射弹的**模型”,假设有 7 个(炸弹,子弹,箭......你明白了)。

稍后您将在游戏过程中根据需要复制并放置它们(使机枪工作 - 或其他)。

所以你去 "click" 制作一个游戏对象,也许将它放在屏幕外,然后将其命名为 "Bomb"。

好的,你的工作完成了。其他人,而不是你,醉酒和艺术的人会出现并在 "bomb"、"arrow" 等中添加诸如 "a rendered" 或 "an animation" 之类的东西

你会(没有其他办法)像这样设置它......

...这样你的老板或创意总监,或任何人,都可以设置 "damage"、"speed factor" 等值。

{注意。 Unity——目前——碰巧使用一种语言,c#,来编写行为,这是一种 "OO language"。这很好,当然,您必须精通 OO 才能编写该语言。 Unity 很可能会改用完全非面向对象的语言(lisp 或其他语言)。目前用于编写行为的语言恰好是一种OO语言,这一事实与unity与OO完全无关的事实完全无关,它是一种ECS系统 ("It's like using Microsoft Word").}

因此,关于您提供的代码片段,我看不出它与 Unity 有何密切关系。当然,这是一个有趣的抽象问题("how does this work in the version of net which Unity happens to be currently using..." 或其他),但距离预订还有很长的路要走,似乎是在浪费时间(当然是你的事!)