【问题标题】:Can't instantiate new class C# [duplicate]无法实例化新类 C# [重复]
【发布时间】:2016-07-02 20:57:15
【问题描述】:

我正在使用最新版本的 unity,并且我有一个属性为 public AllStats BaseStats { get; set; } 的类,其中 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();
    }
}

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

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)
        };

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

这是Stats 类:

    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);
    }
}

当您升级时会使用该枚举,您会收到一个包含更新统计信息的小通知窗口,此枚举有助于保持它们的顺序。

还有IStats 接口:

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

【问题讨论】:

  • 你在哪里初始化了_items?我认为因为它可能会给出一个空引用异常
  • @Mysterio11 在字段初始化器中
  • 因为 AllStats 继承了 IEnumerable 形式,请尝试替换为 AllStats : Stats
  • 所有关于游戏到底是什么的问题/cmets都无关紧要,请专注于实际问题,因为评论线程变得非常嘈杂。
  • 除非大体上我们知道游戏中到底发生了什么,否则不可能知道问题可能出在哪里。不管怎样,我现在要走了,再见!

标签: c# class unity3d instance


【解决方案1】:

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

假设您正在处理,例如,“不同种类的射弹”。好?这是一个拥有约 300 万玩家的游戏示例。您在游戏引擎中所能做的就是拥有GameObject。游戏引擎中没有其他任何东西。

没有“对象”,没有“继承”——除了GameObject,什么都没有。 (它携带集成到 GPU 芯片的转换张量和渲染周期,因此它是一个游戏引擎。)

除了“GameObject”之外,Unity 中绝对没有任何东西。请注意,您根本无法以任何方式修改、更改、更改或确实对 GameObject 进行任何操作。 Unity 甚至不是模糊地 OO 或结构化。 Unity 就像我的餐桌一样面向对象。

也不要忘记,游戏引擎与编程完全没有联系,因为您有诸如“类”之类的概念,这些概念可能会或可能不会被“实例化”等等。游戏引擎中唯一的东西就是一大堆GameObjects——它们是实际的、具体的东西。

(您可以说它们是“实例化的”,但这完全没有抓住重点 - 游戏引擎中只有单例,没有概念上的方法可以让 “不实例化” GameObject。说它甚至没有意义。假设您正在使用 Photoshop,并在页面上放置“一条彩色线”。您不会说“哦,那是一个 实例化彩色线” - 它只是.. 图像中的一条彩色线。所有的 Photoshop 都是彩色线。)

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

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

所以你去“点击”并制作一个游戏对象,也许把它放在屏幕外,然后你把它命名为“炸弹”。

好的,你的工作就完成了。其他人,不是你,醉酒和艺术的人会出现并添加诸如“渲染”或“动画”之类的东西到“炸弹”、“箭头”等。

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

...这样你的老板或创意总监,或任何人,都可以设置“伤害”、“速度因素”等值。

{注意。 Unity - 目前 - 碰巧使用一种语言 c# 来编写行为,这是一种“OO 语言”。那太好了,当然,你必须是 OO 的大师,才能编写那种语言。 Unity 很可能会改为使用完全非面向对象的语言(lisp 或其他语言)。 目前用于编写行为的语言恰好是一种 OO 语言这一事实​​与 Unity 与 OO 完全没有联系的事实完全没有关系,它是一个 ECS 系统(“这就像使用 Microsoft Word")。}

所以,关于您提供的代码片段,我看不出它与 Unity 有什么密切关系。当然,这是一个有趣的抽象问题(“这在 Unity 当前正在使用的网络版本中是如何工作的......”或其他什么)但它距离预订还有很长的路要走,似乎浪费时间(你的业务,当然!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2012-12-19
    • 2020-09-11
    • 2016-12-06
    相关资源
    最近更新 更多