我正在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文件夹(如果要自己进行测试)。 我也愿意接受任何其他帮助或建议。谢谢
答案 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代码感兴趣,可以与我联系以获取访问权限。