C# 检查脚本附加的每个游戏对象的变量值

C# 检查脚本附加的每个游戏对象的变量值,c#,unity3d,unityscript,gameobject,C#,Unity3d,Unityscript,Gameobject,我有一个名为“学生”的游戏对象,它附带了一个脚本,然后我手动复制它(ctrl+D),这样每个复制的学生对象都有相同的脚本组件。这是脚本(因为太长,所以不完整) 是否有一种简单的方法可以检查所有学生对象的m值,而不必使用if(stu1.m==5&&stu2.m==5),因为在每个级别中,学生的数量是不同的,所以我想为所有级别创建一个动态脚本我会使用列表并将所有学生脚本对象添加到其中。然后可以使用System.Linq的All方法检查列表中的所有元素 using System.Linq //Add

我有一个名为“学生”的游戏对象,它附带了一个脚本,然后我手动复制它(ctrl+D),这样每个复制的学生对象都有相同的脚本组件。这是脚本(因为太长,所以不完整)

是否有一种简单的方法可以检查所有学生对象的m值,而不必使用
if(stu1.m==5&&stu2.m==5)
,因为在每个级别中,学生的数量是不同的,所以我想为所有级别创建一个动态脚本

我会使用
列表
并将所有
学生脚本
对象添加到其中。然后可以使用
System.Linq
All
方法检查列表中的所有元素

using System.Linq

//Add all your StudentScript objects to this list
List<StudentScript> studentScripts = new List<StudentScript>();

if(studentScripts.All(x => x.m == 5))
{
    StartCoroutine (ChangeScene());
}

可以找到场景中特定类型的所有对象,然后使用Linq或类似工具对其进行过滤

StudentScript[] studentsInScene = Object.FindObjectsOfType<StudentScript>();

if (studentsInScene.All(student => student.m == 5))
{
    StartCoroutine(ChangeScene());
}
StudentScript[]studentsInScene=Object.FindObjectsOfType();
if(studentsInScene.All(student=>student.m==5))
{
Start例程(changeSecene());
}

FindObjectsOfType可能不如您自己管理的列表快(尽管可能如此),但如果这不是您的瓶颈(很可能不是),那么这几行代码更容易理解,因此更可取。

我正在编写您答案的第二部分,但您发布了它。我更喜欢这样,因为有些linq函数在iOS中不起作用,而有些能起作用的函数分配了大量内存。剩下的就是把问题的第二部分放到函数中。可能是一个名为
isGameOver
的布尔函数。这不是必需的,但它将使代码可重用。现在更新功能会有更少的代码。聪明,我不知道关于iOS。再次感谢你的知识哈哈。为了完整,我将把它粘贴到函数中!不过我觉得
所有的
都可以存储吗?我现在将对其进行分析并检查。@Eeva您必须使用System.Collections.Generic放置
也在脚本的顶部。@Eeva这个答案已经编辑过很多次了。我修正了一个愚蠢的错误,程序员也修正了。现在试试,它应该可以工作。@gjttt1我不知道
All
,但是
orderBy
和其他一些由于AOT而出现问题。无论如何,我通过将函数更改为bool,然后在游戏结束或未结束时返回,从而稍微修复了代码。强烈推荐您答案中的第二种方法。游戏引擎中的内存分配一点也不好,尤其是在可以避免的情况下。还优化了功能。
using System.Linq

//Add all your StudentScript objects to this list
List<StudentScript> studentScripts = new List<StudentScript>();

if(studentScripts.All(x => x.m == 5))
{
    StartCoroutine (ChangeScene());
}
private bool isGameOver()
{
    bool gameOver = true;

    for(int i = 0; i < studentScripts.Count; i++)
    {
        if (studentScripts[i].m != 5) 
        {
            gameOver = false;
            break;
        }
    }

  return gameOver;
}

void Update()
{
    if (isGameOver()) {
    StartCoroutine (ChangeScene());
    }
}
StudentScript[] studentsInScene = Object.FindObjectsOfType<StudentScript>();

if (studentsInScene.All(student => student.m == 5))
{
    StartCoroutine(ChangeScene());
}