我在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();
}
}
答案 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所说的。禁用组件实际上是解决此问题的最佳方法,但是如果您有很多组件/子组件,则禁用游戏对象会更快。