无法实例化新的 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..." 或其他),但距离预订还有很长的路要走,似乎是在浪费时间(当然是你的事!)
我正在使用最新版本的 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..." 或其他),但距离预订还有很长的路要走,似乎是在浪费时间(当然是你的事!)