Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2016.05.13キャラクターの移動にはCharacterControllerのMove関数を使っていましたが、その移動の条件として、キャラクターが地面に接地している事という条件を設定していました。ジャンプをするにも接地している必要があります。(空中でジャンプOKなら別ですが)またCharacterControllerではなくRigidbody+コライダでキャラクターを動かしている場合の接地の判断としても今回の記事は有効です。ジャンプ機能に関してはUnityでキャラクターがジャンプ出来るようにするUnityのゲームでキャラクターがジャンプ出来るようにする機能を作成します。gametukurikata.com2016.04.07を参考にしてください。キャラクターの接地はCharacterControllerのisGroundedプロパティを調べればCharacterControllerのコライダが地面に接地しているかどうかが簡単に調べられます。ジャンプの機能を実装するまでは全然気づかなかったんですが、平たんな道や坂を登る時は問題ないんですが、坂を下りながらジャンプボタンを押すとジャンプが出来ないんです。上の動画のように坂を下りながらジャンプボタンを押してもジャンプしてくれません。その原因は坂を下る時にコライダが接地面から外れisGroundedプロパティがfalseになってしまっているせいです。どんな具合に接地面から外れるか確認してみます。坂を登る時はコライダが矢印の方向に進むのでisGroundedプロパティはtrueになります。登る時は問題ないですね。コライダが矢印の方向に進むので移動している間はisGroundedプロパティはfalseになってしまいます。ジャンプ機能を使用しなければこの問題を考えなくてもいいんですが、ジャンプ機能を使ったアクションゲームを作る場合、これはかなり大きな問題です。いうわけで、CharacterControllerのisGrounded以外の接地を確認する方法が必要になります。レイを使わないパターンを追記しました(2018年07月27日)。レイを使わないパターンの方が簡単です。Rayを飛ばしキャラクターの接地を確認するまずはキャラクターからRayを飛ばし、地面に接地しているかどうかを調べる方法をやってみます。具体的にはPhysics.Linecast関数を使いキャラクターの体の一部をスタート地点にして、下方向に指定した距離のレイを飛ばします。isGroundedだけで接地条件としていた個所にレイを飛ばして地面と当たっていた場合も含める事にします。Time.deltaTime);}}少しづつ見ていきます。false;rayPositionはレイを飛ばす位置、rayRangeはレイの距離でインスペクタで設定出来るようにします。isGroundはレイが地面に到達したかどうかのフラグに使用します。次にUpdateメソッドの最初でCharacterControllerのisGroundがfalseの時にレイを飛ばして接地を確認します。Color.red);}CharacterControllerのisGroudedプロパティがfalseの時だけレイを飛ばすようにします。isGroundedプロパティがtrueの時は接地しているのがわかっているのでレイを飛ばす必要がない為です。終了地点)なのでレイを飛ばす開始地点と終了地点を指定します。開始地点はインスペクタでキャラクターの体の一部を指定します、今回はStandardAssetsのキャラクターであるEthanのEthanHipsを指定します。終了地点はレイを飛ばす開始地点+飛ばす先で計算した位置を指定します。