【发布时间】:2019-12-15 16:09:42
【问题描述】:
我正在开发一个 Unity2D 平台游戏,当玩家跳到上面时,它的方块会破裂/掉落。一旦玩家接触,会有短暂的延迟,然后方块开始向下滑动并很快消失(使用 SetActive(false))。如果玩家死了,那么所有“下落”的方块都应该重生并回到原来的位置。
我已经制作了一个有两个这样的块(两个完全独立的游戏对象)的关卡,但问题是当玩家打破两个然后死亡时,当玩家重生时只有一个两个块的重生到其原始位置。 (另一个再也见不到了。)
我认为这可能与它们如何附加到同一个脚本有关。但是我不明白如何,因为在每个块的脚本的每个实例中仍然指定了不同的游戏对象。
这是附加到方块游戏对象(称为breakBlock)的脚本代码。
public class BreakingBlock : MonoBehaviour
{
Collider2D boxCollider;
public GameObject slidingBlock;
public PlayerController player;
public float delay;
public float X;
public float startY;
public float endY;
public float speed;
void Start() // Initialises the position of the blocks
{
boxCollider = GetComponent<Collider2D>();
boxCollider.enabled = true;
slidingBlock.transform.position = new Vector2(X, startY);
player = FindObjectOfType<PlayerController>();
}
void OnCollisionEnter2D(Collision2D collision)
// Starts sliding coroutine when touched by player
{
StartCoroutine(Slide(slidingBlock, new Vector2(X, startY), new Vector2(X, endY), delay, speed));
}
public IEnumerator Slide(GameObject slidingBlock, Vector2 start, Vector2 end, float delay, float speed)
{
yield return new WaitForSeconds(delay);
while (slidingBlock.transform.position.y != end.y)
{
// Move towards end position over duration given
slidingBlock.transform.position = Vector2.MoveTowards(slidingBlock.transform.position, end, speed * Time.deltaTime);
yield return new WaitForEndOfFrame();
}
boxCollider.enabled = false;
slidingBlock.SetActive(false);
}
public void ResetSlidingBlock() // Called by another script when player dies
{
Debug.Log("Reset block");
slidingBlock.transform.position = new Vector2(X, startY);
slidingBlock.SetActive(true);
boxCollider.enabled = true;
}
}
这是另一个脚本的一部分,它在玩家死亡时从上述脚本中调用 ResetSlidingBlock。
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.name == "Player")
{
levelManager.RespawnPlayer();
breakingBlock.ResetSlidingBlock();
}
}
为什么在完全不同的游戏对象上的单独脚本中指定单独的游戏对象时只有一个块正在重生?
【问题讨论】:
-
你只是用breakBlock.ResetSlidingBlock();重置“breakBlock”实例。如果要重置更多块,则需要参考每个实例来重置每个实例。据我所知“公共游戏对象滑动块;”可以是所有块的列表,(public GameObject[] rollingBlock;) 这样您就可以访问和重置每个块