2016-08-18 99 views
1

注意:对于模糊标题感到抱歉,我真的不知道如何命名它,主要是因为我不知道它是什么类型的问题。有没有办法让这个班里有随机值?

编辑:我知道我可以通过简单地使用一个结构体并重写一些操作符来完成它,但是这样做的重点在于使它尽可能地接近实际的float,在使用和功能上都是如此,在内存中访问它会变得更难,如果不可能,我可以处理它。

我想创建一个安全的值类型,它简单地抵消了真实值,我需要这样做,我至少可以部分地保护它们免受人们简单地使用作弊引擎或其他任何东西,并将其更改为任何他们想要的,是否有方法来获得一个随机数字,它不会导致值溢出,每当它被抵消?

这里是我的代码:

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你完全正确,但这是另一个问题。无论如何随意编辑。 –