質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%

Q&A

解決済

1回答

1543閲覧

Unity2D 銃の照準のずれを直したい

tsuusan

総合スコア1

0グッド

0クリップ

投稿2021/04/22 14:26

前提・実現したいこと

現在、unity2Dでシューティングゲームを作っていますがわからないことがあるので質問させていただきます。

問題となっているのは銃の角度と照準の不一致です。

実現したいことは銃の持ち手を中心に回転しつつ、銃身の延長線上にマウスの位置が来るようにしたいです。
イメージとしてはL字型の定規の短い線(L字の底の線)のほうの中心を指で押さえ、回転させる感じです。

有効な関数や計算を教えていただきたいです。
また、もしソースを書いていただけるなら拝見させていただきたいです。

発生している問題・エラーメッセージ

視点は横スクロールゲーム(メトロイド、マリオなどと同じ)。 銃の照準を銃そのものの持ち手(pivot)を中心にして回転させ、マウスポインタ―の位置に向かせる方法で実現しています。 つまりpivotとマウスの位置関係による角度を銃のオブジェクトの角度に反映させることで回転させています。 問題点なのですがpivotが持ち手にあり、その位置とマウスの位置で結ぶ線で角度を取っているため銃身、つまりは実際に弾が発射される位置の延長線上にマウスの位置が存在しません。そうすると銃を撃った時にaimのずれ(マウスの位置より少し上に銃弾が飛んでいく)が発生してしまいます。

該当のソースコード

ソースコード

試したこと

pivotの位置をできるだけ銃身の線上(銃のハンマーのあたり)に変えることで一応解決はするのですが見栄えが悪いので回転の中心は持ち手あたりのままが良いです。
おそらく、pivotを中心にして回転する点(これは銃身の線上にある)を用意し、それを基準として銃身とマウスの位置を整えることができる気がします。しかし実現する方法が分かりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

面白そうな問題だと思いまして、ちょっと考えてみました。
まず、シーン上には下図のようにオブジェクトを配置しました。

図1

そしてPistolに下記のようなスクリプトをアタッチし...

lang

1using UnityEngine; 2 3public class Pistol : MonoBehaviour 4{ 5 [SerializeField] private Transform target; 6 [SerializeField] private Transform muzzle; 7 [SerializeField] private Transform breech; 8 9 private void Update() 10 { 11 // ターゲット、銃口、銃尾の銃ローカル座標を求める 12 var localTargetPosition = this.transform.InverseTransformPoint(this.target.position); 13 var localMuzzlePosition = this.muzzle.localPosition; 14 var localBreechPosition = this.breech.localPosition; 15 16 // 射線およびターゲットが銃の回転中心からどれだけ離れているかを求める 17 var localRay = new Ray(localBreechPosition, localMuzzlePosition - localBreechPosition); 18 var localRaySqrDistance = Vector3.Cross(localRay.direction, -localRay.origin).sqrMagnitude; 19 var localTargetSqrRadius = localTargetPosition.sqrMagnitude; 20 if (localRaySqrDistance > localTargetSqrRadius) 21 { 22 // もし射線の距離がターゲットの距離より大きければ、どの向きに回してもターゲットを狙うことはできないはず 23 // 極端な話だと、もしターゲットが銃を握っている自分の手だとすると、手首をどうひねろうが 24 // 自分の手を撃つことはできないかと思います 25 Debug.Log($"Can't aim {this.target.name}!"); 26 return; 27 } 28 29 // 二次方程式の解の公式によりターゲット距離を半径とする球と射線の交点を求める 30 var a = localRay.direction.sqrMagnitude; 31 var b = Vector3.Dot(localRay.origin, localRay.direction); 32 var c = localRay.origin.sqrMagnitude - localTargetSqrRadius; 33 var d = Mathf.Sqrt((b * b) - (a * c)) / a; 34 var e = -b / a; 35 var t0 = e - d; 36 var t1 = e + d; 37 var t = t0 >= 0.0f ? Mathf.Min(t0, t1) : t1; 38 39 // ターゲットをこの位置に捉えたいので... 40 var desiredLocalTargetPosition = localRay.GetPoint(t); 41 42 // 銃に適用する回転はこうなる 43 this.transform.rotation = Quaternion.FromToRotation(desiredLocalTargetPosition, localTargetPosition) * this.transform.rotation; 44 } 45}

インスペクター上でtargetmuzzlebreechにシーン上の各オブジェクトをセットして動かすと、下図のようになりました。

図2

投稿2021/04/22 22:02

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問