OnTriggerStay没有调用每一帧

时间:2017-08-29 13:31:38

标签: c# unity3d unity5

我有2个相同的游戏对象(板条箱 - 预制件)和2个需要得到的箱子。当玩家将第一个箱子推到1时,附加到该箱子的脚本中的OnTriggerStay会激活并一直完成作业(在控制台中打印)。问题是,当第二个箱子到达第二个位置时,它会完成工作20-30次(打印)然后停止,然后我需要触摸它(移动一点)并再次完成工作20-30次并停止。 / p>

这是附加到crates的脚本:

public class Block : MonoBehaviour
{
    public BlockType blockType;
    public int blockId;

    // Use this for initialization
    void Start ()
    {

    }

    // Update is called once per frame
    void Update ()
    {

    }

    private void OnTriggerStay2D(Collider2D col)
    {
        if (gameObject.GetComponent<Block>() != null)
        {
            if (col.GetComponent<Block>().blockType == BlockType.Crate && gameObject.GetComponent<Block>().blockType == BlockType.Point)
                {
                float distance = Vector3.Distance(this.transform.position, col.transform.position);

                Debug.Log(col.GetComponent<Block>().blockId + ": " + distance); //for testing, distance is <= 0.05 and it doesn't display

                if (distance <= 0.05)
                {
                    PlayScene.CrateOnPoint(col.GetComponent<Block>().blockId);
                    Debug.Log("On place: " + col.GetComponent<Block>().blockId);
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

OnTriggerStay用于检测游戏对象何时仍然与另一个游戏对象一次进行交互。您不应该使用它来检测GameObjects是否触及每一帧,因为有时,它只被调用几次。

执行此操作的最佳方法是使用UpdateOnTriggerEnterXXX和带有布尔变量的OnTriggerExitXXX函数。您在调用true时将其设置为OnTriggerEnterXXX,然后在调用false时将其设置为OnTriggerExitXXX。然后,在Update函数的每一帧中检查此布尔变量。

bool triggered = false;

private void Update()
{
    if (triggered)
    {
        //Do something!
    }
}

void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log("Entered");
    if (collision.gameObject.CompareTag("SomeObject"))
    {
        triggered = true;
    }
}

void OnTriggerExit2D(Collider2D collision)
{

    Debug.Log("Exited");
    if (collision.gameObject.CompareTag("SomeObject"))
    {
        triggered = false;
    }
}