【问题标题】:Unity3D using OnTriggerStayUnity3D 使用 OnTriggerStay
【发布时间】:2017-07-02 17:49:37
【问题描述】:

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

OnTriggerStay 几乎在所有触碰触发器的 Collider 的所有帧中都被调用。

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与拖动对象有什么关系?
  • 我正在拖动物体与另一个物体发生碰撞,但我不想在它们碰撞时破坏它,我想在它们仍然接触时释放它时破坏它。跨度>
  • 现在说得通了。请也添加您的拖动代码。这将有助于给你一个答案。
  • 我编辑了问题,我添加了拖动代码。
  • 您可以在释放对象后执行 RayCast。所以你不必使用 OnColliderStay 方法。

标签: c# android unity3d unity5 game-engine


【解决方案1】:

避免为此使用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 对撞机,请参阅 this 答案中的 #7

Here 是一个完整的示例,说明如何使用新的 EventSystem 拖动 Sprite。结合上面的答案,你会得到一个更好的解决方案。

【讨论】:

  • 谢谢,只需删除 OnTriggerStay2D 并使用您所说的布尔值即可完美运行,但我正在研究您的建议以改进它,但非常感谢您,您的解决方案确实有效。跨度>
  • 不错。很高兴我能提供帮助,您肯定会使用我提到的 EventSystem。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多