将3D Raycast转换为Raycast2D

时间:2016-04-05 04:35:12

标签: c# unity3d 2d sprite raycasting

我在下面有这个代码可以控制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<SelectMove>();
                if(sm != null){ sm.enabled = false; }
            }
            target = hit.transform.gameObject; 
            //Destroy(hit.transform.gameObject);
            selectedPlayer();
        }
    }
}

void selectedPlayer(){
    SelectMove sm = this.target.GetComponent<SelectMove>();
    if(sm == null){
        target.AddComponent<SelectMove>();
    }
    sm.enabled = true;  
}

1 个答案:

答案 0 :(得分:0)

使用RaycastHit2D代替RaycastHit执行此操作,然后将Physics.Raycast更改为Physics2D.Raycast。参数不同,下面的代码应该这样做。您可能还需要根据您的游戏逻辑将&&更改为||

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

FOR MOBILE DEVICES

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<SelectMove>();
                    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<SelectMove>();
                    if (sm != null) { sm.enabled = false; }
                }
                target = cubeHit.transform.gameObject;
                //Destroy(cubeHit.transform.gameObject);
                selectedPlayer();
            }
        }