🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

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

Q&A

解決済

2回答

2706閲覧

NavMeshAgentで互いに押し合いをさせたい。

negitam-31

総合スコア44

Unity3D

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

0グッド

0クリップ

投稿2021/01/05 01:47

前提・実現したいこと

NavMeshAgent同士をすれ違わずに衝突させて押し合いをさせたいです。
NavMeshAgent同士ですれ違うように動くのは望ましくありません。

試したこと

NavMeshAgentコンポーネントのQualityをHighQuality〜LowQuakityにしましたがすれ違うように動いてしまうので今回の実現したいことの達成につながりませんでした。
またどちらもNavMeshAgentなのでRigidBodyはIs Kinematicにしなければいけません。
よろしくお願いします。

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

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

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

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

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

guest

回答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

CraftTable

総合スコア234

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

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

negitam-31

2021/01/09 13:11

非常に参考になりました!ありがとうございます!
guest

0

  1. 1秒に一回目的地までの経路を計算。
  2. 経路を取得(更新)
  3. 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

negitam-31

総合スコア44

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問