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

问题描述 投票:0回答:2

我有一个名为“学生”的游戏对象,它附加了一个脚本,然后我手动复制它(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");
    }
}

我想要 => 如果每个学生的 m 值 m == 5,那么游戏就结束了。到目前为止我所做的称为

StudentScript
脚本中的
GameManage
(公共,所以我必须手动设置所有实例),然后检查每个学生的 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);
}

有没有一种简单的方法来检查所有学生对象的 m 值而不使用

if (stu1.m == 5 && stu2.m == 5)
因为在每个级别,学生的数量都不同,所以我想为所有级别制作一个动态脚本

c# unity-game-engine gameobject
2个回答
4
投票

我会使用

List<>
并将所有
StudentScript
对象添加到其中。然后你可以使用
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());
}

这样您就可以使用

StudentScripts.Add()
添加脚本,它可以是任意大小,并且所有元素仍将被检查。
x => x.m == 5
部分称为 lambda 表达式(以防万一您不知道)。它并不像看起来那么诡异。

如果您不想使用

Linq
和 lambda,那么您可以迭代列表并更新变量。您可以将
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
投票

您可以找到场景中某种类型的所有对象,然后使用 Linq 或类似工具过滤它们。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.