前提・実現したいこと
NavMeshAgent同士をすれ違わずに衝突させて押し合いをさせたいです。
NavMeshAgent同士ですれ違うように動くのは望ましくありません。
試したこと
NavMeshAgentコンポーネントのQualityをHighQuality〜LowQuakityにしましたがすれ違うように動いてしまうので今回の実現したいことの達成につながりませんでした。
またどちらもNavMeshAgentなのでRigidBodyはIs Kinematicにしなければいけません。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
だいぶ前に書いたコードですが・・・
[SerializeField] NavMeshAgent nav; GameObject Target; [SerializeField] Rigidbody rb; Vector3 WalkTargetPoint; [SerializeField] float Speed void Start() { nav.SetDestination(Target.transform.position); } void Update() { if (nav.pathPending == false) { WalkTargetPoint = nav.path.corners[1]; Quaternion Point = Quaternion.LookRotation(WalkTargetPoint - transform.position); Point.x = 0; Point.z = 0; transform.rotation = Point; rb.AddForce(transform.forward * Speed); } }
NavMesh系統の移動をRigidBodyの移動に変換するスクリプトです
navの中に自分のNavMeshAgent、rbの中に自分のRigidBodyを入れて、Speedの値を調整したら動くはずです
NavMeshAgentのターゲットにTargetの中に入れたオブジェクトを入れ、
経路探索の中にある次の座標だけを取得して次の進む方向に変換して向け、
その方向にAddForceで直進移動しています
複雑な行動をするには向いてないかもしれませんが、このスクリプトをつけたオブジェクトにコライダーをつければ接触してくれると思います
ご参考程度にどうぞ
投稿2021/01/08 14:12
総合スコア234
0
- 1秒に一回目的地までの経路を計算。
- 経路を取得(更新)
- Vector3配列の経路を順番にLookRotationと+=transform.forwardで経路の角まで前進。
C#
1void Update() 2 { 3 SetTimer -= Time.deltaTime; 4 if (SetTimer<=0) 5 { 6 if (!Damage) 7 { 8 Rigid.velocity = Vector3.zero; 9 } 10 MeshAgent.enabled = true; 11 if (!Attack) 12 { 13 MeshAgent.SetDestination(Target.position); 14 MeshPath = new NavMeshPath(); 15 MeshAgent.CalculatePath(Target.position, MeshPath); 16 MovePoint = 1; 17 //line.positionCount = MeshPath.corners.Length; 18 //line.SetPositions(MeshPath.corners); 19 } 20 21 Ray ray = new Ray(RayShot.position, transform.forward); 22 RaycastHit hit; 23 if (Physics.Raycast(ray, out hit)) 24 { 25 if (hit.collider.CompareTag("Agent")) 26 { 27 Agent agent = hit.collider.GetComponent<Agent>(); 28 if (OwnerNumber != agent.OwnerNumber) 29 { 30 MeshAgent.SetDestination(agent.transform.position); 31 MeshPath = new NavMeshPath(); 32 MeshAgent.CalculatePath(agent.transform.position, MeshPath); 33 MovePoint = 1; 34 //line.positionCount = MeshPath.corners.Length; 35 //line.SetPositions(MeshPath.corners); 36 } 37 else { Attack = false; } 38 } 39 else { Attack = false; } 40 } 41 else { Attack = false; } 42 43 SetTimer = SetTMax; 44 45 MeshAgent.enabled = false; 46 } 47 48 if (Damage) 49 { 50 DamageTimer -= Time.deltaTime; 51 Rigid.velocity *= 0.98f; 52 if (DamageTimer <= 0) 53 { 54 Rigid.velocity = Vector3.zero; 55 Damage = false; 56 DamageTimer = DamageTMax; 57 } 58 } 59 else if (MeshPath != null && MeshPath.corners.Length > 0) 60 { 61 MeshMove(MeshPath.corners, ref MovePoint); 62 } 63 } 64 65 private void OnCollisionEnter(Collision collision) 66 { 67 var other = collision.gameObject; 68 if (other.CompareTag("Agent") && !Damage) 69 { 70 Agent agent = other.GetComponent<Agent>(); 71 if (OwnerNumber != agent.OwnerNumber) 72 { 73 Damage = true; 74 HitPoint -= agent.GiveDamage; 75 if (HitPoint <= 0) 76 { 77 Destroy(this.gameObject); 78 } 79 else 80 { 81 var direction = other.transform.position - transform.position; 82 direction.y = 0; 83 var lookRotation = Quaternion.LookRotation(direction, Vector3.up); 84 transform.rotation = lookRotation; 85 Rigid.AddForce(-transform.forward * 3, ForceMode.Impulse); 86 } 87 } 88 } 89 } 90 91 void MeshMove(Vector3[] route, ref int destPoint) 92 { 93 if (1f > (transform.position - route[destPoint]).magnitude) 94 { 95 if (destPoint < route.Length - 1) 96 { 97 destPoint++; 98 } 99 } 100 101 route[destPoint].y = 0; 102 var direction = route[destPoint] - transform.position; 103 direction.y = 0; 104 var lookRotation = Quaternion.LookRotation(direction, Vector3.up); 105 transform.rotation = Quaternion.Lerp(transform.rotation, lookRotation, 9f * Time.deltaTime); 106 107 transform.position += transform.forward * Time.deltaTime * Speed; 108 109 Vector3 rot = transform.eulerAngles; 110 rot.x = 0; 111 rot.z = 0; 112 transform.eulerAngles = rot; 113 }
投稿2021/01/09 13:15
総合スコア44
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/09 13:11