2017-07-02 560 views
1

我使用事件OnTriggerStay2D销毁一个对象,我使用这个而不是OnTriggerEnter2D的原因是因为我使用触摸屏拖动对象,并且我想在它被释放后将其摧毁,这个问题我已经是OntriggerStay2D并不总是叫,所以有时它被释放之后的对象不被破坏,它必须再次转移到工作,我从团结Unity3D使用OnTriggerStay

阅读docummentation

OnTriggerStay是几乎所有碰撞触发器的对撞机都会调用这些帧。

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

      Destroy (other.gameObject); 

    } 
} 

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

编辑 拖码使用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;  

     } 

    } 
+0

'OnTriggerStay2D'与拖动对象有什么关系? – Programmer

+0

我拖着物体碰撞到另一个物体,但我不想在它们碰撞时摧毁它,当我释放它时,如果它们仍然接触,我想摧毁它。 –

+0

现在有道理。请添加您的拖动代码。这将有助于给你一个答案。 – Programmer

回答

2

避免。您可以使用在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){ 
.... 
} 

请注意,我建议你放弃使用光线投射和Input.GetMouseButton(0);,因为你正使用该移动设备上的太当前的代码。你应该使用Unity的新EventSystem,因为它也是移动友好的。

由于您使用2D撞机,看到#7this答案。

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

+0

谢谢,只是通过删除OnTriggerStay2D和使用布尔如你所说的完美,但我正在寻求你的建议,以改善它,但非常感谢你,你的解决方案真的有效。 –

+0

不错。很高兴我能够提供帮助,你绝对可以使用我提到的EventSystem。 – Programmer