5年後起業することを夢見る、初心者ゲームプログラマーの神楽坂 冬月による同人と気ままな日記ブログです。

円の動き

2016.02.21


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


関連記事

テーマ : ゲーム製作 関連

ジャンル : ゲーム

コメント
コメントの投稿


管理者にだけ表示を許可する

FC2カウンター
プロフィール

神楽坂 冬月(かぐらざか ふゆつき)

Author:神楽坂 冬月(かぐらざか ふゆつき)
【イベント情報】

2015年08月14日(1日目)
コミックマーケット88に参加します!
【金曜日 東地区 "ソ" ブロック 43a】
です!
東方紅魔烏【ウォーシミュレーション】
妖夢龍剣伝(体験版)【アクション】
の2点を出店予定です
よろしくお願い致します!

-----------------------------------------
2014年12月29日
コミックマーケット87に参加します!
【月曜日 東地区 "ハ" ブロック 50a】
参加してくださった型、ありがとうございます&
お疲れ様でした!

-----------------------------------------

めざせ!業界有名人!ということで新米ゲームプログラマーとして活動しています。
次の段階へ移行!
5年後起業という目標に目指してがんばりますぞ!

バナー2
http://studio-cross.com/
HPも作ってますので、どうぞよろしくお願いします

pixiv
月別アーカイブ