2016-08-18 12 views
1

注:あいまいなタイトルで申し訳ありませんが、主な理由はわかりません。このクラスにランダムな値を取得する方法はありますか?

編集:私は単純に構造体を使用していくつかの演算子をオーバーライドすることでそれを行うことができることを知っていますが、実際のフロートに可能な限り近づけていますそれがメモリでアクセスして変更するのがもっと難しくなります。可能でないなら、私はそれに対処できます。

私は実際の値を単にオフセットする安全な値の型を作成しようとしています。私はそれを必要とします。ちょうどチートエンジンや他のものを使っている人々から少なくとも部分的に保護することができます。それがオフセットされたときに値がオーバーフローすることのない乱数を得る方法?ここで

は私のコードです:

明らか
public class safeFloat { 
    private float val; 
    //private int offset = Random.Range(-1000, 1000); 

    public float Val 
    { 
     get 
     { 
      return val; //- offset; 
     } 
     set 
     { 
      val = value; //+ offset; 
     } 
    } 

    public static implicit operator safeFloat(float value) 
    { 
     return new safeFloat(){Val = value}; 
    } 

    public static implicit operator float(safeFloat x) 
    { 
     return x.Val; 
    } 
} 

それは何もしない現時点では、動作しないコードの部分がコメントアウトされている、私は単にそのようにそれを行うことができないことは思いもしませんでした。これは私がsafeFloatを作成して、何がコメントアウトされていない場合、それにいくつかの値を代入しようとした場合、私はなるだろうエラーです:

ArgumentException: RandomRangeInt can only be called from the main thread. Constructors and field initializers will be executed from the loading thread when loading a scene. Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function. UnityEngine.Random.Range (Int32 min, Int32 max) 

団結はオプションではありませんアウェイク()または[スタート]()を使用することを提案しているので、これは単なる「ヘルパー」クラスなので、ゲームでオブジェクトを置くのではなく、何かできますか?

質問は別の方法でコードを試したことはありませんので、私はそれがうまくいくかどうかわかりません。ロジックに欠陥がある場合は、それらを指摘してもらえますか?

答えて

0

これを試してみてください(実際にテストしています)。

このアプローチの理由は、コンストラクタでオフセットを初期化しようとしたためです。これを修正するにはこれを使用してください。

public class safeFloat 
{ 
    private float val; 
    private int offset; 

    private bool offsetSet = false; 

    public float Val 
    { 
     get 
     { 
      if(!offsetSet) 
       offset = Random.Range(-1000, 1000);     
      offsetSet = true; 

      return val - offset; 
     } 
     set 
     { 
      if(!offsetSet) 
       offset = Random.Range(-1000, 1000);     
      offsetSet = true; 

      val = value + offset; 
     } 
    } 

    public static implicit operator safeFloat(float value) 
    { 
     return new safeFloat(){Val = value}; 
    } 

    public static implicit operator float(safeFloat x) 
    { 
     return x.Val; 
    } 
} 
+0

算術オーバーフローを防ぐために、オフセットを加算/減算した行を 'unchecked'節に囲んでいます。 –

+0

それはたくさんの意味があります、ありがとう! 編集:一部の場所でオフセットのスペルが間違っているため、コードを編集しました。 –

+0

@BernhardHillerあなたは完全に正しいですが、これは問題の他の問題です。とにかく自由に編集できます。 –

関連する問題