Создание сопрограммы для слушателей - PullRequest
0 голосов
/ 31 мая 2018

Мой основной сценарий сортирует набор шаров 1 к 1, я вызываю этот сценарий так, что когда я нажимаю на эту кнопку , он вызывает кнопку сортировки и сортирует 1 на 1, ожидая в примере1-2 секунды между каждым обменом.Но когда я нажимаю кнопку, предназначенную для немедленной автоматической сортировки, то здесь Coroutine не делает то, что предполагает.

Это несортированный набор шаров. Здесь Есть ли способ исправить это?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;


namespace Assets
{
    public class Trigger : MonoBehaviour
    {
        public Gameobjects _Gameobjects; 
        public Button e_YourButton;
        public void Start()
        {
            Button btn = e_YourButton.GetComponent<Button>();
            for (int k = 0; k < 4; k++)
            {
                btn.onClick.AddListener(_Gameobjects.TaskOnClick);
                btn.onClick.AddListener(() => { _Gameobjects.Click1(); });
                StartCoroutine(Example());    
            }
        }   

        IEnumerator Example()
        {

           yield return new WaitForSeconds(1);
        }
    }
}

Основной скрипт;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;


namespace Assets
{
    public class Gameobjects : MonoBehaviour
    {
        public Button s_YourButton;
        [SerializeField]

        public GameObject[] Balls = new GameObject[5];

        public bool Click = false;

        private static int i = 0;
        private int j = i + 1;
        private int increasebyclick = 1;

        private Vector3 posA = Vector3.zero; //Vector3.zero is for initialization
        private Vector3 posB = Vector3.zero; //Vector3.zero is for initialization


        public GameObject[] instantiatedObjects= new GameObject[5];

        void Start()
        {
            Button btn = s_YourButton.GetComponent<Button>();
            //Calls the TaskOnClick method when you click the Button
            btn.onClick.AddListener(TaskOnClick);
            btn.onClick.AddListener(() => { Click1(); });
            Balls[0] = GameObject.Find("5");
            Balls[1] = GameObject.Find("3");
            Balls[2] = GameObject.Find("2");
            Balls[3] = GameObject.Find("4");
            Balls[4] = GameObject.Find("1");
        }


        public void TaskOnClick()
        {

            performInsertionSort(Balls);



        }
        public void Click1()
        {
            i += increasebyclick;
            print(i);
            if (i >= 4)
            {
                i = 0;            }
        }


        private void performInsertionSort(GameObject[] Balls)
        {
            {



                        if (string.Compare(Balls[i].name, Balls[i+1].name) > 0)
                        {
                            GameObject temp = Balls[i];
                            Balls[i] = Balls[i+1];
                            Balls[i+1] = temp;

                            posA = Balls[i].gameObject.transform.position;
                            posB = Balls[i + 1].gameObject.transform.position;
                            Balls[i].gameObject.transform.position = posB;
                            Balls[i + 1].gameObject.transform.position = posA;


                            }
                }
            }       
        }
    }

1 Ответ

0 голосов
/ 31 мая 2018

Ваш второй скрипт (Gameobjects довольно плохое название) должен выглядеть примерно так:

// Don't start another sort while the current isn't finished
// Or: stop the current one with StopAllCoroutines()
bool isSorting = false;

public void TaskOnClick()
{
    if(isSorting == false)
    {
        isSorting = true;
        StartCoroutine(PerformInsertionSort());
    }
}

private IEnumerator PerformInsertionSort()
{
    for(int i = 0; i < Balls.Length - 1; i++)
    {      
        if (string.Compare(Balls[i].name, Balls[i+1].name) > 0)                   
        {
            GameObject temp = Balls[i];
            Balls[i] = Balls[i+1];
            Balls[i+1] = temp;

            posA = Balls[i].gameObject.transform.position;
            posB = Balls[i + 1].gameObject.transform.position;
            Balls[i].gameObject.transform.position = posB;
            Balls[i + 1].gameObject.transform.position = posA;

            // If you want to wait only after a switch actually happend,
            // wait here.
        }

        // This is where you need to wait:
        yield return new WaitForSeconds(1f);
    }

    isSorting = false;
}

Массив, который вы сортируете, является членом скрипта, поэтому передаёт его функции внутри скриптакак параметр не имеет смысла.

...