Unity3D使用OnTriggerStay

时间:2017-07-02 17:49:37

标签: c# android unity3d unity5 game-engine

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

  

几乎所有碰撞触发器的碰撞器都会调用OnTriggerStay的所有帧。

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;     

        }

    }

1 个答案:

答案 0 :(得分:3)

避免使用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,因为它也是适合移动设备的。

由于您使用的是二维对撞机,请参阅this答案中的#7

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