募集要項

  • ■ボイスの募集は終了しました。

    非常に沢山のご応募ありがとうございました!

     結果はこちら
2017年10月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

« 2015年2月 | トップページ | 2015年4月 »

2015年3月

2015年3月17日 (火)

【Unity Action】 半月たってた・・・

気づいたら前の更新から半月程経ってました(;´Д`)
作業自体はチマチマ進めてたのですが、ちょっとペース落ちてました。

ちょっと色々な要素が重なって作業の手が遅くなってたのが原因。
今日とか久々に体調も崩したりして、ほぼ一日寝てました。

で、やっと諸々落ち着いてきたので、ペース戻していきます。

まだしばらくは背景リソース作成が中心ですが、
のんびりお付き合い下さいm( _ _ )m

2015年3月 1日 (日)

【Unity Tips】 CharacterControllerでコリジョンを滑り落ちよう

タイトルの内容が
背景作ってる際に必要になったので考えてみました。

例えば、尖ってるオブジェクトがあり、
コリジョンは設けたいが、上には乗らせたくない、
というシチュエーションがあったとします。
この場合、CharacterControllerのslope limitで登れる角度設定できるから
単純に三角錐のコリジョンを作ればいいんじゃ?

・・・とは行きません。
CharacterControllerのslope limitはあくまで
「CharacterController.Move」で登れないだけであって、
基本的なジャンプ処理でコリジョンの高さに行くと、
↓図の右上図のようにはいかず、の左右下図のように、
コリジョンに触れると、その場で止まってしまいます。

 150301_2

つまり、CharacterControllerは
シンプルな実装のジャンプだと、
どこでも登れてしまうのです
(;´Д`)ナ、ナンダッテー

本来は右上図のように、下に滑り落ちて欲しいですよね・・・。

って事で対応を考えました。

①地面に設置した瞬間に、設置した面の角度を取得する

②地面した地面の角度が一定以上ならスライド開始
  ⇒一定以下なら着地処理へ

③地面の角度から、滑る方向を算出して滑りつつ、
 一定角度以下の地面に設置したら着地処理へ

ゲームによっては、急な崖等で本当に「滑り落ちる」ような
モーションを適応しても面白いかもしれませんね。

---------------------------------------------

さて、実践してみましょう。
CharacterControllerが地面に設置した状態で、
まだ着地していない場合に以下を実行します。

//キャラクターの位置から下方向にRayを飛ばす(指定レイヤー限定※この場合は地面コリジョンのレイヤー)
//RayLengthは、Rayを飛ばす距離。私の場合は地面の位置すれすれまで飛ばしてます(地面の高さは固定な前提)
//レイヤーマスクは⇒で指定 int layerMask =1 << LayerMask.NameToLayer("レイヤー名");
if (Physics.Raycast(myTransform.position, Vector3.down, out slideHit, RayLength,layerMask)) {
  //衝突した際の面の角度とが滑らせたい角度以上かどうかを調べます。
  if (Vector3.Angle(slideHit.normal, Vector3.up) > controller.slopeLimit){
   isSliding = true;
  }else{
   isSliding = false;
  }
}

基本的(※1)には上記で、「滑らせる状態かどうか」を調べられます。
そして、CharacterControllerのMoveを処理しているUpdate系の関数で、
滑らせる処理を入れます。

if(isSliding){//滑るフラグが立ってたら
  Vector3 hitNormal = slideHit.normal;
  moveDirection.x = hitNormal.x*slideSpeed;
  moveDirection.y -= gravity * Time.deltaTime;//重力落下
  moveDirection.z = hitNormal.z*slideSpeed;
}

※どこにどう挟むかは各人の処理次第。

で、これを地面、もしくは滑らない角度まで繰り返します。
斜面に触れてから着地までは逐一Rayを飛ばすことになりますが、
長く滑り続ける訳ではないので問題ないかなーという感じです。

※1:
 基本的、と書いたのは、CharacterControllerのRadiusやskinWidthが大きいと、
 「真下にはコリジョンがないのに滑ってる途中で着地してしまう」
 という事が起こりえる為です。
 自分の場合は、真下のチェックをスルーした際に、
 周囲に再度Rayを短く飛ばして、コリジョンの再チェックをしてます。


-------------------------------------------------

■CharacterController同士の重なり問題にも役立つ

CharacterControllerで、ジャンプを作った人は
経験ある人も多いかと思いますが、
CharacterController同士って、普通に乗れるんですよね・・・(´・ω・`)
150301_2_2
Unityユーザーみんな大好き、配管工!

少しでも動けば落ちますが、見た目的にはかなり違和感です。
そこで、今回の記事のやり方で、チェックするレイヤーを
CharacterControllerのレイヤーにすれば、
重なっても滑り落ちる事が可能です。

但し、CharacterControllerは
頂点付近のコリジョン角度が浅いので
少しでも角度があれば滑り落ちるくらいの設定にする必要があります。
なので、CharacterControllerのレイヤーだったら
  if (Vector3.Angle(slideHit.normal, Vector3.up) > controller.slopeLimit){
のslopeLimitを、「>0」等に分岐させると良いでしょう。

また、私の場合は、
「ジャンプ下降状態で下方向に敵がいた場合」は敵を若干ずらして
邪魔にならないように、という処理も入れていましたので、
今回の処理との相性もいい感じでした。
(ずらし具合を前より抑えて、残りは滑らせるイメージ)

対応するかはちょっと悩んだ項目でしたが、
結果やってよかった、と思います(´▽`*)

« 2015年2月 | トップページ | 2015年4月 »

Twitter等

  • にほんブログ村 ゲームブログ ゲーム制作へ

メールフォーム

  • 直接コンタクト取りたい方はこちらからどうぞ

サイト内検索
ココログ最強検索 by 暴想