使用Physics.Raycast和Physics2D.Raycast检测对象的点击

时间:2015-05-17 19:30:38

标签: c# unity3d mouseevent

我的场景中有一个空的游戏对象,带有组件盒对撞机2D。

我将脚本附加到此游戏对象:

Item::with('car','item_location')
    ->where('car.branch_id', '<>', 'item_location.branch_id')
    ->get();

但是当我点击我的游戏对象时,没有任何效果。你有什么想法 ?如何检测箱式对撞机上的咔嗒声?

1 个答案:

答案 0 :(得分:4)

使用光线投射。检查是否按下了鼠标左键。如果是这样,则将鼠标单击发生的位置的不可见光线投射到发生碰撞的位置。 对于3D对象,请使用:

3D模型:

void check3DObjectClicked ()
{
    if (Input.GetMouseButtonDown (0)) {
        Debug.Log ("Mouse is pressed down");

        RaycastHit hitInfo = new RaycastHit ();
        if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hitInfo)) {
            Debug.Log ("Object Hit is " + hitInfo.collider.gameObject.name);

            //If you want it to only detect some certain game object it hits, you can do that here
            if (hitInfo.collider.gameObject.CompareTag ("Dog")) {
                Debug.Log ("Dog hit");
                //do something to dog here
            } else if (hitInfo.collider.gameObject.CompareTag ("Cat")) {
                Debug.Log ("Cat hit");
                //do something to cat here
            }
        } 
    } 
}

2D精灵:

上述解决方案适用于3D。如果您希望它适用于2D,请将 Physics.Raycast 替换为 Physics2D.Raycast 。例如:

void check2DObjectClicked()
{
    if (Input.GetMouseButtonDown(0))
    {
        Debug.Log("Mouse is pressed down");
        Camera cam = Camera.main;

        //Raycast depends on camera projection mode
        Vector2 origin = Vector2.zero;
        Vector2 dir = Vector2.zero;

        if (cam.orthographic)
        {
            origin = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }
        else
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            origin = ray.origin;
            dir = ray.direction;
        }

        RaycastHit2D hit = Physics2D.Raycast(origin, dir);

        //Check if we hit anything
        if (hit)
        {
            Debug.Log("We hit " + hit.collider.name);
        }
    }
}