【Unity】スライド操作で回転する砲台を作りたかったお話
何も考えずに砲台を作る
まずは図を観てほしい。
左右ドラッグで横回転、上下ドラッグで縦回転というシンプルなものだ。
で、発射ボタンか何かを押下するとforward方向へ発射されるという仕様と思って欲しい。
シンプルでいいんで、オブジェクトは弾だけで、自分で飛んでいくって感じ。
で、直感で作ったソースはこれ。テキトー。
Vector3 _touchDownPos; void Update(){ if (Input.GetMouseButtonDown(0)) { _touchDownPos = Input.mousePosition; } else if (Input.GetMouseButton(0)) { var tempPos = Input.mousePosition; Vector3 value = Vector3.zero; value.x = (_touchDownPos.x - tempPos.x); value.y = (_touchDownPos.y - tempPos.y); value.z = 0; _touchDownPos = tempPos; var qot1 = Quaternion.AngleAxis(value.x , new Vector3(0,1,0)); // 横回転 var qot2 = Quaternion.AngleAxis(value.y , new Vector3(1,0,0)); // 縦回転 this.transform.rotation *= qot1 * qot2;// Quartanion同士は掛け算で合体させる } // forwardチェック用のデバッグライン Debug.DrawLine(this.transform.position, this.transform.position + (this.transform.forward * 5)); }
動かしてみると
で、実際に動かすと、
- 左右スライド -> いい感じに回る
- 上下スライド -> いい感じに上下に向いてくれる
「完成だね!」
とは行かず、上下を角度を付けた状態で
左右に回すと斜めに回ってしまう。(当たり前だけど)
やはり自然に回ってほしい
数学的には上の動きで全く問題ないのだけど、
こう回るのが直感的でゲーム的な理想だと思う。
解決法(暫定)
とりあえず土台でやってしまった。
- 左右スライド -> 土台を回す
- 上下スライド -> 弾の角度を調整
var qot1 = Quaternion.AngleAxis(value.x , new Vector3(0,1,0)); var qot2 = Quaternion.AngleAxis(value.y , new Vector3(1,0,0)); _shooterBase.transform.rotation *= qot1; // 土台を回す this.transform.rotation *= qot2; // 砲塔を回す
というオブジェクトの分離で理想の動きになりました。
打ち終わったらまた弾に元に戻って欲しかったり、
発射位置がわからないと困ることも多いし…と土台があるとそれはそれで便利。
そもそも砲台だって土台と砲塔とって別れとるやんけ!
そう作ればええんや!
ってだけなんですが、計算で上手く回転軸を取ったり出来る…?