问题描述
有人可以解释为什么这段代码没有按预期工作吗?目前,如果发生碰撞,精灵(标志)将变为绿色。调试语句按我的预期工作,但在没有碰撞的情况下,精灵(标志)不会变回红色。
public Sprite gflag;
public Sprite rflag;
public SpriteRenderer render;
public GameObject Player;
private Checkpoint checkpoint;
private bool hit = false;
void Update()
{
if(hit != true)
{
Debug.Log("False!");
render.sprite = rflag;
}
}
// Modify color of flag depending on collision
void OnTriggerEnter2D(Collider2D collider)
{
if (collider.gameObject.tag == "Player")
{
Debug.Log("True!");
render.sprite = gflag;
hit = true;
}
}
这是检查点预制件的屏幕截图:
解决方法
您是否考虑将 Update()
函数中的逻辑移至 OnTriggerExit2D
函数?
public Sprite gflag;
public Sprite rflag;
public SpriteRenderer render;
public GameObject Player;
private Checkpoint checkpoint;
private bool hit = false;
// Modify color of flag depending on collision
void OnTriggerEnter2D(Collider2D collider)
{
if (collider.gameObject.tag == "Player")
{
Debug.Log("True!");
render.sprite = gflag;
hit = true;
}
}
// Modify color of flag depending on collision
void OnTriggerExit2D(Collider2D collider)
{
if (collider.gameObject.tag == "Player")
{
Debug.Log("False!");
render.sprite = rflag;
hit = false;
}
}
这样,它不会在每一帧都检查 Update
,而是完全在碰撞函数中处理。
编辑:为了回答您最初的问题,在没有碰撞的情况下,代码没有将标志更新回红色的原因是因为您没有将 hit
布尔值设置为 false
碰撞已退出。