円の動き

おそらく上の画像、写ってないですよね……
むう、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周間なやんだネタが
ふとしたきっかけで治ってしまったというお話でした
一度頭をリセットするのも大切ですね…牙山点

気軽にコメントをどうぞ!

この記事に関すること冬月に聞きたいこと等、小さいことでもコメントしていただける嬉しいです。冬月に直接連絡したい方は下のお問合せフォームをお使いください。(メール送信されます)

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。※メールアドレスは公開されることは有りません。


The reCAPTCHA verification period has expired. Please reload the page.

ゲーム製作の関連記事