【问题标题】:Not all gameobjects with the same script attached are respawning并非所有附加了相同脚本的游戏对象都在重生
【发布时间】: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;) 这样您就可以访问和重置每个块

标签: c# unity3d


【解决方案1】:

您有一个公共游戏对象,其中只分配了一个对象。无论您将此脚本分配给多少对象,都只会重置您引用的游戏对象。如果您有 X 个想要遵循相同属性的游戏对象,您可以:

  1. 制作一个预制件并使用 transform.getchild() 或标签访问孩子 - 将它们分配给 GameObjects 例如:

    GameObject objs[]; for(int i=0;i<How many u want;i++) { objs[i]=GameObject.Find("ParentObj").transform.GetChild(i); //something similar to this }

  2. 或者只需公开引用并手动分配它们。

例如:

public GameObject slideblock1;
public GameObject slideblock2;

等等

【讨论】:

  • 当脚本的其余部分需要引用一个特定的游戏对象时,#2 将如何工作?如果有多个游戏对象,那么上面代码中的“slidingBlock”会用什么代替?
  • 您可以将所有这些游戏对象放在一个列表/数组中并使用循环。您可以使用特定的检查,如 gameObject.active 或索引值,以便重置不会应用于所有这些
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多