检查脚本附加的每个游戏对象的变量值
Check value of a variable from every gameobject that attached by a script
我有一个名为 "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");
}
}
i want => 如果每个学生的 m 值 m == 5,则游戏结束。到目前为止我所做的是从 GameManage 脚本中调用 StudentScript(public,所以我必须手动设置所有实例),然后检查每个学生的 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 值,因为在每个级别中,学生的数量都不同,所以我想为所有级别制作一个动态脚本
我会使用 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());
}
}
您可以找到场景中所有某种类型的对象,然后使用Linq或类似工具对其进行过滤。
StudentScript[] studentsInScene = Object.FindObjectsOfType<StudentScript>();
if (studentsInScene.All(student => student.m == 5))
{
StartCoroutine(ChangeScene());
}
FindObjectsOfType 可能不如您自己管理的 List 快(尽管它可能是),但如果这不是您的瓶颈(很可能不是),那么这几行代码是更容易理解,因此更受欢迎。
我有一个名为 "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");
}
}
i want => 如果每个学生的 m 值 m == 5,则游戏结束。到目前为止我所做的是从 GameManage 脚本中调用 StudentScript(public,所以我必须手动设置所有实例),然后检查每个学生的 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 值,因为在每个级别中,学生的数量都不同,所以我想为所有级别制作一个动态脚本
我会使用 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());
}
}
您可以找到场景中所有某种类型的对象,然后使用Linq或类似工具对其进行过滤。
StudentScript[] studentsInScene = Object.FindObjectsOfType<StudentScript>();
if (studentsInScene.All(student => student.m == 5))
{
StartCoroutine(ChangeScene());
}
FindObjectsOfType 可能不如您自己管理的 List 快(尽管它可能是),但如果这不是您的瓶颈(很可能不是),那么这几行代码是更容易理解,因此更受欢迎。