やはりジャンプを付けたくなったので
単純の傾きでつけてみたら、案の定飛んでしまう。
だから、地面にくっついているときだけ飛べるようにしてみた。
そこで考えたのが、
地面にくっついているかどうか判定しないといけない。
CharacterController.isGrounded
で、調べれは簡単だろうけど・・・
あえて、Raycast、SphereCastで調べようとした。
色々なサイトをめぐり調べました。
SphereCastがなかなかうまくいかなくて
困ったけど・・・
何とかなりました。
/////////////////////////////////////////
物体があるかどうかRayを飛ばして調べる
/////////////////////////////////////////
const float RayCastMaxDistance = 0.2f;//長さ
//オブジェクトの現在位置から0.2f上の方向から下方向に向けて
Ray ray = new Ray(this.transform.position + Vector3.up * 0.2f, Vector3.down);
RaycastHit hitinfo;
if (Physics.Raycast(ray, out hitinfo, RayCastMaxDistance, 1 << LayerMask.NameToLayer("Ground")))
{
int rayDis = 1;
}
//Rayの長さ
float maxDistance = 10.0f;
//可視化して調べる
Debug.DrawRay(ray.origin, ray.direction * maxDistance, Color.green, 5, false);
/*
地面にするオブジェクトのレイヤーの名前をGroundにしておく
レイヤーの番号
LayerMask.NameToLayer("Ground")
LayerMaskに設定するビットフィールド
1 << LayerMask.NameToLayer("Ground")
*/
/////////////////////////////////////////
SphereCast を 使った場合。
大きさがある分、少し楽かも?
/////////////////////////////////////////
const float RayCastMaxDistance = 0.2f;//長さ
Vector3 ray2 = transform.position + Vector3.up* RayCastMaxDistance;
RaycastHit hitinfo;
if (Physics.SphereCast(ray2, RayCastMaxDistance/2, -Vector3.up,out hitinfo,RayCastMaxDistance*1.1f,1<< LayerMask.NameToLayer("Ground")))
{
rayDis2 = 1;
}
/*
地面にするオブジェクトのレイヤーの名前をGroundにしておく
Physics.SphereCast(ray2, 太さ, -Vector3.up,out hitinfo,RayCastMaxDistance*1.1f,1<< LayerMask.NameToLayer("Ground"))
*/
Raycastの方は、大きさがない分、計算が少し楽。
SphereCastは、大きさがあるので、半径文の大きさを考えないと
地面の下から、出ている場合がある。
これで、ジャンプも組み込めるようになった。
- 関連記事
-
YouTubeで動画を定期的に出しています。ご視聴いただけると嬉しいです。
Reon Labo
- 2017/07/08(土) 22:45:22|
- その他
-
| トラックバック:0
-
| コメント:0