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

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

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

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

Unity

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

Q&A

解決済

2回答

1189閲覧

unity 敵が追跡を始める範囲について

yoshiteru21

総合スコア44

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/08/29 05:02

敵オブジェクトのboxcolliderで設定された範囲の中にプレイヤーが入れば追跡するというスクリプトを作成したのですが、
例えばstage1の範囲の中にプレイヤーがいれば追跡する、stage1から出れば追跡しない。という風にしたいのですがboxcolliderが敵が動くのと連動して動くのでstage1以外の場所でも追跡してきます。
boxcolliderを連動させず初めの位置に固定する方法、またはboxcolliderを使わずに追跡が始まる範囲を決める方法などがあればご教授おねがいします。

using

1using System.Collections.Generic; 2using UnityEngine; 3using UnityEngine.AI; 4using UnityStandardAssets.Characters.ThirdPerson; 5 6[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))] 7//[RequireComponent(typeof(ThirdPersonCharacter))] 8 9public class EnemyChase : MonoBehaviour 10{ 11 [System.NonSerialized] 12 public bool isActive = false; //isActiveをパブリック変数にしたので他のオブジェクトから敵キャラの追跡・停止を操作することもできるようになっています 13 14 [SerializeField] 15 Transform target; 16 17 NavMeshAgent agent; 18 ThirdPersonCharacter character; 19 20 void Start() 21 { 22 agent = GetComponent<NavMeshAgent>(); 23 // character = GetComponent<ThirdPersonCharacter>(); 24 25 agent.updateRotation = true; 26 agent.updatePosition = true; 27 } 28 29 private void Update() 30 { 31 if (isActive) 32 { 33 34 agent.isStopped = false; 35 36 if (target != null) 37 agent.SetDestination(target.position); 38 39 if (agent.remainingDistance > agent.stoppingDistance) 40 { 41 // character.Move(agent.desiredVelocity, false, false); 42 } 43 else 44 { 45 //character.Move(Vector3.zero, false, false); 46 } 47 } 48 else 49 { 50 //character.Move(Vector3.zero, false, false); 51 agent.isStopped = true; //isActiveがfalseのときはNavMeshAgentを停止。これで敵が止まる 52 53 return; 54 } 55 56 } 57 58 public void SetTarget(Transform target) 59 { 60 this.target = target; 61 } 62 63 //他のオブジェクトに接触したときの処理 64 void OnCollisionEnter(Collision other) 65 { 66 if (other.gameObject.tag == "Player") 67 { 68 Debug.Log("ゲームオーバーです。"); 69 70 isActive = false; 71 } 72 } 73 74 //検出範囲に入った時の処理 75 void OnTriggerStay(Collider other) 76 { 77 if (other.gameObject.tag == "Player") 78 { 79 isActive = true; 80 } 81 } 82 83 //検出範囲から出たときの処理 84 void OnTriggerExit(Collider other) 85 { 86 if (other.gameObject.tag == "Player") 87 { 88 isActive = false; 89 } 90 } 91} 92コード

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

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

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

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

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

guest

回答2

0

敵とは別に空のオブジェクト作成して、BoxColliderを付与すればいいと思います。
例えばこんな風にすれば連携出来ます。
(下記はざっくりとした考え方の提示なので適宜変更してください。
例えば今回は「EnemyがChaseAreaのisHitを見て分岐する」ようにしましたが「ChaseAreaがEnemyChaseのisActiveを変更させる」でもいいかもしれません。izmktrの回答のように考え方は色々あります)

C#

1// BoxCollider側に付けるスクリプト 2public class ChaseArea : MonoBehaviour { 3 public bool isHit; 4 5 //検出範囲に入った時の処理 6 void OnTriggerStay(Collider other) 7 { 8 if (other.gameObject.tag == "Player") 9 { 10 isHit = true; 11 } 12 } 13 14 //検出範囲から出たときの処理 15 void OnTriggerExit(Collider other) 16 { 17 if (other.gameObject.tag == "Player") 18 { 19 isHit = false; 20 } 21 } 22} 23 24 25// Enemy側に付けるスクリプト 26public class EnemyChase : MonoBehaviour { 27 // インスペクタ上からBoxColliderに付けたスクリプトをセットしておく 28 public ChaseArea area; 29 30 //(中略・他メソッドは元と同じ) 31 32 private void Update() 33 { 34 // 検出範囲に入っているかで判定 35 isActive = area.isHit; 36 37 // 以下は元と同じ 38 } 39}

別の方法(Physics.BoxCastAllとか)を使う方法もありますが、シーン上で見て分かりやすいので上記方法でいいんじゃないかと思います。

(書いてる内にizmktrさんと被りましたがせっかくなので投稿)

投稿2019/08/29 05:25

sakura_hana

総合スコア11427

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

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

yoshiteru21

2019/08/29 09:12

具体的に教えていただきありがとうございます。
guest

0

ベストアンサー

BoxColliderを敵につけるのではなく、一番上にGameObjectを置いてそれにつけるようにすればいいと思います

もしくは、PlayerがどのStageにいるのか、Playerクラスを介して取得できるようにして、
敵を追跡する時にPlayerのStageを見て、自分が追いかけるべきStageにいるのかチェックするのがいいと思います

投稿2019/08/29 05:17

izmktr

総合スコア2856

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

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

yoshiteru21

2019/08/29 09:09

ありがとうございます。まずは上記の方法から試したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問