我使用事件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;
}
}
答案 0 :(得分:3)
避免使用OnTriggerStay2D
。您可以使用在OnTriggerEnter2D
和OnTriggerExit2D
函数中设置为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的完整示例。将其与上述答案相结合,您将获得更好的解决方案。