2017-05-13 10 views
0

私はUnityで基本的なゲームを開発していて、ボールが動いている(動きが実質的にゼロである)ときに検出するコードを書こうとしています。私は、位置変更されたイベントハンドラ内のいくつかのフレームにわたるボールの位置の違いをサンプリングし、eventargsを通る2つの動きの差を通ってこれを達成することを望んでいました。C#でラムダイベントハンドラの非静的フィールドを参照する

私は場所のアレイにアクセスしようとするたびしかし、私はこのエラーを取得する:A field initializer cannot reference the non-static field, method, or property 'Ball.locations'

私は、イベントハンドラに、むしろ新たなんだとして具体的には、発生していると明らかに下のラムダをコピーしたものにのように少し混乱しています(正確にそれが何をしているのかを実際に理解することなく)ここで

は、関連するコードです:私の記事を読むために時間を割いて

public class Ball : IBall { 
    private float[] locations = new float[5]; 

    public Ball() { 

    } 

    public Vector3 Position { 
     get { return position; } 
     set { 
      if (position != value) { 
       BallMovedEventArgs eventArgs = new BallMovedEventArgs (position, value); 
       position = value; 
       OnMove (this, eventArgs); 
      } 
     } 
    } 

    public event EventHandler<BallMovedEventArgs> OnMove = (sender, e) => { 
     // error is thrown here 
     if(locations.Length > 5) { 
      Debug.Log("Too many location deltas!"); 
     } 
    }; 
} 

おかげで、ここで何が起こっているかを理解する上で任意のヘルプははるかに高く評価されます!

答えて

0

See this error description. EventHandlerではlocations.lengthを使用できません。このイベントハンドラとlocations配列の両方を '同じ時間に定義しています。これは、文が必要ない場合は、このように思えます。 5の長さは一定です。

+1

私はその質問を読んだが、わかりませんでしたが、私はちょうど最善の答えの一番下にあるMSDNのリンクを見て、私は今それを理解していると信じています。私のコードでは、 'OnPositionChanged'は関数ではなく、' locations'のような変数です。なぜなら、同じ時刻に宣言されているからです。 – James

+1

また、あなたがそれを指摘したので、比較は完全に無意味です。 – James

+0

はい、はいです。おそらく、次の場所を挿入する場所を追跡する 'index'のようなものが必要でしょう。 'index'が' locations'> = 5のサイズを超えている場合は、エラーをログに記録します – bgura

関連する問題