2016-07-01 3 views
0

새로운 클래스 C#을 인스턴스화 할 수 없습니다 나는 클래스 AllStats는 다음과 같이 구현 재산 public AllStats BaseStats { get; set; }와 클래스를 가지고 내가하려고 할 때, 그러나내가 일치의 최신 버전을 사용하고

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

null 참조 예외가 발생합니다. 왜 그런가요? 이것은 일반적인 비주얼 스튜디오에서 사용되었지만 이전 버전의 유니티가 문제를 일으키는 것처럼 보입니다. 이 문제를 어떻게 해결할 수 있습니까? 여기

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

어디에서 _items를 초기화 했습니까? 그 이유는 그것 때문에 null 참조 예외를 줄 수 있습니다 –

+0

@ Mysterio11 필드 이니셜 라이저 –

+0

예외 stacktrace 무엇입니까? 무슨 선이 던지고 있니? 그게 우리가 (그리고 당신이) 알아야 할 것입니다. AllStats가 IEnumerable 양식을 상속 받기 때문에 예외가 모두 –

답변

1

, 내가 오해 할 수 있지만, 난 그냥 유니티에 대한 연결 또는 게임 엔진을 볼 수 없습니다.

예를 들어, "다양한 종류의 발사체"를 다루고 있다고 가정하면입니다. 승인? 다음은 ~ 3m 플레이어가있는 게임의 예입니다. 게임 엔진에서 수행 할 수있는 작업은 모두 GameObject입니다. 게임 엔진에는 아무것도 존재하지 않습니다.

"개체"가 없으며 "상속"이 없습니다. GameObject 이외의 다른 것은 없습니다. (GPU 칩에 통합 된 transfor tensors와 렌더링주기를 가지고 있기 때문에 게임 엔진입니다.)

"GameObject"이외의 Unity에는 절대적으로 아무 것도 없습니다. GameObject에 어떤 식 으로든 수정, 변경, 변경 또는 실제로 무엇이든 할 수는 없습니다. 화합은 심지어 은 희미하게 OO 또는 구조화되지 않습니다. 단결은 말하자면, 식탁처럼.

게임 엔진이 "인스턴스화"등의 개념을 가지고있는 "클래스"와 같은 개념을 가지고있는 프로그래밍과 전혀 관련이 없음을 잊지 마십시오. 게임 엔진에서 유일한 것은 GameObjects입니다. 이것은 실제적이고 구체적인 것입니다.

이 (당신은 그들이 "인스턴스"되어 있지만 완전히 요점 것 말할 수있다 - 만 싱글 게임 엔진있다, 당신은 "인스턴스화하지" 게임 오브젝트를 가질 수있는 개념있는 방법은 없습니다 그것은. Photoshop을 사용하고 있으며 페이지에 "색깔있는 선"을 넣었다 고 말하면 "오, 그게 입니다. 착색 된 선"이라고 말하면 안됩니다. 모든 포토샵은 색깔이있는 선입니다.)

어쨌든 ... 어딘가에 또는 다른 발사체의 ** 모델을 갖게 될 것입니다. 폭탄 , 총알, 화살 ... 당신은 아이디어를 얻는다).

나중에 게임을하는 동안 필요에 따라 복제하고 배치하여 기관총 작동 등을 만들 수 있습니다.

그래서 "클릭"하여 게임 개체를 만들고 화면에 앉아서 "폭탄"이라고 이름을 지정하십시오.

정상적으로 작업이 완료되었습니다. 술 취하고 예술적 인 누군가가 "렌더링 된 것"또는 "애니메이션"또는 "폭탄", "화살"등에 무엇이든 추가 할 것입니다.

당신의 상사 또는 창조적 인 지도자, 또는 누구든지, 같은 값을 설정할 수 있도록 다른 방법) "...

enter image description here

enter image description here

..... 그것은 다음과 같이 설정이 없다 손상 ","속도 요소 "등등.

{주. 유니티 - 현재 - "OO 언어"인 동작을 작성하기 위해 언어 C#를 사용합니다. 그것은 훌륭합니다. 물론 언어를 쓰려면 OO의 마스터가되어야합니다. Unity는 완전히 OO가 아닌 언어 (lisp 또는 무언가)를 사용하는 것으로 바뀔 수 있습니다. 언어가 현재 사용되는 언어 인이 OO 언어 일 수밖에 없다는 사실은 OO와의 연결이 전혀 없다는 사실과 전혀 관련이 없습니다. ECS 시스템입니다 ("Microsoft Word를 사용하는 것과 같습니다. ").)

당신이 제시하는 코드 조각에 관해서, 나는 그것이 Unity에서 어떻게 밀접한지를 볼 수 없습니다. 물론 재미있는 추상적 인 질문입니다 ("Unity가 현재 사용하고있는 net 버전에서 어떻게 작동합니까?"또는 무엇이든간에)하지만 예약이 먼 길은 시간 낭비처럼 보입니다 (귀하의 비즈니스, 물론)!

관련 문제