将3D Raycast转换为Raycast2D

我在下面有这个代码可以控制3个玩家中受影响的玩家。 我能够通过在2D精灵后面添加一个3D立方体来实现它,因为我的游戏应该是2D,我很难在2D中实现它。 我真的很困惑如何在2D中这样做,因为我真的对参数感到困惑。

虽然我已经通过上面提到的方式实现了它,但我仍然希望在纯2D中实现它。 因为当选定的玩家移动时我遇到了这个问题,所以精灵移动得更快。

public GameObject target = null; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if(Input.touchCount > 0 || Input.GetTouch(0).phase == TouchPhase.Began) { Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position); Debug.DrawRay(ray.origin,ray.direction * 20,Color.red); RaycastHit hit; if(Physics.Raycast(ray, out hit,Mathf.Infinity)) { Debug.Log(hit.transform.gameObject.name); if(this.target != null){ SelectMove sm = this.target.GetComponent(); if(sm != null){ sm.enabled = false; } } target = hit.transform.gameObject; //Destroy(hit.transform.gameObject); selectedPlayer(); } } } void selectedPlayer(){ SelectMove sm = this.target.GetComponent(); if(sm == null){ target.AddComponent(); } sm.enabled = true; } 

使用RaycastHit2D代替RaycastHit然后将Physics.Raycast更改为Physics2D.Raycast 。 参数不同,下面的代码应该这样做。您可能还需要将&&更改为|| 取决于你的游戏逻辑。

选择Sprite,然后从编辑器中添加Box Colider 2D 。 如果你的精灵是圆的,你也可以使用圆形碰撞器2D作为精灵。 如果没有向Sprite添加任何2D对撞机,则单击时ray不会检测到该对象。

对于移动设备

 if ((Input.touchCount > 0) && (Input.GetTouch(0).phase == TouchPhase.Began)) { Vector2 cubeRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position); RaycastHit2D cubeHit = Physics2D.Raycast(cubeRay, Vector2.zero); if (cubeHit) { //We hit something Debug.Log(cubeHit.transform.gameObject.name); if (this.target != null) { SelectMove sm = this.target.GetComponent(); if (sm != null) { sm.enabled = false; } } target = cubeHit.transform.gameObject; //Destroy(cubeHit.transform.gameObject); selectedPlayer(); } } 

FOR DESKTOPS / EDITOR

 if (Input.GetMouseButtonDown(0)) { Vector2 cubeRay = Camera.main.ScreenToWorldPoint(Input.mousePosition); RaycastHit2D cubeHit = Physics2D.Raycast(cubeRay, Vector2.zero); if (cubeHit) { //We hit something Debug.Log(cubeHit.transform.gameObject.name); if (this.target != null) { SelectMove sm = this.target.GetComponent(); if (sm != null) { sm.enabled = false; } } target = cubeHit.transform.gameObject; //Destroy(cubeHit.transform.gameObject); selectedPlayer(); } }