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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

764閲覧

BoxCollider内に入ったら敵を追従させたい

Um_kok

総合スコア39

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/09/02 03:24

編集2020/09/02 03:34

こんにちはUnityで3DFPSを作っています。
処理が難しくなってきたので分からなくなってきました。
敵を追従する処理ですが、なぜかBoxCollider内に入っても、敵が追従されません
何がいけないのでしょうか?回答お願いします。フラグの判定難しいですね
↓参考にさせていただいている方のサイト
https://gametukurikata.com/program/enemychasechara
↓敵のスクリプト

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.AI; 4 5public class MoveEnemy : MonoBehaviour 6{ 7 8 public enum EnemyState 9 { 10 Walk, 11 Wait, 12 Chase 13 }; 14 15 private CharacterController enemyController; 16 private Animator animator; 17 // 目的地 18 private Vector3 destination; 19 // 歩くスピード 20 [SerializeField] 21 private float walkSpeed = 1.0f; 22 // 速度 23 private Vector3 velocity; 24 // 移動方向 25 private Vector3 direction; 26 // 到着フラグ 27 private bool arrived; 28 // SetPositionスクリプト 29 private SetPosition setPosition; 30 // 待ち時間 31 [SerializeField] 32 private float waitTime = 5f; 33 // 経過時間 34 private float elapsedTime; 35 // 敵の状態 36 private EnemyState state; 37 // 追いかけるキャラクター 38 private Transform playerTransform; 39 // エージェント 40 private NavMeshAgent navMeshAgent; 41 // 回転スピード 42 [SerializeField] 43 private float rotateSpeed; 44 45 // Use this for initialization 46 void Start() 47 { 48 navMeshAgent = GetComponent<NavMeshAgent>(); 49 enemyController = GetComponent<CharacterController>(); 50 animator = GetComponent<Animator>(); 51 setPosition = GetComponent<SetPosition>(); 52 setPosition.CreateRondomPosition(); 53 destination = setPosition.GetDestination(); 54 velocity = Vector3.zero; 55 arrived = false; 56 elapsedTime = 0f; 57 SetState(EnemyState.Walk); 58 } 59 60 // Update is called once per frame 61 void Update() 62 { 63 // 見回りまたはキャラクターを追いかける状態 64 if (state == EnemyState.Walk || state == EnemyState.Chase) 65 { 66 // キャラクターを追いかける状態であればキャラクターの目的地を再設定 67 if (state == EnemyState.Chase) 68 { 69 setPosition.SetDestination(playerTransform.position); 70 } 71 if (enemyController.isGrounded) 72 { 73 velocity = Vector3.zero; 74 animator.SetFloat("Speed", 2.0f); 75 direction = (setPosition.GetDestination() - transform.position).normalized; 76 transform.LookAt(new Vector3(setPosition.GetDestination().x, transform.position.y, setPosition.GetDestination().z)); 77 velocity = direction * walkSpeed; 78 } 79 80 // 目的地に到着したかどうかの判定 81 if (Vector3.Distance(transform.position, setPosition.GetDestination()) < 0.5f) 82 { 83 SetState(EnemyState.Wait); 84 animator.SetFloat("Speed", 0.0f); 85 } 86 // 到着していたら一定時間待つ 87 } 88 else if (state == EnemyState.Wait) 89 { 90 elapsedTime += Time.deltaTime; 91 92 // 待ち時間を越えたら次の目的地を設定 93 if (elapsedTime > waitTime) 94 { 95 SetState(EnemyState.Walk); 96 } 97 } 98 velocity.y += Physics.gravity.y * Time.deltaTime; 99 enemyController.Move(velocity * Time.deltaTime); 100 } 101 102 //if(state == EnemyState.Dead) 103 //{ 104 // return; 105 //} 106 107 // if (!arrived) 108 // { 109 // if (enemyController.isGrounded) 110 // { 111 // velocity = Vector3.zero; 112 // animator.SetFloat("Speed", 2.0f); 113 // direction = (destination - transform.position).normalized; 114 // transform.LookAt(new Vector3(destination.x, transform.position.y, destination.z)); 115 // velocity = direction * walkSpeed; 116 // Debug.Log(destination); 117 // } 118 // velocity.y += Physics.gravity.y * Time.deltaTime; 119 // enemyController.Move(velocity * Time.deltaTime); 120 121 // // 目的地に到着したかどうかの判定 122 // if (Vector3.Distance(transform.position, destination) < 0.5f) 123 // { 124 // arrived = true; 125 // animator.SetFloat("Speed", 0.0f); 126 // } 127 // // 到着していたら 128 // } 129 // else 130 // { 131 // elapsedTime += Time.deltaTime; 132 133 // // 待ち時間を越えたら次の目的地を設定 134 // if (elapsedTime > waitTime) 135 // { 136 // setPosition.CreateRondomPosition(); 137 // destination = setPosition.GetDestination(); 138 // arrived = false; 139 // elapsedTime = 0f; 140 // } 141 // Debug.Log(elapsedTime); 142 // } 143 public void SetState(EnemyState tempState, Transform targetObj = null) 144 { 145 if (tempState == EnemyState.Walk) 146 { 147 arrived = false; 148 elapsedTime = 0f; 149 state = tempState; 150 setPosition.CreateRondomPosition(); 151 } 152 else if (tempState == EnemyState.Chase) 153 { 154 state = tempState; 155 // 待機状態から追いかける場合もあるのでOFF 156 arrived = false; 157 // 追いかける対象をセット 158 playerTransform = targetObj; 159 } 160 else if (tempState == EnemyState.Wait) 161 { 162 elapsedTime = 0f; 163 state = tempState; 164 arrived = true; 165 velocity = Vector3.zero; 166 animator.SetFloat("Speed", 0f); 167 } 168 } 169 // 敵キャラクターの状態取得メソッド 170 public EnemyState GetState() 171 { 172 return state; 173 } 174} 175

↓サーチエリア(コライダ)に主人公が進入したか調べるスクリプト

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SearchCharacter : MonoBehaviour 6{ 7 8 private MoveEnemy moveEnemy; 9 10 // Start is called before the first frame update 11 void Start() 12 { 13 moveEnemy = GetComponentInParent<MoveEnemy>(); 14 } 15 16 // Update is called once per frame 17 void Update() 18 { 19 20 } 21 22 private void OnTriggerStay(Collider col) 23 { 24 // プレイヤーキャラクタを発見 25 if (col.tag == "Player") 26 { 27 // 敵キャラクターの状態を取得 28 MoveEnemy.EnemyState state = moveEnemy.GetState(); 29 // 敵キャラクターが追いかける状態でなければ追いかける設定に変更 30 if (state != MoveEnemy.EnemyState.Chase) 31 { 32 Debug.Log("プレイヤーを発見"); 33 moveEnemy.SetState(MoveEnemy.EnemyState.Chase, col.transform); 34 } 35 } 36 } 37 38 private void OnTriggerExit(Collider col) 39 { 40 if (col.tag == "Player") 41 { 42 Debug.Log("見失う"); 43 moveEnemy.SetState(MoveEnemy.EnemyState.Wait); 44 } 45 } 46 47} 48

↓目的地せっていのスクリプト

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SetPosition : MonoBehaviour 6{ 7 //初期位置 8 private Vector3 startPosition; 9 //目的地 10 private Vector3 destination; 11 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 // 初期位置を設定 17 startPosition = transform.position; 18 SetDestination(transform.position); 19 } 20 21 // Update is called once per frame 22 void Update() 23 { 24 25 } 26 27 //ランダムな位置の作成 28 public void CreateRondomPosition() 29 { 30 //ランダムなVector2の値を得る 31 var randDestination = Random.insideUnitCircle * 8; 32 // 現在地にランダムな位置を足して目的地とする 33 SetDestination(startPosition + new Vector3(randDestination.x, 0, randDestination.y)); 34 } 35 36 //目的地を設定する 37 public void SetDestination(Vector3 position) 38 { 39 destination = position; 40 } 41 42 //目的地を取得する 43 public Vector3 GetDestination() 44 { 45 return destination; 46 } 47 48} 49

やった事
いらなそうなところをコメントアウトしてたりしているのですが、できなかったです。
BoxColliderのIsTriggerにもチェックを入れています。
まだまだ未熟者故、理解しがたいかもしれませんがご教授お願いします。

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

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

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

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

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

guest

回答1

0

自己解決

サーチエリアのスクリプトを敵キャラにアタッチしていませんでした。
こんな初歩的なミスとは、、、ちゃんと確認しないとですね

投稿2020/09/02 04:25

Um_kok

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問