

ワイヤーアクションのゲームを制作しようとしています。  
分かりやすくするために下記のような名前を付けます。

rayC メインカメラから飛ばしたray  
rayP プレイヤーから飛ばしたray

rayCをメインカメラから飛ばし,設置しているブロックに当たったら、プレイヤーからrayC.point(rayCとブロックが接触した座標)の方向にrayPを飛ばし,rayP.point(rayPとブロックが接触した座標)にオブジェクトを置きたいのですが、Debug.DrawRayを使ってみたとこrayCとrayPが予期しない方向に飛んでいきます。

[code]

    if (Input.GetMouseButtonDown(0))
    {
    　　　  //rayCを飛ばす
           Ray rayC = Camera.main.ScreenPointToRay(Input.mousePosition);
           RaycastHit hitC;
                    
         //rayCが当たったら
         if (Physics.Raycast(rayC, out hitC, Mathf.Infinity))
         {
           Debug.Log($"HIT={hitC.collider.gameObject.name}");
           //当たったオブジェクトのタグがブロックだったら
           if (hitC.collider.gameObject.CompareTag("block"))
           {
              Debug.DrawRay(Camera.main.transform.position,
              Camera.main.ScreenToWorldPoint(hitC.point) , UnityEngine.Color.green, 0.5f);
              Vector3 tempV = hitC.point;
              tempV.z = 0;
    
              //rayPを飛ばす
              Ray rayP = new Ray(player.transform.position, tempV);
              RaycastHit hitP;
              Debug.DrawRay(player.transform.position, tempV, UnityEngine.Color.red, 0.5f);
    
              //rayPがブロックと当たったら
              if (Physics.Raycast(rayP, out hitP, Mathf.Infinity))
              {
                 Debug.Log($"ヒット"+hitP);
                 GetComponent<HingeJoint>();
                 Vector3(Camera.main.ScreenToWorldPoint(mousePos).x, Camera.main.ScreenToWorldPoint(mousePos).y, Camera.main.ScreenToWorldPoint(mousePos).z);
                 center.transform.position = new Vector3(hitP.point.x, hitP.point.y, hitP.point.z);
                 Debug.Log($"hitプレイヤー"+ hitP.point);
               }
            }
         }
    }
    
[/code]


CC BY-SA 4.0
2023-05-23T03:46:03.547
94943
2023-09-14T19:49:13.203
2023-09-14T19:49:13.203
3060
58415
question
c# unity3d game-development
２本のRaycastを飛ばして交わった場所にオブジェクトを設置しようとしたが、rayが飛んでいく方向がおかしい


いくつか間違いが見受けられます。

[code]

              Debug.DrawRay(Camera.main.transform.position,
              Camera.main.ScreenToWorldPoint(hitC.point) , UnityEngine.Color.green, 0.5f);
    
[/code]

[`Camera.ScreenToWorldPoint`](https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html)

`Camera.ScreenToWorldPoint`は、スクリーン座標(マウスカーソルの位置など)からワールド座標に変換するもので、引数に渡すのはスクリーン座標です。  
しかし、実際に渡しているのは当たった場所、つまりワールド座標です。  
そもそももともとワールド座標なのだから、`Camera.ScreenToWorldPoint`を呼ぶ必要がないのでは？

[`Debug.DrawRay`](https://docs.unity3d.com/ScriptReference/Debug.DrawRay.html)

更に、`Debug.DrawRay`の第2引数は、

> Direction and length of the ray.

と書かれているとおり、「レイの向かう位置」ではなく「レイの向きと長さ」です。  
先の`Debug.DrawRay`の呼び出しも、同様の間違いをしているように見られます。

[code]

              Vector3 tempV = hitC.point;
              tempV.z = 0;
    
              //rayPを飛ばす
              Ray rayP = new Ray(player.transform.position, tempV);
    
[/code]

[Ray Constructor](https://docs.unity3d.com/ScriptReference/Ray-ctor.html)

`Ray`のコンストラクタに関しても同様、第2引数はレイの向きです。位置ではありません。

* * *

どうも間違いが多く、

  * マニュアルをよく見ていない。
  * 「位置ベクトル」と「方向ベクトル」の区別がついていない。

という感じがします。  
前者であれば、マニュアルを読むクセをつけるべきですし、後者であれば、「位置ベクトル」「方向ベクトル」で検索すれば色々と説明してくれるサイトがあると思うので、しっかり理解してください。


CC BY-SA 4.0
2023-05-24T23:54:25.440
94967
2023-05-24T23:54:25.440
15473
94943
answer