我是unity的新手,我搜索了我所期望的行为并实现了一定的扩展。我在主游戏脚本中实例化了一些预设,我需要在游戏对象上添加一个方向,如果玩家触碰了它,我需要在任何方向(2D)上做一个交换。我只需要在选定的gameObject上进行交换。
我在游戏主脚本中添加了触摸识别功能(游戏管理器.cs),用静态Vector2变量来存储 touchStartPosition
, touchEndPosition
和 touchDirection
. 这是我在Update()中进行触摸检测的代码。
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
touchStartPosition = Input.GetTouch(0).position;
}
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended)
{
touchEndPosition = Input.GetTouch(0).position;
touchdirection = touchEndPosition - touchStartPosition;
}
这里是我写的检查触摸StartPosition是否是gameObject的update()中的gameObject位置的代码。
//if gameObject is on the touch position
if(new Vector2(transform.position.x, transform.position.y) == GameManager.touchStartPosition)
{
MoveBall();
}
不幸的是,被触摸的gameObject没有发生任何事情。请帮我把这段代码运行起来。这将是一个很大的帮助。
new Vector2()和GameManager.touchStartPosition只有在它们指向同一个对象时才会用'=='返回true。
if(new Vector2(transform.position.x, transform.position.y) == GameManager.touchStartPosition)
{
MoveBall();
}
改为
if(transform.position.x == GameManager.touchStartPosition.x && transform.position.y == GameManager.touchStartPosition.y)
{
MoveBall();
}
为了确保有重叠,在测试前加一个debug。
Debug.Log("tx : " + transform.position.x + " -- ty " + transform.position.y + " -- gmx : " + GameManager.touchStartPosition.x + " -- gmy: " + GameManager.touchStartPosition.y);
我又试了一些,终于有了解决办法。这些是我对代码的改进。
已更换 Input.GetTouch(0).position
与
Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position)
而在每个gameObject文件中的检查,我使用了下面的if条件。
if(GetComponent<Collider2D>() == Physics2D.OverlapPoint(GameManager.touchStartPosition)){}
这工作真的很好。谢谢大家的帮助