質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1024閲覧

RigidbodyやAddforceの代わりにRaycastを使ってジャンプや重力をつけたい

Hagiaki

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/02/18 16:28

編集2022/02/20 04:53

前提・実現したいこと

Unityでタイトルの通りRigidbodyやAddforceを使わず、代わりにRaycastなどを用いた操作キャラクターの動きを制作しています。
スペースキーでジャンプする機能を実装中に以下の問題が発生しました。

発生している問題

ジャンプして地面から足が離れている時にfalse判定を出したいのだがRaycastが伸びてtrue判定のままになる

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 public float speed = 5.0f; 8 public float jump = 10.0f; 9 Animator PlayerAnimator; 10 private float distance = 1.0f; 11 protected float gravity = 1.0f; 12 void Start() 13 { 14 PlayerAnimator = GetComponent<Animator>(); 15 } 16 17 void Update() 18 { 19 Vector3 moveDirection = new Vector3(0, 0, 0); 20 Vector3 jumpDirection = new Vector3(0, 0, 0); 21 22 //Raycast処理全般 23 Vector3 rayPosition = transform.position + new Vector3(0.0f, 0.8f, 0.0f); 24 RaycastHit hitinfo; 25 Ray ray = new Ray(rayPosition, Vector3.down); 26 bool isGround = Physics.Raycast(ray, out hitinfo); 27 distance = hitinfo.distance; 28 transform.position = hitinfo.point;//接地している間はYのみ。 29 Debug.DrawRay(rayPosition, Vector3.down * distance, Color.red); 30 31 32 if (Input.GetKey(KeyCode.UpArrow)) 33 { 34 moveDirection.z = 1; 35 } 36 if (Input.GetKey(KeyCode.DownArrow)) 37 { 38 moveDirection.z = -1; 39 } 40 if (Input.GetKey(KeyCode.RightArrow)) 41 { 42 moveDirection.x = 1; 43 } 44 if (Input.GetKey(KeyCode.LeftArrow)) 45 { 46 moveDirection.x = -1; 47 } 48 49 if (Input.GetKeyDown(KeyCode.Space)) 50 { 51 jumpDirection.y = 1; 52 PlayerAnimator.SetBool("JUMP", true); 53 } 54 else 55 { 56 PlayerAnimator.SetBool("JUMP", false); 57 } 58 59   //Raycastが当たっていない(地面に足を付けていない)状態だと下に進み続けるようにしたい 60 if (isGround == false) 61 { 62 jumpDirection.y -= 1 * Time.deltaTime; 63 } 64 65 moveDirection.Normalize();//正規化 66 jumpDirection.Normalize(); 67 68 if (moveDirection.magnitude > 0.01f)//方向切替と走るモーションの管理 69 { 70 transform.rotation = Quaternion.LookRotation(moveDirection); 71 PlayerAnimator.SetBool("RUNNING", true); 72 } 73 else 74 { 75 PlayerAnimator.SetBool("RUNNING", false); 76 } 77 78 moveDirection *= speed * Time.deltaTime; 79 jumpDirection *= jump * Time.deltaTime; 80 transform.position += moveDirection; 81 transform.position += jumpDirection; 82 Debug.Log(isGround); 83 } 84} 85

試したこと

transform.position = hitinfo.point;をコメントアウト
→落下してくれない

アニメーション処理のPlayerAnimator.SetBool("JUMP", false);のすぐ上にjumpDirection.y = 1;と記述
→挙動がおかしくなる

補足情報(FW/ツールのバージョンなど)

Visual Studio 2022
Unity 2020 3.4f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご提示のコードではbool isGround = Physics.Raycast(ray, out hitinfo);となっており、レイキャストの距離を指定していないご様子ですね。下記のようにRaycastの第3引数で距離を指定して、足元の少し下までだけ判定させるようにしてみてはいかがでしょうか。
なお、回答末尾の実演映像を撮影するため、他の箇所にもいくらか変更を加えてしまいました。ご容赦ください...

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 public float speed = 5.0f; 8 public float jump = 10.0f; 9 Animator PlayerAnimator; 10 private float distance = 1.0f; 11 protected float gravity = 1.0f; 12 13 // ジャンプ時の等加速度運動を表現するため 14 // 垂直速度を表すフィールドを追加 15 private float verticalVelocity; 16 17 void Start() 18 { 19 PlayerAnimator = GetComponent<Animator>(); 20 } 21 22 void Update() 23 { 24 Vector3 moveDirection = new Vector3(0, 0, 0); 25 26 //Raycast処理全般 27 Vector3 rayPosition = transform.position + new Vector3(0.0f, 0.8f, 0.0f); 28 RaycastHit hitinfo; 29 Ray ray = new Ray(rayPosition, Vector3.down); 30 31 // レイキャストの距離を0.81まで(足の下0.01まで)に制限するよう変更 32 // また、離陸時の地面検出を無効化するために垂直速度の条件を追加 33 bool isGround = Physics.Raycast(ray, out hitinfo, 0.81f) && verticalVelocity <= 0; 34 distance = hitinfo.distance; 35 36 if (isGround) 37 { 38 transform.position = hitinfo.point; 39 verticalVelocity = 0; 40 } 41 42 Debug.DrawRay(rayPosition, Vector3.down * distance, Color.red); 43 44 45 if (Input.GetKey(KeyCode.UpArrow)) 46 { 47 moveDirection.z = 1; 48 } 49 if (Input.GetKey(KeyCode.DownArrow)) 50 { 51 moveDirection.z = -1; 52 } 53 if (Input.GetKey(KeyCode.RightArrow)) 54 { 55 moveDirection.x = 1; 56 } 57 if (Input.GetKey(KeyCode.LeftArrow)) 58 { 59 moveDirection.x = -1; 60 } 61 62 if (Input.GetKeyDown(KeyCode.Space)) 63 { 64 // ジャンプ時に接地しているかどうかは考慮していないので、現状では空中でも 65 // ジャンプできてしまいますが、ひとまずそれはそういう仕様だということにしました 66 verticalVelocity = jump; 67 PlayerAnimator.SetBool("JUMP", true); 68 } 69 else 70 { 71 PlayerAnimator.SetBool("JUMP", false); 72 } 73 74 //Raycastが当たっていない(地面に足を付けていない)状態だと下に進み続けるようにしたい 75 if (isGround == false) 76 { 77 // 空中にいるときは下方向に加速する 78 // gravityが1.0というのは月面よりも小さな重力ですので、だいぶふわっとした印象になるかと思います 79 verticalVelocity -= gravity * Time.deltaTime; 80 } 81 82 moveDirection.Normalize();//正規化 83 84 if (moveDirection.magnitude > 0.01f)//方向切替と走るモーションの管理 85 { 86 transform.rotation = Quaternion.LookRotation(moveDirection); 87 PlayerAnimator.SetBool("RUNNING", true); 88 } 89 else 90 { 91 PlayerAnimator.SetBool("RUNNING", false); 92 } 93 94 moveDirection *= speed * Time.deltaTime; 95 Vector3 translation = moveDirection; 96 translation.y += verticalVelocity * Time.deltaTime; 97 transform.position += translation; 98 Debug.Log(isGround); 99 } 100}

図

投稿2022/02/19 19:53

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問