アプリつくってみっか!趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。この広告は、90日以上更新していないブログに表示しています。オープンワールドレーシングゲーム今回はAIを改良し、周囲の状況を検知してステアリング、ブレーキの操作に反映させる機能を実装しました。言え、人間のように周囲360度の状況を把握して適切な操作をするというのは無理で、せいぜい昆虫が触角に触れるものを避けたりする程度の知能です。(いや、昆虫に失礼か。)昆虫の触角に相当するのがUnityのRaycast機能で発射するRayになります。右下の横断歩道の上にいる昆虫のような物がAIカーで、前に3本、斜め方向に4本出ている緑の線がRayです。前に出ている3本のうち中央のRayはコーナー手前でブレーキを掛けるために使用しています。tf.hateblo.jp斜め前方に出ている2本で周囲の状況を読み取ります。(斜め後方に出ている2本は今のところ未使用)この斜め前方のレイが壁や他の車に当たるとAIカーは次の動作をします。ブレーキングで追突しないようにいつもよりブレーキを早めに踏むRaycastはFixedUpdateで毎回発射しているので、ヒットしなくなるまで上の操作が繰り返されます。基本的に、後ろを走る車が前を走っている車に当たらないように気をつければ事故は発生しないはずなので、前の車は後ろを見ずにひたすら自分のラインを走り続けます。実際には2本の触角では死角が多すぎるためか、事故を完全に防ぐ事はできていません。前方に伸びる3本のRayのうち、左右の2本はスリップストリーム効果を出すために使用しています。前走車にこれらのRayがヒットすると、自車のRigidbodyのDragを少し下げる事で、加速、最高速度が上がるようにしています。本来スリップストリームは低速では効かないのと、狭い路地で突然加速すると事故が多発するのは避けられないので、前走車が一定速度以上で走っているときだけスリップを効かせています。Rayは実際のゲームでは画面に表示されませんが、今はデバッグ用Debug.DrawRayで線を表示しています。ヒット中は色を変えているので、RayがヒットしたときのAIの動作が良くわかると思います。スリップストリームが効き始めるタイミングがわかるようにスピードメーターも付けてみました。実際には前走車の速度を見ているので、少しずれがあると思いますが、150km/hを過ぎた当りから加速して行くのがわかります。UnityのスタンダードアセットのCarControllerスクリプトにはバグがあって単位をKPHにするとスピードが正しく取れません。(単位の設定に関わらず常にマイル/hの値を返すようです。)Rigidbody.velocity.magnitudeの単位はm/sなので、km/hに直すときは3.6を掛けるように修正しました。}Unityではゲーム画面のStatsボタンを押せばフレームレートが表示されますが、Unityのエディター画面に実際に表示されているfpsより良い値が出るようです。これは、シーンビューやインスペクターの表示などに必要な時間は含まれていないためで、実際にUpdateのタイミングでフレームレートを表示してみると低いところで20fpsほどでした。Textに貼り付けて計測しています。}}}ちなみにiPhone5で実行すると13fps程度です。これでは快適なゲームは難しいので、次回は高速化にチャレンジしたいと思います。今回のAIのスクリプトです。