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

スポンサーサイト

--.--.--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

円の動き

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
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。