【问题标题】:OnTriggerStay not called every frameOnTriggerStay 不是每帧都调用
【发布时间】:2017-08-29 22:04:23
【问题描述】:

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

这是附加到 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);
                }
            }
        }
    }
}

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    OnTriggerStay 用于检测游戏对象何时仍与另一个游戏对象接触一次。你不应该用它来检测游戏对象是否接触到每一帧,因为有时它只被调用了几次。

    最好的方法是使用带有布尔变量的UpdateOnTriggerEnterXXXOnTriggerExitXXX 函数。在调用OnTriggerEnterXXX 时将其设置为true,然后在调用OnTriggerExitXXX 时将其设置为false。然后在 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;
        }
    }
    

    【讨论】:

    • 但是当物体接触时我无法采取行动。然后我需要覆盖 70%、80%、90% 来执行操作,而 TriggerEnterTriggerExit 无法实现这一点
    • OnTriggerEnter2DOnTriggerExit2D 都具有与 OnTriggerStay 相同的参数,所以不会有问题。在我的回答中,您必须将 OnTriggerStay 函数中的当前代码放在 if 语句中的 Update 函数中。如果您需要从Update 函数访问Collider2D collision,请在调用OnTriggerEnter2D 时将其保存到全局变量中,然后在Update 函数中访问该变量。
    • 我明白了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2017-09-15
    • 2023-04-11
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多