Unity3D 使用 OnTriggerStay

Unity3D using OnTriggerStay

我正在使用事件 OnTriggerStay2D 来销毁一个对象,我使用它而不是 OnTriggerEnter2D 的原因是因为我正在使用触摸屏拖动对象,我想在它被释放后销毁它,我遇到的问题是 OntriggerStay2D 并不总是被调用,所以有时对象在释放后不会被销毁,它必须再次移动才能工作,我已经阅读了 Unity

的文档

OnTriggerStay is called almost all the frames for every Collider other that is touching the trigger.

public void OnTriggerStay2D(Collider2D other)
{
        if (gameObject.tag == other.tag) {

            Destroy (other.gameObject);

    }
}

我想知道每次释放对象时是否有任何方法可以调用 OntriggerStay2D。 谢谢

编辑 拖码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public class Drag : MonoBehaviour {

        private bool draggingItem = false;
        private GameObject draggedObject;
        private Vector2 touchOffset;

        void Update ()
        {
            if (HasInput)
            {
                DragOrPickUp();
            }
            else
            {
                if (draggingItem)
                    DropItem();
            }
        }

        Vector2 CurrentTouchPosition
        {
            get
            {
                Vector2 inputPos;
                inputPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                return inputPos;
            }
        }

        private void DragOrPickUp()
        {

            var inputPosition = CurrentTouchPosition;

            if (draggingItem)
            {

                draggedObject.transform.position = inputPosition + touchOffset;

            }
            else
            {

                RaycastHit2D[] touches = Physics2D.RaycastAll(inputPosition, inputPosition, 0.5f);
                if (touches.Length > 0)
                {
                    var hit = touches[0];
                    if (hit.transform != null && hit.rigidbody != null)
                    {
                        draggingItem = true;
                        draggedObject = hit.transform.gameObject;
                        touchOffset = (Vector2)hit.transform.position - inputPosition;
                    }
                }
            }
        }

        private bool HasInput
        {
            get
            {

                return Input.GetMouseButton(0);
            }
        }

        public void DropItem()
        {
            draggingItem = false;     

        }

    }

避免为此使用 OnTriggerStay2D。您可以使用在 OnTriggerEnter2DOnTriggerExit2D 函数中设置为 true 和 false 的布尔变量。

bool isTouching = false;

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

void OnTriggerExit2D(Collider2D collision)
{
    Debug.Log("Exited");
    if (collision.gameObject.CompareTag("YourOtherObject"))
    {
        isTouching = false;
    }
}

您现在可以在释放对象时检查 isTouching 变量。

if(isTouching){
....
}

请注意,我建议您放弃当前使用 Raycast 和 Input.GetMouseButton(0); 的代码,因为您也在移动设备上使用它。您应该为此使用 Unity 的新 EventSystem,因为它也是移动友好的。

由于您使用的是 2D 对撞机,请参阅 答案中的 #7

是如何使用新的 EventSystem 拖动 Sprite 的完整示例。将其与上面的答案结合起来,您将获得更好的解决方案。