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

时间:2016-05-21 23:08:26

标签: c# unity3d unityscript gameobject

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

public class StudentScript : MonoBehaviour {

private Animator animator;
float sec;
public int m;
public GameManage gm;

void Start () {
    animator = GetComponent<Animator> ();
    sec = 0f;
    m = 0;
}

void Update () {
    sec+=Time.deltaTime;
    if (m == 5 && animator.GetInteger ("Behav") == 0) {
        animator.SetTrigger ("Finish");
    }
}

//this is called from another script
public void ResetStudentBehaviour(){
    if (animator.GetInteger ("Behav") != 0) {
        animator.SetInteger ("Behav", 0);
        sec = 0f;
        if (m < 5) {
            m++;
        }
    }else
        Debug.Log ("student done <3");
}
}

我想要=&gt;如果每个学生的m值m == 5,则游戏结束。我到目前为止所做的是从GameManage脚本中调用StudentScript(公共,所以我必须手动设置所有实例),然后检查每个学生的m值

public StudentScript stu1, stu2;
void Update () {
    if (stu1.m == 5 && stu2.m == 5) {
        StartCoroutine (ChangeScene());
    }
}
IEnumerator ChangeScene(){
    yield return new WaitForSeconds (10);
    SceneManager.LoadScene(5);
}

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

2 个答案:

答案 0 :(得分:4)

我会使用List<>并将所有StudentScript个对象添加到其中。然后,您可以使用System.Linq&#39; 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());
}

通过这种方式,您可以使用StudentScripts.Add()添加脚本,它可以是任意大小,但仍会检查所有元素。 x => x.m == 5部分称为lambda表达式(只是你不知道)。它并不像它看起来那么怪异。

如果您不想使用Linq和lambdas,那么您可以迭代列表并更新变量。您可以将if语句替换为:

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

答案 1 :(得分:1)

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

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

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

FindObjectsOfType可能不如你自己管理的List那么快(虽然它可能是),但如果这不是你的瓶颈(它很可能不是),那么这几行代码就简单得多了了解并因此更喜欢。