Проверьте значение переменной из каждого игрового объекта, который прикреплен скриптом
У меня есть игровой объект с именем "student", к которому прикреплен сценарий, затем я дублирую его вручную (ctrl+D), чтобы у каждого дублированного объекта Student был один и тот же компонент сценария. вот сценарий (не полный, потому что слишком длинный)
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 == 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)
потому что на каждом уровне количество студентов отличается, поэтому я хочу сделать динамический сценарий для всех уровней
2 ответа
Я бы использовал List<>
и добавь все свои StudentScript
возражает против этого. Тогда вы могли бы использовать System.Linq
"s 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
часть называется лямбда-выражением (только если вы не знали). Это не так страшно, как кажется.
Если вы не хотите использовать Linq
и лямбды, тогда вы можете просто перебрать список и обновить переменную. Вы могли бы заменить 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, которым вы управляете сами (хотя это может быть), но если это не ваше узкое место (а это, скорее всего, нет), то эти несколько строк кода гораздо проще для понимания и таким образом, предпочтительнее.