プレイヤー同士10人が戦う3Dゲームを作っています。
プレイヤーが人数分集まらなかった時のためにbotを作り、それを動かすためのコードを今書いているのですが、上手く動かない部分があります。
このbotにやらせたい挙動は以下です。
1.他のプレイヤーを追いかけさせたい
2.他プレイヤーに近距離まで近づいたら追いかける対象を切り替えるようにしたい
3.常にプレイヤーを追いかけ続けると、bot同士が互いに追いかけ続けて一か所に固まってしまうので、4秒間の移動距離が指定した数より少なかったら追いかけるのをやめ、最も遠いオブジェクト(設置物)を目指して4秒間だけ進み、そのあとまたプレイヤーを追いかけ始めるようにしたい
上記の1と2はできたのですが、3がうまくできません。
このbotのコードは下のもので、3を処理している部分はコードの一番下のif文です。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class UnkoBot : MonoBehaviour { NavMeshAgent agent; GameObject[] AllUnkoman; GameObject disObject; int Chasetarget; int sakkino; int ObjTarget; Vector3 UnkomanPos; Vector3 movementDif; Vector3 movement; bool ChaseMode; float StayTime; float NotChaseTime; bool ObjContact; void Start() { agent = GetComponent<NavMeshAgent>(); AllUnkoman = GameObject.FindGameObjectsWithTag("Player"); Chasetarget = Random.Range(0, AllUnkoman.Length); UnkomanPos = this.transform.position; ChaseMode = true; ObjContact = false; } void OnTriggerEnter(Collider other) { if(other.gameObject.tag == "Player") { Chasetarget = Random.Range(0, AllUnkoman.Length); while (Chasetarget == sakkino) { Chasetarget = Random.Range(0, AllUnkoman.Length); } } } void OnCollisionEnter(Collision collision) { if(collision.gameObject.tag == "Object") { ObjContact = true; } } GameObject searchTag(GameObject nowObj, string Object) { float tmpDis = 0; float nearDis = 0; GameObject targetObj = null; foreach (GameObject obs in GameObject.FindGameObjectsWithTag("Object")) { tmpDis = Vector3.Distance(obs.transform.position, nowObj.transform.position); if (nearDis < tmpDis) { nearDis = tmpDis; targetObj = obs; } } return targetObj; } void Update() { if (AllUnkoman[Chasetarget] == this.gameObject) { Chasetarget = Random.Range(0, AllUnkoman.Length); } sakkino = Chasetarget; Debug.Log(ChaseMode); if (ChaseMode == true) { StayTime += Time.deltaTime; agent.destination = AllUnkoman[Chasetarget].transform.position; if (StayTime < 4f) { movementDif = this.transform.position - UnkomanPos; movement += movementDif; } if (StayTime >= 4f) { if (movement.magnitude <= 20) { ChaseMode = false; } StayTime = 0f; movement = Vector3.zero; } } UnkomanPos = this.transform.position; if(ChaseMode == false) { NotChaseTime += Time.deltaTime; disObject = searchTag(gameObject, "Object"); agent.destination = disObject.transform.position; if(NotChaseTime > 4f || ObjContact == true) { ChaseMode = true; ObjContact = false; } } } }
botは7体設置しています。
上記の3の部分で、2つの問題があります。
・Debug.Logで確認しましたが、ChaseModeがfalseになっているのにも関わらず、設置物のオブジェクトを目指して進んでくれません。また、行き先のオブジェクトの取得も問題なくできています。
・実行して4秒経つと、ChaseModeがflaseになるのですが、なぜかfalseの状態が8秒続き、8秒後にtrueになったあと再びfalseになることがありません。
この問題の原因が何なのか、1日自分で考えましたが分かりませんでした。
どなたかわかる方がいましたら教えてください。
回答1件
あなたの回答
tips
プレビュー