2016-08-20 19 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あなたが最初にそれを渡す必要がある変数が何であるかを知っていないはずのプロパティの第2のプロパティではなく、その後ろの変数でクラスそのものを操作してトリガを試みます。それは可能ですか?ステータスエフェクト(DoT、HoT)を作成するためのより良いアプローチはありますか?また、私は即座のステータス変更のためにこの仕事をしたいと思います。例えば、あなたの健康を1分間30%低下させますが、現在の設定がそれに適しているかどうかはわかりません。

+0

これは、Unity環境、Asimmでは全く間違っています。 procsのためにちょうどこれを使用する... http://stackoverflow.com/a/36249404/294884 – Fattie

+0

そしてUnityの簡単なタイマーのためにあなたはちょうど 'Invoke'か' InvokeRepeating'を使用します。 – Fattie

答えて

4

.NETに変数に "ref"を格納する方法はありません。それは慎重だ。これは、C/C++で一般的なバグのクラスを排除します。このクラスでは、変数への参照をその生涯にわたって保存し、悪いことが起こります。

代わりに、変更する変数(またはプロパティ)を設定するAction<T>を渡してから、変更する場合はそのアクションを呼び出します。

どのように問題が解決しますか? C#では、デリゲートによってキャプチャされた変数が常に長命であることが保証されるためです。

+0

現在のところ(私はそれが欲しい、または問題が修正されているように働いていると言っているわけではありません)私は常に適切な変数を渡すTryTrigger関数を呼び出しますが、私は単純にテストしています。私は後で別のクラスがいくつかの変数を渡すときにそれが乱雑になり、私の現在の設定はうまく動作しなくなるでしょう。 – Asimm

+0

しかし、エリック、つまり私はこのクラスの外にあるものすべてを計算しなければならないということです。 – Asimm

+0

@Asimm:あなたはクラス内のすべてのものを計算し、2人の代理人を渡すことができます。あなたのオブジェクトのプロパティを取得または設定する以外に何もしないセッターおよびゲッター。 例: 'Action setter =(newValue)=> {a.Weight = newValue; }; ' –