有没有办法让随机值进入这个类?

时间:2016-08-18 07:42:04

标签: c# unity3d

注意:对于模糊的标题抱歉,我真的不知道如何命名,主要是因为我不知道它是什么类型的问题。

编辑:我知道我可以通过简单地使用结构并覆盖一些运算符来实现它,但是这一点的全部意义在于它在使用和功能上尽可能接近实际的浮点数,除非它会是更难以在内存中访问并更改它,如果不可能,我可以处理它。

我正在尝试创建一个安全值类型,它简单地抵消了真正的价值,我需要这样,所以我至少可以部分地保护他们免受人们使用Cheat引擎或其他任何东西并将其改为他们想要的任何东西,有没有办法得到一个随机数,只要它被偏移就不会导致值溢出?

这是我的代码:

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)

因为Unity建议使用Awake()或Start()这不是一个选项,因为这只是一个"帮助"上课,不是我会在游戏中放置一个物体的东西,我能做些什么吗?

问题与主题不太相关:我从未尝试过不同的代码,所以我甚至不知道它是否有效,如果我的逻辑存在缺陷,请指点他们出去了吗?

1 个答案:

答案 0 :(得分:1)

尝试这个(实际上我测试了它,并且它有效)。

这种方法的原因是您尝试在构造函数中初始化偏移量。要解决此问题,请使用此功能。

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;
    }
}