【问题标题】:[Unity]How to Trigger random Icon, with switch case?[Unity]如何用switch case触发随机Icon?
【发布时间】:2019-04-29 04:46:44
【问题描述】:

我目前正在尝试制作一个随机图标弹出机制,例如,客户随机订购比萨饼。

我正在尝试制作一个随机显示机制,其中每个客户都有一个带有开关盒的随机订单,它会像从开关盒中选择的订单一样显示。

我将订单图标作为一个大小为 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;
        }
    }      
}

我预计它会启用图像游戏对象,但它不会。那我错过了什么?

【问题讨论】:

  • 查看您的代码,您似乎首先在每种情况下执行 OrderPicture.SetActive,然后在 if 语句中立即停用它...... if 语句应该做什么?

标签: c# visual-studio unity3d triggers switch-statement


【解决方案1】:

首先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;
    }
}

【讨论】:

  • 谢谢。我要试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多