##前提・実現したいこと
Unityでアクション系のゲーム開発をしています
地面に沿って移動する四角いキャラクタ(Cube)を実装したいです。
コスパよく、正確に実現する方法に悩んでいます
動く床もあり得るので地面にはKinematic RigidBodyを適用しています。
CubeにもKinematic RigidBodyを適用しています。
そのため衝突検知にOnCollisionXXX系の関数は使えません
コライダーのIs Triggerに✔を入れればOnTriggerXX系の関数は使えます
##試したこと
自分なりに地面に沿って移動する仕組みを考えた結果以下のように実装しています
処理④の実装は地面を近似する複数の線分(図中黄色線)における終端点と交点の中で
y方向にCubeと最も近い & Cubeの中央に近い点を接地点(図中橙丸)として選んでいます
Cubeが沿う地面の方向ベクトル(図中橙線)は接地点から伸びる直線の式の方向を参照しています
構造が複雑で実装をすべて記載することはできませんが簡単に示すと以下のような処理になっています。
//Cubeが接地する点(fulcrum) private Vector3 fulcrum; //Cubeが地面に沿う方向ベクトル private Vector3 followDirection; void FixedUpdate(){ AnalyzeBottomSurface(out fulcrum, out followDirection); FollowToSurface(fulcrum,followDirection); } //Cubeが接地する点(fulcrum)とCubeが地面に沿う方向ベクトル(followDirection)を計算する void AnalyzeBottomSurface(out Vector3 fulcrum, out Vector3 followDirection){ //Raycastで地面の情報(法線等)を取得 BottomSurfaceInfo[] surfInfos = ScanBottomSurface(); //地面を近似する直線の式(線分)を計算 LineSegment[] surfLineSegs = CalculateLineSegments(surfInfos); //各線分の終端点と交点の中からCubeとの接地点(fulcrum)を選定。地面に沿う方向(followDirection)を取得。 GetFlucrmAndFollowDirection(surfLineSegs, out fulcrum, out followDirection); } void FollowToSurface(Vector3 fulcrum, Vector3 followDirection){ //fulcrum(接地点)にCubeを移動 //fulcrumを中心にCubeを地面に沿う方向(followDirection)に向くよう回転 }
##発生している問題
一応この実装で地面に沿って移動するCubeを実現できているのですが
Cubeのコライダーを全く活用していないのでUnityらしい実装とは思えていません。
またRaycastの計算+直線の式導出+直線交点の計算の負荷でパフォーマンスも悪い気がします
よりシンプルで分かりやすい実現方法はないでしょうか
##利用環境
Unity 2019.4.1f1 Personal
あなたの回答
tips
プレビュー