繁体   English   中英

Unity3D使用OnTriggerStay

[英]Unity3D using OnTriggerStay

我正在使用事件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;     

        }

    }

避免使用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);当前代码Input.GetMouseButton(0); 因为你也在移动设备上使用它。 你应该使用Unity的新EventSystem,因为它也是适合移动设备的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM