无法实例化新的C类#

时间:2016-07-01 11:39:43

标签: c# class unity3d instance

我使用的是最新版本的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);
}

1 个答案:

答案 0 :(得分:1)

你在做什么,我可能会误解,但我看不到任何与Unity或游戏引擎的连接。

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

没有“对象”,没有“继承” - 除了 GameObject 之外,根本没有任何东西。 (它带有转换张量,集成到GPU芯片和渲染周期,因此它是一个游戏引擎。)

除了“GameObject”之外,Unity中绝对没有任何内容。请注意,您不能以任何方式修改,更改,更改或确实对GameObject执行任何操作。 Unity甚至不是模糊 OO或结构化。 Unity就像我的厨房桌子一样OO。

不要忘记,游戏引擎与编程完全没有联系,你可能会有“类”这样的概念,可能会或可能不会“实例化”等等。游戏引擎中唯一的东西是 GameObjects - 这些都是实际的,特定的东西。

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

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

稍后您将在游戏过程中根据需要复制并放置这些(以使机枪工作 - 或其他任何方式)。

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

好的,所以你的工作已经完成。其他人,不是你,醉酒和艺术的人会来,并添加诸如“渲染”或“动画”之类的东西或“炸弹”,“箭头”等等。

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

enter image description here

enter image description here

...以便您的老板或创意总监或任何人可以设置“损坏”,“速度因素”等值。

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

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