首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Unity3D的OnTriggerStay

使用Unity3D的OnTriggerStay
EN

Stack Overflow用户
提问于 2017-07-02 17:49:37
回答 1查看 1.1K关注 0票数 2

我使用事件OnTriggerStay2D来销毁一个对象,我用它代替OnTriggerEnter2D的原因是我用触摸屏拖动对象,并且我想在它发布后销毁它,问题是OntriggerStay2D并不总是被调用,所以有时这个对象在发布后没有被销毁,它必须再次移动才能工作,我已经阅读了来自统一的文档化。

OnTriggerStay被称为几乎每一个对撞机的所有帧,其他碰触触发器的帧。

代码语言:javascript
运行
复制
public void OnTriggerStay2D(Collider2D other)
{
        if (gameObject.tag == other.tag) {

            Destroy (other.gameObject);

    }
}

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

编辑拖动代码

代码语言:javascript
运行
复制
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;     

        }

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-02 19:57:17

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

代码语言:javascript
运行
复制
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变量。

代码语言:javascript
运行
复制
if(isTouching){
....
}

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44873605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档