テラシュールブログスマートフォン用の表示で見るテラシュールブログ旧テラシュールウェアブログUnity記事。UnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。回転とか移動とか拡大縮小とか学生のUnityプロジェクトでよく見るのが、主人公キャラクターが壁から落下したり、壁を貫通して移動したりする光景です。それは「そういったゲーム」なら兎も角、RPGの移動パートのような「キャラクターを移動させる」事が目的の場合は出来れば避けて欲しい所です。今回はキャラクターが「想定したステージ上」から落下しないように動かす手っ取り早い方法を紹介します。意図しない場所を歩かないキャラクターRPGのようなゲームにおいて、キャラクターが想定外の位置に移動することは好ましくないです。道中にボスが居ても無視して進められたら、ゲームは興ざめです。(最近ソレが意図的に出来るゲーム多い印象ではありますが)また何もない空間を歩かれるのも困り物なので、基本的に地面の上を歩くことが望ましいです。落下せずキャラクターを移動させるのはNavMeshが楽さて、地面判定はPhysics系の命令でColliderとの距離もしくは接地判定を行うのが楽ですが、キャラクターがジャンプしないのであればNavMeshを設定してしまうのが楽です。NavMeshを設定しNavMeshAgentで移動させている場合、agent.updatePositionをfalseに設定しない限り、NavMeshで指定した範囲から抜け出すことは出来ません。キャラクターに指定の範囲移動させるには便利な機能です。他のアイディアとしては、足元にSphereCastを落とす...や、壁をColliderで囲む(囲み損ねるとソコから落下する)等が考えられます。キャラクターはNavMeshAgent.Moveで動かすここでのキャラクターは基本的にNavMeshAgent.Moveで移動します。コードはこんな感じです。GetAxisで移動を持ってきてAgentに渡すだけの簡単なお仕事です。gist.github.comなお、この設定ではNavMeshAgentに設定されてる移動用パラメータはほぼ使いません。SpeedもAccelerationも0で良いです。Avoidanceすらも0もNoneで良いです。キャラクターは直接動かすので。AvoidanceをLow以上せっていされてるなら、接触してキャラクターが重なるのを回避してくれます(要するに押し出せます)NavMeshをベイクするこの手法はNavmeshAgentだけでは不十分で、必ずNavMeshで移動範囲を定義してやる必要があります。NavMeshAgentが移動するにはNavMeshを事前にベイクする必要があります。Staticにチェックが入っている事が大前提で、かつNavigationウィンドウでシーン毎にベイクしておく事が必要です。要するに、途中で変化するようなステージには使いにくかった所があります。やるならNavMeshとグラフィックは別にして、NavMeshObstacleで穴を空ける的な事をする必要がありました。5.6から動的にNavMeshを構築が可能になったので、それを使用して「地形が変化するステージ」で「マップから落ちない」ように移動するのを、「手っ取り早く」実現してみます。Navigationのウィンドウにあるリンクを移動して、NavmeshのHLAPIを入手・導入します。DLするファイルのバージョンは、とりあえず最新なら多分良さそうです。LocalNavMeshBuilderでキャラクターの周辺のNavMeshを生成NavMeshを動的に作るHLAPIは幾つかありますが、今回は「キャラクターの周辺だけNavMeshを作る」LocalNavMeshBuilderを使ってみます。適当なGameObjectにLocalNavMeshBulderを追加し、Trackedに動かすキャラクターを指定します。地面になるオブジェクトにNavMeshSourceTagを設定しますこれで動的にNavMeshがキャラクターの周辺に構築されて、NavMeshAgent経由で地面に落下せず動かすことが期待出来ます。初期設定80平方メートルとかなってますが、今回の用途だとキャラクターが5平方メートルくらいでも十分です。大きくなるとビルドに時間がかかりますので、出来る限り小さくしたい所です。小さいとNavMeshの更新頻度が上がるので、その辺りは調整を考える必要がありそうです。今回は移動するキャラクターが一体のみなのでLocalNavMeshBuilderを使用しましたが、もしプレイヤー周辺以外にもNavMeshAgentで動くキャラクターが居る場合、NavMeshSurfaceで指定範囲のNavMeshを構築する方が安いかもしれません。ジャンプ・落下は特殊アクション扱いこの手法で問題になるのはジャンプや落下等の扱いです。基本的にNavMesh上を動き回るので、そこから外れたジャンプ・自由落下等は出来ません。ついでに言えば、OffMeshLinkも使えません。いった物は、この手法では「指定場所の特別なアクション」のような形で扱います。イメージとしてはコレが近くて、キャラクターが指定範囲に入ったらagent.updatePositionをfalseキャラクターの移動を(アニメーションやTween、MatchTargetで)行う移動完了後、WarpでNavMeshAgentの位置を移動agent.updatePositionをtrueで移動を再開といった感じです。UnityTechnologiesJapanwww.slideshare.net今日の一言やべぇ、タブレットPCで絵書くの超楽しい。今回は動的にNavMeshをベイクするNavMeshSurfaceについてです。...2016-12-01【Unity】NavmeshAgaentの移動がOffMeshLink上で妙に加速するのを防ぐOffMeshLinkは複数のNavMeshを繋ぐ上で役に立つ機能です。...2016-11-29【Unity】Navmeshで障害物を避けて移動するルートを事前に取得する今回は経路探索AI(Navmesh)のルートだけを取得してみます。(1)月別アーカイブはてなブログをはじめよう!tsubaki_t1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。