摧毁多个物体有时会造成比预期更多或更少的破坏

时间:2018-11-25 02:04:33

标签: c# unity3d

我正在Unity上进行游戏,概念很简单,当三种相同类型的成分被我摧毁时,您必须挑选掉从顶部掉下来的成分并将它们堆叠起来。糖果粉碎风格。

如果我继续堆叠相同颜色的元素,效果很好,它们会按预期被破坏。当堆积了很多成分时会出现问题,其中有时会破坏5个元素,或者破坏2个元素而不是三个。

因此,在累积新对象并破坏相同颜色的对象的过程中,有时会破坏5个对象,有时会破坏2个对象。

它不会一直发生,但是它经常发生,但是它似乎是随机的,我无法隔离发生它的情况。

这是我在PlateManager.cs的Update方法中编写的代码:

     void Update()
    {

            if (countSameIngredients > 2)
            {

                    //Destroying last 3 same ingredients 
                    Destroy(ingredients[ingredients.Count - 3].gameObject);
                    Destroy(ingredients[ingredients.Count - 2].gameObject);
                    Destroy(ingredients[ingredients.Count - 1].gameObject);

                    ingredients.RemoveRange(ingredients.Count - 3, 3);

                    //Checking if the plate is not empty
                    if (ingredients.Count > 0)
                    {
                            //If the plate is not empty, get the two last elements
                            int last = ingredients.Count - 1;
                            int beforeLast = ingredients.Count - 2;

                            //Save the last element type
                            lastIngredientType = ingredients[last].ingType;

                            //Compare the two last elements remaining, to see if they are similar
                            if (beforeLast >= 0 && last >= 0 && ingredients[beforeLast].ingType.Equals(lastIngredientType))
                                    countSameIngredients = 2; //Two similar ingredients on the top of the plate
                            else
                                    countSameIngredients = 1; //Only one element of that color on the top of the plate

                    }
                    else
                    {
                            //If the list is empty, set these options to their default parameters
                            lastIngredientType = "";
                            countSameIngredients = 0;
                    }

                    //Since we destroy the three last same ingredients, we move back the detection zone 3 times back
                    MoveBoxColliderCenterDown(3);
            }

    }

当最后有3个相同类型的元素时,这是破坏元素的代码。

为进一步解释游戏,我有一个检测区域,当一种成分进入该区域时会触发该区域。每当成分进入触发区域时,我都会将其添加到成分列表中,并检查count变量是否应该增加或设置为1,这是添加和检查这些条件的代码(在Ingredient.cs文件内部):

 PlateManager.ingredients.Add(gameObject.GetComponent<Ingredient>());

            if (PlateManager.lastIngredientType == "")
            {
                    PlateManager.countSameIngredients++;
                    PlateManager.lastIngredientType = gameObject.GetComponent<Ingredient>().ingType;

            }
            else if (PlateManager.lastIngredientType != "" && PlateManager.lastIngredientType.Equals(gameObject.GetComponent<Ingredient>().ingType))
            {
                    PlateManager.countSameIngredients++;
                    PlateManager.lastIngredientType = gameObject.GetComponent<Ingredient>().ingType;
            }
            else if (PlateManager.lastIngredientType != "" && !PlateManager.lastIngredientType.Equals(gameObject.GetComponent<Ingredient>().ingType))
            {
                    PlateManager.countSameIngredients = 1;
                    PlateManager.lastIngredientType = gameObject.GetComponent<Ingredient>().ingType;
            }

(ingType变量表示“成分类型”)

我不明白为什么它不能总是按预期运行,我在代码中看不到它,因此我需要帮助。

这是gitlab的链接:https://gitlab.com/Shyrro/makeasandwich,您可以在其中找到整个项目,也可以只下载Builds文件夹(如果要自己进行测试)。 我也愿意接受任何其他帮助或建议。谢谢

2 个答案:

答案 0 :(得分:0)

我已经在您提供的链接中检查了项目。我将更改以下内容:

您使用的是:

void OnCollisionEnter(Collision other)
        {

                if (other.collider.tag.Equals("Ground"))
                {
                        Physics.IgnoreCollision(other.collider, boxCollider, true);
                }
        }

我会添加onTriggerEnter() check it here

然后,您需要考虑到每秒调用几次Update(),但是在Update()中执行的主要操作是检查是否需要销毁某些成分,实际上应该检查一下有一次,当一种新成分到达堆栈时。我相信可能是问题所在。

尝试将Update()中的逻辑移动到外部函数,该函数将在触发OnTriggerEnter()(即堆栈中有新成分时)时调用。

类似的东西:

private void OnTriggerEnter(Collider other)
    {
        checkPlate();
    }

void checkPlate(){

    if (countSameIngredients > 2)
    {

        //Destroying last 3 same ingredients 
        Destroy(ingredients[ingredients.Count - 3].gameObject);
        Destroy(ingredients[ingredients.Count - 2].gameObject);
        Destroy(ingredients[ingredients.Count - 1].gameObject);

        ingredients.RemoveAt(ingredients.Count - 3);
        ingredients.RemoveAt(ingredients.Count - 2);
        ingredients.RemoveAt(ingredients.Count - 1);
        ...     
    }

    ...

}

答案 1 :(得分:0)

我实际上才找到答案。有时检测区域太靠近平板上的元件,这导致它有时会多次触发,从而弄乱了计数器。

我刚刚去除了盘子上的成分与检测物之间的碰撞,现在它的工作情况还不错。

由于我已经找到了答案,因此gitlab现在是私有的,但是我将其保留在此处,因为它可能会在将来对某人有所帮助。不过,如果您对gitlab代码感兴趣,可以与我联系以获取访问权限。