web-dev-qa-db-ja.com

Unity 2Dゲームでオブジェクトのマウスクリックを見つけるためのレイキャスティング

マウスをクリックしたオブジェクトを削除しようとしています。新しいUnity3D 4.3を使用して2Dゲームを作成しています。これが私が使っているコードです

void Update () {

    if (Input.GetMouseButtonDown(0)) 
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray,out hit))
        {
            isHit = false;
            Destroy(GameObject.Find(hit.collider.gameObject.name));

        }
    }

}

コントロールは内側のifループに入っていません。 (isHitはfalseに設定されていません)。

10
Bimal Bose B S

新しい2D要素で3D物理関数を使用することはできません。代わりに 2D functions を使用してください。例:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

if(hit.collider != null)
{
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position);
}
19
Esa

この質問は少し古いですが、Unity 2DでマウスクリックしてGameObjectを取得する方法を探していました。Esaからの回答がほとんど役に立ちましたが、動作させる余裕がなかったため、少し調べたところ、Camera.main.ScreenToWorldPointがカメラの画面領域の中心を返し、正しく機能していることがわかりました。カメラと最も近いゲームオブジェクトとのZ位置の差を入力する必要がありました。私のカメラはデフォルトで-10に設定されており、GameObjectは0に設定されていたので、必要なのは、Input.mousePosition.zを10に設定することだけです。以下のコードはあなたを助けるかもしれません:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10)), Vector2.zero);

if(hit.collider != null)
{
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position);
}
6
Wylht Heartless

まず、任意のタイプの2Dコライダーをゲームオブジェクトに接続し、次にそれらのソリューションの1つを選択します。

1番目のケース-複数のゲームオブジェクトが重なり合っており、特定のゲームオブジェクトがクリックされたことを理解しようとする場合:

void Update ()
{
    if (Input.GetMouseButtonDown (0)) {
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit2D[] hits = Physics2D.GetRayIntersectionAll (ray, Mathf.Infinity);
        foreach (var hit in hits) {
            if (hit.collider.name == name) {
                MyFunction ();
            }
        }
    }
}

2番目のケース-GameObjectが1つしかなく、クリックされたかどうかを理解しようとする場合:

void Update ()
{
    if (Input.GetMouseButtonDown (0)) {
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit2D hit = Physics2D.GetRayIntersection (ray, Mathf.Infinity);
        if (hit.collider != null && hit.collider.name == name) {
            MyFunction ();
        }
    }
}
4

最初にオブジェクトにメッシュコライダー(任意のコライダー)をアタッチして、内側のIfに入ります。そして、

Destroy(hit.collider.gameObject); 

単に仕事をします。

このあたりには他の作業があるかもしれません。

void Update () {

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if(Physics.Raycast(ray,out hit))
    {
        if(Input.GetMouseButtonDown(0))
        {
            isHit = false;
            Destroy(hit.collider.gameObject);
        }
    }
}
1
Reaz Murshed