【发布时间】:2019-02-07 12:48:34
【问题描述】:
我正在构建一个带有出现框的平台游戏。一旦玩家击中它,盒子就会被渲染。这工作得很好:
public class AppearingBoxes : MonoBehaviour
{
public GameObject Block, RageFace;
bool showBlock = false;
void Start()
{
showBlock = false;
}
void OnCollisionEnter(Collision2D col)
{
if (col.gameObject.name == "Birdy")
{
showBlock = true;
}
}
void FixedUpdate()
{
Block.GetComponent<Renderer>().enabled = showBlock;
RageFace.GetComponent<Renderer>().enabled = showBlock;
}
}
这个脚本附在所有这些盒子上。每个盒子都是一个单独的盒子,但都具有相同的脚本、属性和名称:
但是问题来了。只有第一个 HIT 会触发一个框。正如你可以想象的那样,玩家跳到那些看不见的盒子上,然后触发他击中的那个。玩家现在向前移动到仍然不可见的其他框并进入那里的碰撞框。然而他们没有出现。我相信这是因为玩家仍然在“相同”的碰撞箱中,即使它是一个不同的预制对象。如果我跳到看不见的平台上,然后又回到它上面(我离开然后重新进入扳机),我降落的盒子会立即出现。
那么,即使玩家之前没有离开过盒子的碰撞箱,我该怎么做才能让盒子在玩家触摸它时立即出现?
谢谢! :)
【问题讨论】:
-
在您玩游戏时是否已将
Block和RageFace分配给它们对应的gameobjects? -
为什么你不在 if 语句中将
Renderer设置为 true 并使用FixedUpdate?你可以写if (col.gameObject.name == "Birdy") { Block.GetComponent<Renderer>().enabled = true } } -
你好,是的,他们当然都被分配了。如果他们没有,无论我是否跳到他们身上,他们都不会出现。但他们确实出现了,但不幸的是只有在第二次进入他们的碰撞箱后才出现。另外,我在fixedUpdate中这样做是因为只是检查碰撞有一点延迟,我这样做了......
-
直接启用渲染器导致的延迟通过在以后使用
FixedUpdate调用它来消除是没有意义的@^^ -
另请注意,使用您的脚本而不更改任何内容 worked for me 具有非常基本的设置
BoxCollider2D和RigidBody2D(仅用于测试我将一些 AppearingBoxes 分开,其他重叠并使用不同高度)->没问题
标签: unity3d