おそらく上の画像、写ってないですよね…… むう、Git画像をどうやって表示させようか悩みどころですね ってことで久々の土曜日更新(日曜になってますが)です |
前に円運動について 記事にした回があったと思うけど 思い直したらアレ、勘違いしていたようね |
いままでUnityの円運動させる関数をつかっていたのですが とあるバグが出ることが判明して 修正が必要になってしまってな |
ということで 今日もプログラムメモブログです 詳しくは続きを読むからどうぞ! |
とあるバグというのが上の画像のように 円運動のみの処理だと、当たり判定を無視する場合がある ということなのです |
地形の当たり判定はしっかり取れていたので オブジェクト同士の判定がダメのようね 木とキャラはすり抜けてしまうわ |
で、結局は処理を書くことになったんだけど 前のソースを見返して気がついたっことがあったんだ ってことでこっそりと修正してみたぞ |
/* 予め、 Vector3 tagetPos : 回転させる中心座標 Vector3 prevPos : 前フレーム(前回)の座標 float moveRot : 回転角度 float distance : 回転させる幅の半径 を取得する */ //回転運動のプログラム Vector3 nextPos; //回転後の座標 //三角関数を使って計算する nextPos.x = tagetPos.x + Mathf.Sin(moveRot) * distance; nextPos.z = tagetPos.z + Mathf.Cos(moveRot) * distance; //過去の位置と現在の位置を比べて差分を算出(コレを速度としようとした Vector3 newVelocity; //速度(差分 newVelocity.x = nextPos.x - prevPos.x; newVelocity.z = nextPos.z - prevPos.z;
これが、前に紹介したコードですね 円運動するには全く問題ないコードです ただ、今回使うにはもうちょっと改良が必要になります |
//横の動き(外周設定 float HorizontalSpeed = Input.GetAxisRaw("Horizontal"); float buffMoveRot = 0.0f; if (Mathf.Abs(HorizontalSpeed) > 0.1f) { if (HorizontalSpeed > 0.0f) { buffMoveRot = angle - (Mathf.PI / 2.0f); } else { buffMoveRot = angle + (Mathf.PI / 2.0f); } //縦の動き HorizontalVector.x = (Mathf.Sin(buffMoveRot)) * (Mathf.Abs(HorizontalSpeed) * 3.0f); HorizontalVector.z = (Mathf.Cos(buffMoveRot)) * (Mathf.Abs(HorizontalSpeed) * 3.0f); }
変数レベルで違っていて比較になりにくい感じですが 分かる人には分かってもらえるかと思います ってことで、フォーマットを揃えて書いてみます |
/* 予め、 Vector3 verticalVector : 縦移動の速度 Vector3 tagetPos : 回転させる中心座標 Vector3 playerPos : 自分の座標 を取得する */ //横移動の速度を保存 Vector3 horizontalVector = new Vector3(); //自分と相手の角度を計算 float angle = Mathf.Atan2((playerPos.x - tagetPos.x), (playerPos.z - tagetPos.z)); //向いている方向から90度プラマイして横向きの角度を計算する if(/* 左右の振り分け処理 */) { angle += (Mathf.PI / 2.0f); } else { angle += (Mathf.PI / 2.0f); } //進む距離(速さになる) float distance = 3.0f; //三角関数を使って計算する horizontalVector.x = Mathf.Sin(angle) * distance; horizontalVector.z = Mathf.Cos(angle) * distance; //縦移動と横移動の合成後の速度 Vector3 newVelocity; //新しい速度 newVelocity.x = verticalVector.x + horizontalVector.x; newVelocity.z = verticalVector.z + horizontalVector.z;
縦移動は割愛しているわ で、どこが違っていたのかというと 三角関数を使った部分ね |
いままで、あそこの処理 横に進んだ分の移動差分を出していたんだが 差分じゃなくて移動距離もそのまま求められるんだよな |
「答え = 今まで進んだ座標 + 回転角度 * 進む距離」と計算して過去の座標を引くといったことをしていたのですが 「答え = 回転角度 * 進む距離」で差分は出せたんですよね…… そして、コレを立て移動のスピードに足せば完成しました |
ということで、1周間なやんだネタが ふとしたきっかけで治ってしまったというお話でした 一度頭をリセットするのも大切ですね…牙山点 |