ぐーるらいふ

しがないリーマンの記録。遊びのunityのメモ帳にしたい。

【Unity】スライド操作で回転する砲台を作りたかったお話

何も考えずに砲台を作る

まずは図を観てほしい。

f:id:ghoul_life:20180320200335p:plain

左右ドラッグで横回転、上下ドラッグで縦回転というシンプルなものだ。
で、発射ボタンか何かを押下すると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));
}

動かしてみると

で、実際に動かすと、

  • 左右スライド -> いい感じに回る

f:id:ghoul_life:20180320200525g:plain

  • 上下スライド -> いい感じに上下に向いてくれる

f:id:ghoul_life:20180320200547g:plain

「完成だね!」
とは行かず、上下を角度を付けた状態で
左右に回すと斜めに回ってしまう。(当たり前だけど)

f:id:ghoul_life:20180320200613g:plain

やはり自然に回ってほしい

数学的には上の動きで全く問題ないのだけど、
こう回るのが直感的でゲーム的な理想だと思う。

f:id:ghoul_life:20180320200731g:plain

解決法(暫定)

とりあえず土台でやってしまった。

f:id:ghoul_life:20180320202037p:plain

  • 左右スライド -> 土台を回す
  • 上下スライド -> 弾の角度を調整
  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; // 砲塔を回す

というオブジェクトの分離で理想の動きになりました。

打ち終わったらまた弾に元に戻って欲しかったり、
発射位置がわからないと困ることも多いし…と土台があるとそれはそれで便利。

そもそも砲台だって土台と砲塔とって別れとるやんけ!
そう作ればええんや!

ってだけなんですが、計算で上手く回転軸を取ったり出来る…?