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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity3D

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

Q&A

解決済

1回答

1473閲覧

CharacterControllerのIsGroundedも補助のRayも反応しない

yuki_snow

総合スコア27

Unity3D

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

1グッド

0クリップ

投稿2021/09/13 03:38

前提・実現したいこと

お世話になります。
Unity2020.3.10f1でアクションゲームの敵AIを作っています。
敵CPU(写真右)が接地していたらtrueを返しfalseなら下に飛ばしたRayで地面を検知して真偽の値を返すという処理を行っています。
望む結果としてはIsGroundedもしくはRayの結果をtrueにしたいです。
イメージ説明

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

現状として、Isgroundedはfalseを返し、Rayも特にレイヤーなどを指定していないのにfalseを返します。プレイヤーとしておいてあるオブジェクトにはRayは無くともIsgroundedで接地判定を取っていますがそちらは正常に作動しています。

該当のソースコード

C#

1ソースコード 2using UnityEngine; 3using UnityEngine.AI; 4 5//CPU操作 6public class CPUCon : MonoBehaviour 7{ 8 public GameObject NearTarget; //最も近い敵 9 private NavMeshAgent CpuAgent; //CPUのエージェント 10 private CharacterController controller; //キャラクターコントローラー 11 private Ray IsGroundedRay; //地面判定光線 12 13 public float speed = 6.0F; //歩行速度 14 public float jumpSpeed = 8.0F; //ジャンプ力 15 public float gravity = 20.0F; //重力の大きさ 16 17 private Vector3 moveDirection = Vector3.zero; 18 private bool IsJump = false; //ジャンプフラグ 19 private float h = 0; //左右矢印キーの値(-1.0~1.0) 20 private float searchTime = 0; //探索時間 21 22 // Start is called before the first frame update 23 void Start() 24 { 25 CpuAgent = GetComponent<NavMeshAgent>(); //NavmeshAgentを取得 26 controller = GetComponent<CharacterController>(); //キャラクターコントローラー 27 NearTarget = SerchTag(gameObject, "Character"); //自分以外の最も近い敵を探索 28 } 29 30 // Update is called once per frame 31 void Update() 32 { 33 OnGroundCheck(); //接地判定 34 SerchCharacter(); //近場の敵を探索 35 Debug.Log(CheckGrounded()); //接地判定のログ 36 Debug.DrawRay(transform.position + Vector3.up * 0.1f, Vector3.down, Color.red); //レイ可視化 37 } 38 39 //接地判定 40 public bool CheckGrounded() 41 { 42 if (controller.isGrounded) return true; //接地判定取れたら真を返す 43 44 //Debug.Break(); 45 //isGrounded取れなかったために補助 46 //下に向けてRayを飛ばす 47 IsGroundedRay = new Ray(transform.position + Vector3.up * 0.1f, Vector3.down); 48 //探索距離 49 float SerchDis = 0.5f; 50 //StageFieldレイヤーでなんかに当たればTrueを返す 51 return Physics.Raycast(IsGroundedRay, SerchDis,LayerMask.NameToLayer("StageField")); 52 } 53 54 void OnGroundCheck() 55 { 56 57 if (controller.isGrounded) //接地していれば 58 { 59 CpuAgent.isStopped = false; 60 //moveDirection.y -= gravity * Time.deltaTime; 61 } 62 else 63 { 64 CpuAgent.isStopped = true; 65 //moveDirection.y -= gravity * Time.deltaTime; 66 } 67 } 68} 69 70

試したこと

Physics.Raycastのレイヤー指定をDefaultにしてみたり→falseでした。
Rayの長さを

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

Unity2020.3.10f1
Visual Stadio2019

退会済みユーザー👍を押しています

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

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

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

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

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

YOshim

2021/09/13 04:34

NavMeshがない場合でも同様でしょうか。
yuki_snow

2021/09/13 04:58

追記:起動時敵CPUのY座標が動かないことに気が付き無理やりしたに降ろしたらRayが反応いたしました。 ですが.IsGroundedは反応無しでマウスを外せばすぐにFalseになりました
YOshim

2021/09/13 05:23

こちらに気づかず回答に記載してしまいました。 isGroundedもy座標の位置関係によっては反応しない場合があります。 Player側で正常に動作している、NavMeshは無関係そうということで、単純にy座標・位置関係によるものとと推測しています。
guest

回答1

0

ベストアンサー

単純なCubeを用いて同様の環境を構築し確認したところ、正常に設置判定できました。
Update関数にcontroller.Move(moveDirection * Time.deltaTime);を追記しOnGroundCheck関数を下記に修正したもので確認できますでしょうか。

void OnGroundCheck(){ if (controller.isGrounded) //接地していれば { //CpuAgent.isStopped = false; } else { //CpuAgent.isStopped = true; moveDirection.y -= 0.02f; } }

CPUのy座標によってisGroundedが機能しないことがあります。

投稿2021/09/13 05:12

YOshim

総合スコア1085

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

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

yuki_snow

2021/09/13 05:57

Update関数にcontroller.Move(moveDirection * Time.deltaTime);を追記し、moveDirectionに下向き(重力)を追加したところisGroundedもRayも反応することができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問