如何统一激活对象

时间:2019-01-29 17:39:43

标签: c# unity3d

我在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(); 
    }        
} 

5 个答案:

答案 0 :(得分:2)

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

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

因此,父级保持活动状态并接收消息。

答案 1 :(得分:1)

我将重复这里其他人说的话:

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

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

示例:

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

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

这只会停用渲染器组件,而其他一切保持不变。因此,您的对象仍然可以碰撞,并且仍通过例如进行注册。 OnTriggerExit

请记住,GetComponent<T>()是一项相当昂贵的操作,因此缓存组件引用是一个好主意。最好的解决方案是从创建引用开始,为此创建变量并在检查器中对其进行分配。

示例:

//Set in inspector
public Renderer renderer

private void OnTriggerEnter2D(Collider2D collision)
{
    renderer.enabled = false;
}

private void OnTriggerExit2D(Collider2D collision)
{
    renderer.enabled = true;
}

答案 2 :(得分:0)

当GameObject在Unity中未激活时,您不能单击它(无渲染,无碰撞,无显示)

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

答案 3 :(得分:0)

公共GameObject GO;

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

答案 4 :(得分:0)

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

替代方法是执行TehMightyPotato所说的。禁用组件实际上是解决此问题的最佳方法,但是如果您有很多组件/子组件,则禁用游戏对象会更快。