[Unity] Как запустить случайную иконку с помощью переключателя? - PullRequest
0 голосов
/ 29 апреля 2019

В настоящее время я пытаюсь сделать так, чтобы случайный значок всплывал как механик, у клиента был случайный заказ пиццы.

Я пытаюсь создать механику случайного отображения, где у каждого покупателя есть случайный заказ со случаем переключателя, и он будет отображаться так же, как и порядок, выбранный из случая переключателя.

Я поместил значок заказа в виде массива игрового объекта размером 3. Поэтому, когда они остановятся, он активирует игровой объект над их головой.

Вот как выглядит код:

private void OnCollisionStay2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("OrderingPoint")) 
    {
        int rand = Random.Range(0, 3);            
        switch (rand)
        {
            case 0:

                OrderPicture[0].SetActive(true);
                if (rand == 0 && collision.gameObject.name == "Rendang")
                {
                    OrderPicture[0].SetActive(false);
                    GetRendang();
                }               
                //RecipeObject.Artwork.SetActive(false);
                break;
            case 1:

                //CuisineObject.Artwork.SetActive(true);
                OrderPicture[1].SetActive(true);
                if (rand == 1 && collision.gameObject.name == "Gado Gado")
                {
                    OrderPicture[1].SetActive(false);
                    GetGadoGado();
                }

                //RecipeObject.Artwork.SetActive(false);
                break;
            case 2:

                OrderPicture[2].SetActive(true);
                if (rand == 2 && collision.gameObject.name == "Soto")
                {
                    OrderPicture[2].SetActive(false);
                    GetSoto();
                }

                //CuisineObject.Artwork.SetActive(false);
                break;
        }
    }      
}

Я ожидал, что это активирует игровой объект изображения, но не будет.так что я пропустил?

1 Ответ

0 голосов
/ 29 апреля 2019

Прежде всего OnCollisionStay называется каждый кадр , поэтому в настоящее время вы генерируете и выполняете новый случайный индекс для каждого кадра.

Возможно, вам лучше использовать OnCollisionEnter2D, который вызывается только во фрейме, в котором происходит столкновение.


Чем есть много вещей, которые можно просто найти, не используя switch-case вообще, так как ваши проверки дляif(rand == XY) являются избыточными, а также жестко закодированные индексы для OrderPicture[XY].SetActive(true); уже охвачены значением rand:

private void OnCollisionEnter2D(Collision2D collision)
{
    if(!collision.gameObject.CompareTag("OrderingPoint")) return;

    int rand = Random.Range(0, 3);

    // First deactivate all pictures because as I understand you want to show only one
    foreach(var icon in OrderPicture)
    {
        icon.SetActive(false);
    }

    // Show the icon according to the random index
    OrderPicture[rand].SetActive(true);

    switch (rand)
    {
        case 0:
            if (collision.gameObject.name == "Rendang")
            {
                GetRendang();
            }               
            //RecipeObject.Artwork.SetActive(false);
            break;

        case 1:
            //CuisineObject.Artwork.SetActive(true);
            if (collision.gameObject.name == "Gado Gado")
            {
                GetGadoGado();
            }

            //RecipeObject.Artwork.SetActive(false);
            break;

        case 2:
            if (collision.gameObject.name == "Soto")
            {
                GetSoto();
            }

            //CuisineObject.Artwork.SetActive(false);
            break;
    }
}
...