【问题标题】:How to access float output variables from other classes如何从其他类访问浮点输出变量
【发布时间】:2014-06-15 19:58:33
【问题描述】:

我有一个function,它将随机选择一个从 1 到 5 的数字,然后在该函数内部我有一个 if 语句,它将函数输出的数字分配给一个名为 randID 的变量(为了在我的游戏中随机选择一个区域)。

在另一个类中,我想检查zoneID 是否等于randID(我之前随机选择的那个),如果是,我想打印一条消息。

我会在一个类中执行此操作,但是我的游戏中有多个使用此类的对象,我需要主游戏操作符类来决定选择哪些区域。

想象一个总部游戏;这基本上就是我想要弄清楚的。现在大部分系统已经到位。 :)

提前感谢您提供的任何帮助或指导。

PS:我正在使用 C# 和 Unity3D 创建这个项目。

编辑:代码。

public static void DecideID() {
    if (gameLeft >= 1f && timeZone_Zone.zoneAlive == false) {
        float random = Random.Range(0f, 5f);
        print (random);
        if(random > 1f && random < 2f) {
            id = 1;
            print (id);
        } 
        else if(random > 2f && random < 3f) {
            id = 2;
            print (id);
        }
        else if(random > 3f && random < 4f) {
            id = 3;
            print (id);
        }
        else if(random > 4f && random < 5f) {
            id = 4;
            print (id);
        }
        else if(random >= 5f) {
            id = 5;
            print (id);
    }
}

print (id) 语句仅用于测试目的。

然后我想做这样的事情:

if (zoneID = randID) {
    GetComponent<MeshRenderer>().enabled = true;
}

【问题讨论】:

    标签: c# .net unity3d


    【解决方案1】:

    您想要的是在另一个脚本中访问组件的变量。将randID设为公开,然后您可以在另一个脚本中访问它。

    TypeWithRand randtype;
    
    ...
    
    void Start()
    {
        randtype = objWithRand.GetComponent<TypeWithRand>();
    }
    
    ...
    
    if (randtype.randID == zoneID)
    {
        ...
    }
    

    您必须将TypeWithRand 替换为包含randID 方法的类型。

    另一种方法是创建一个包含randID 的类的实例。然后您可以检查以下值:

    RandClass randClass;
    
    ...
    
    if (randClass.randID == zoneID)
    {
        //do stuff
    }
    

    这意味着您在RandClass 的构造函数中调用DecideID(我在下面固定的方式)。您也可以将函数保留为 void,然后在函数中设置 randID 的值,类似于设置 id 的方式。然后你会从类的实例中调用函数

    randClass.DecideID();
    
    if (randClass.randID == zoneID)
    {
        //do stuff
    }
    

    另外,您的 DecideID 函数在某些方面不正确。首先,Random.Range() 可以使用整数,而不需要多个 if 语句。

    id = Random.Range(0, 5);
    

    您也可以返回 id 的值,并在以后引用它,所以randID 的分配看起来像

    randID = DecideID();
    

    所以,你的实际函数应该是这样的:

    public int DecideID() {
        id = 0;
        if (gameLeft >= 1f && timeZone_Zone.zoneAlive == false) {
            id = Random.Range(0, 5);
        }
        return id;
    }
    

    public void DecideID() {
        if (gameLeft >= 1f && timeZone_Zone.zoneAlive == false) {
            randID = Random.Range(0, 5);
        }
    }
    

    【讨论】:

    • 我从我的脚本中复制了一小段摘录。我将如何实现这一点?另一个 c# 文件算作 GameObject 吗?
    • @JackMiller 游戏对象是场景中您附加了脚本的对象...您要替换的类型将是附加到其他游戏对象的脚本类型
    • 所以,如果我想获取 float 'id' 的值,然后在我的 zone 类中使用它,我该怎么做呢?类似 `Handler = GameObject.Find("GameHandler"); Handler.GetComponent(id);
    • @Jack 不,你会float rand = Handler.GetComponent&lt;nameOfClassattachedtoHandler&gt;().randID;
    • @outlaw-lemur 他的DecideID 功能丑陋且有缺陷。值得解释如何解决它,前提是您已决定回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多