在寻找处理Unity中触控的解决方案之后,我找到了一个似乎有用的解决方案。问题是,当检测到触摸时,具有2D对撞机的每个单个对象都被破坏。我只希望被触摸的物体被摧毁。
场景中的每个游戏对象都是预制件。它们都是8种不同随机预制件的克隆。这些预制件中的每一个都有一个圆形碰撞器2D以及用于触摸控制的脚本,称为TouchManager.cs
我试过更改" if(hit)" part to" if(hit.collider!= null)但是由于某种原因导致它不起作用。我已经尝试了我能想到的一切,没有任何作用! 有人可以帮忙吗?
// Update is called once per frame
void Update ()
{
if (Input.touchCount > 0)
{
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
Vector3 wp = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
Vector2 touchPos = new Vector2(wp.x, wp.y);
Collider2D hit = Physics2D.OverlapPoint(touchPos);
if (hit)
{
touched = true;
startPos = Input.GetTouch(0).position;
}
}
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
}
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
if (touched == true)
{
float swipeDirection = Mathf.Sign(Input.GetTouch(0).position.y - startPos.y);
if (swipeDirection > 0)
{
Destroy(gameObject);
}
else if (swipeDirection < 0)
{
}
// Reset touched
touched = false;
}
} //END SWITCH
} //END IF TOUCHED
} //END UPDATE
答案 0 :(得分:1)
这里发生的事情是OverlapPoint返回点重叠的对撞机,这意味着您正在检查:如果滑动与任何对撞机重叠,请销毁此游戏对象。
你想要的是使用hit.collider2D,它会存储重叠的collider2D。 虽然hit.collider总是为null,那是因为你没有任何碰撞器,你只有collider2D。
由于OverlapPoint针对所有碰撞器进行测试并且不关心它是从哪个游戏对象运行,因此最好将其放在单个管理器对象而不是每个对象中,然后让该管理器销毁其他对象。
此代码将仅销毁一个对象。请记住将它放在与您正在销毁的物体不同的物体上。我怀疑它会给你一个理想的行为,但由于我不知道那是什么,我把它作为锻炼给你。
Vector3 startPos;
GameObject hitObject;
void Update()
{
if (Input.touchCount > 0)
{
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
Vector3 wp = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
Vector2 touchPos = new Vector2(wp.x, wp.y);
Collider2D hit = Physics2D.OverlapPoint(touchPos);
if (hit != null)
{
hitObject = hit.collider2D.gameObject;
startPos = Input.GetTouch(0).position;
}
}
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
if (hitObject != null)
{
float swipeDirection = Mathf.Sign(Input.GetTouch(0).position.y - startPos.y);
if (swipeDirection > 0)
{
Destroy(hitObject);
}
else if (swipeDirection < 0)
{
}
hitObject = null;
}
}
}
}