【问题标题】:How to activated object again in unity如何统一再次激活对象
【发布时间】:2019-01-31 21:58:37
【问题描述】:

我在 2D 中跟随鼠标创建了一个点,并创建了一个立方体对象在 x 和 y 上改变位置。现在,当我将鼠标指向立方体时,它会停用我设置它,现在我想再次激活它。我尝试触发退出,但没有成功。

public GameObject tapObject;
private float respawnTime = 1f;
public float xMin;
public float xMax;
public float yMin;
public float yMax;

void Start()
{
    StartCoroutine(spawnEnemyTime());
}   

private void RandomSpawnObject()
{
    tapObject.transform.position = new Vector2(Random.Range(xMin, xMax), Random.Range(yMin, yMax));   
}
private void OnTriggerEnter2D(Collider2D collision)
{
    tapObject.SetActive(false);
}

IEnumerator spawnEnemyTime()
{
    while (true)
    {
        yield return new WaitForSeconds(respawnTime);
        RandomSpawnObject(); 
    }        
} 

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    一旦处于非活动状态,该对象上的脚本就不再执行 => 像 OnTriggerExit 这样的消息不会被调用/执行。

    一种解决方案是简单地将目标对象包装在父对象中,然后将脚本附加到父对象,但使其(停用)子对象。

    所以父母保持活跃并接收消息。

    【讨论】:

    • 作为附录,任何引用该游戏对象的脚本都可以激活/停用它。父策略是一个很好的方法。
    【解决方案2】:

    我只是要重复这里其他人所说的话:

    Unity 中的非活动对象是真正不活动的,这意味着它不会收到任何更新,不能与任何东西发生冲突,并且通常调用您的代码的所有 MonoBehaviour 东西也不起作用。您必须使用缓存在某处的引用手动重新激活对象。

    但是,您可以禁用您不想激活的组件,而不是完全禁用整个对象。

    例子:

    private void OnTriggerEnter2D(Collider2D collision)
    {
        tapObject.GetComponent<Renderer>().enabled = false;
    }
    
    private void OnTriggerExit2D(Collider2D collision)
    {
        tapObject.GetComponent<Renderer>().enabled = true;
    }
    

    这只会停用您的渲染器组件,但会保留其他所有内容。所以你的对象仍然可以碰撞并且它仍然通过例如注册。 OnTriggerExit.

    请记住,GetComponent&lt;T&gt;() 是一个非常昂贵的操作,因此缓存组件引用是个好主意。最好的解决方案是从引用开始,为其创建一个变量并在检查器中分配它。

    例子:

    //Set in inspector
    public Renderer renderer
    
    private void OnTriggerEnter2D(Collider2D collision)
    {
        renderer.enabled = false;
    }
    
    private void OnTriggerExit2D(Collider2D collision)
    {
        renderer.enabled = true;
    }
    

    【讨论】:

      【解决方案3】:

      当一个 GameObject 在 Unity 中不活动时,你不能点击它(没有渲染,没有碰撞,什么都没有)

      但是,您可以创建一个热键(新脚本或在其他脚本中),如果它不处于活动状态,可以将其设置回活动状态。

      【讨论】:

        【解决方案4】:

        公共游戏对象 GO;

        使用 GO.setactive(true); 而gameobject是用于定义需要激活的特定事物或对象的对象,整个代码需要编写在方法“spawnEnemyTime”中,以便在特定时间段后它可以激活

        【讨论】:

          【解决方案5】:

          您可以只使用一个空的 GameObject 并获取要启用/禁用的对象的引用。如果您在禁用它之前获得参考,您将能够再次激活它。

          另一种方法是按照 TehMightyPotato 所说的去做。禁用组件实际上是解决此问题的最佳方法,但如果您有很多组件/子组件,禁用游戏对象会更快。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-20
            • 2011-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-07
            相关资源
            最近更新 更多