2016-08-20 5 views
0

내 게임에 대한 상태 효과를 만들려고합니다. 예를 들어 시간 경과에 따른 플레이어 통계에 영향을 미치는 것들입니다. 그러나 전달 된 변수, 즉 수정해야하는 변수를 기억하는 데 문제가 있습니다. 10 초 동안 상태를 10 % 감소시키는 상태 효과가 있다고 가정 해 봅시다. 플레이어의 건강 상태에서 수정해야하는 변수와 함께 일부 매개 변수를 전달하는 새 클래스를 인스턴스화하는 것입니다.하지만 문제는 한 번 생성자가 사라지면 레퍼런스가 2 번에서 그 사이에 참조가 끊어지는 것입니다. 그런 다음 사용되지 않는 변수를 편집합니다. 여기값 유형 변수의 저장 참조 C#

내가이 상태 효과를

/// <summary> 
    /// Creates a status effect which ticks at specified period of time without any condition. 
    /// </summary> 
    public StatusEffect(float increase, EffectIncreaseType increaseType, float timeOfStatusEffect, float tickTime) 
    { 
     this.increase = increase; 
     this.endTimeOfStatusEffect = Time.time + timeOfStatusEffect; 
     this.tickTime = tickTime; 
     increaseCalculator = increaseType == EffectIncreaseType.Percentage ? increaseCalculator = (a) => (int)(increase/100f * a) : increaseCalculator = (a) => (int)increase; 
    } 

를 인스턴스화하는 방법 그리고 여기이 내가 우선 원하는가에 전달 될 수있는 필드가 필요 것이 아니다

public bool TryTrigger(ref int affectedProperty) 
    { 
     if (condition.Invoke(affectedProperty)) 
     { 
      affectedProperty += increaseCalculator.Invoke(affectedProperty); 
     } 
     return condition.Invoke(affectedProperty); 
    } 

지금 사용하는 방법 메소드 TryTrigger이 아닌 속성 중 두 번째는 시작시에 전달해야하는 모든 변수가 무엇인지 알 필요가 없다는 것입니다. 그런 다음 그 변수와 함께 작업하는 클래스를 후행 단계에서 트리거하려고 시도하십시오. 그게 가능하니? 상태 효과 (DoT, HoT)를 만들기위한 더 나은 접근법이 있습니까? 또한 예를 들어 인스턴트 상태 변경을 위해이 작업을하고 싶습니다. 예를 들어 1 분 동안 30 %의 건강을 줄이거 나 현재 설정이 잘되어 있는지 확실하지 않습니다.

+0

이것은 Unity 환경에서 완전히 잘못되었습니다. procs에 대해서만 사용하십시오 ... http://stackoverflow.com/a/36249404/294884 – Fattie

+0

그리고 Unity의 사소한 타이머의 경우에는'Invoke' 또는'InvokeRepeating'을 사용하면됩니다. – Fattie

답변

4

.NET에서 변수에 "ref"를 저장할 방법이 없습니다. 그것은 신중한 것입니다. C/C++에서 흔히 볼 수있는 버그 클래스를 제거합니다. C/C++에서는 수명이 다한 변수에 대한 참조를 저장하고 나쁜 일이 발생합니다.

원하는 것을 수행하는 방법 대신 변경하려는 변수 (또는 속성)를 설정하는 Action<T>을 전달한 다음 변경하려는 경우 해당 동작을 호출해야합니다.

어떻게 그런 식으로 문제를 해결할 수 있습니까? 왜냐하면 C#은 델리게이트가 캡쳐 한 변수가 항상 수명이 길기 때문입니다.

+0

방법은 현재 (내가 원하는대로 작동하는지 또는 문제가 고정되어 말하고있어 않는 해요) 나는 TryTrigger 함수를 적절한 변수를 전달하여 끊임없이 호출 할 수 있지만 단순히 테스트 및 정확한 변수를 알고 있어요 나중에 다른 클래스가이 변수에 약간의 변수를 전달하면 지저분 해지고 현재 설정이 작동하지 않을 것입니다. – Asimm

+0

하지만 에릭,이 클래스 밖에서 모든 물건을 계산해야하므로 이걸 제대로 전달할 수 있습니까? – Asimm

+0

@Asimm : 수업 내 모든 항목을 계산할 수 있으며 두 명의 대표 만 전달할 수 있습니다. setter와 getter는 아무것도하지 않고 객체의 속성을 가져 오거나 설정합니다. 예 :'Action setter = (newValue) => {a.Weight = newValue; }; –