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

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

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

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

Unity

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

Q&A

解決済

1回答

370閲覧

NavMeshSurfaceのベイクでオブジェクト上にできるメッシュをなくしたい

pikechi

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2022/09/02 06:42

前提

ボクセルのステージでブロックを積み上げた際に、
NavMeshSurfaceで動的にメッシュを生成すると画像のようになってしまいます。
オブジェクトの上にメッシュを作りたくないのですがNotworkableなどを試してもうまくいきません。
解決方法がありましたらご教授ください。

イメージ説明
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

NavMeshModifierを使えば可能だろうと思うのですが...「Notworkableなどを試してもうまくいきません」とおっしゃるのは、具体的にはどのような手順をとられたのでしょうか?
試しに下記のようなスクリプトを空のゲームオブジェクトにアタッチして...

C#

1using System.Linq; 2using UnityEngine; 3using UnityEngine.AI; 4 5#if UNITY_EDITOR 6using UnityEditor; 7using UnityEditor.AI; 8 9[CanEditMultipleObjects] 10[CustomEditor(typeof(Map))] 11internal class MapEditor : Editor 12{ 13 private SerializedProperty wallAreaProperty; 14 15 public override void OnInspectorGUI() 16 { 17 base.OnInspectorGUI(); 18 this.serializedObject.Update(); 19 NavMeshComponentsGUIUtility.AreaPopup("Wall Area Type", this.wallAreaProperty); 20 this.serializedObject.ApplyModifiedProperties(); 21 } 22 23 private void OnEnable() 24 { 25 this.wallAreaProperty = this.serializedObject.FindProperty("wallArea"); 26 } 27} 28#endif 29 30public class Map : MonoBehaviour 31{ 32 [SerializeField] private Texture2D source; 33 [SerializeField][HideInInspector] private int wallArea; 34 35 private GameObject[] walls; 36 private NavMeshSurface surface; 37 38 private void Start() 39 { 40 this.surface = gameObject.AddComponent<NavMeshSurface>(); 41 this.surface.collectObjects = CollectObjects.Children; 42 43 // 実験材料として、Quadの地面とCubeを並べた壁を用意する 44 var width = this.source.width; 45 var height = this.source.height; 46 var ground = GameObject.CreatePrimitive(PrimitiveType.Quad).transform; 47 ground.name = "Ground"; 48 ground.SetPositionAndRotation( 49 new Vector3(width * 0.5f, 0.0f, height * 0.5f), 50 Quaternion.Euler(90.0f, 0.0f, 0.0f)); 51 ground.localScale = new Vector3(width, height, 1.0f); 52 ground.SetParent(this.transform); 53 this.walls = this.source.GetPixels32().Select((c, i) => (c, i)).Where(p => p.c.r > 0).Select( 54 p => 55 { 56 var x = p.i % width; 57 var z = p.i / width; 58 var t = GameObject.CreatePrimitive(PrimitiveType.Cube).transform; 59 t.name = $"Wall ({x}, {z})"; 60 t.position = new Vector3(x + 0.5f, 0.5f, z + 0.5f); 61 t.SetParent(this.transform); 62 return t.gameObject; 63 }).ToArray(); 64 65 // 壁役のCubeにはNavMeshModifierをアタッチしてエリア種別を指定する 66 foreach (var wall in this.walls) 67 { 68 var modifier = wall.AddComponent<NavMeshModifier>(); 69 modifier.overrideArea = true; 70 modifier.area = this.wallArea; 71 } 72 } 73 74 private void Update() 75 { 76 // スペースキーを押したらビルドを行う 77 if (Input.GetKeyDown(KeyCode.Space)) 78 { 79 this.surface.BuildNavMesh(); 80 } 81 } 82}

下記のエリア指定部分のコードをコメントアウトした状態で実行すると、

C#

1 // 壁役のCubeにはNavMeshModifierをアタッチしてエリア種別を指定する 2 foreach (var wall in this.walls) 3 { 4 var modifier = wall.AddComponent<NavMeshModifier>(); 5 modifier.overrideArea = true; 6 modifier.area = this.wallArea; 7 }

下図のように壁の上にも通行可能エリアが発生してしまいましたが...

図1

コメントアウトを解除し、さらにインスペクター上で壁エリアを「Not Walkable」に設定したところ、

図2

壁の上には通行可能エリアが発生しなくなりました。

図3

ご質問者さんのスクリプトと比較して気になる点が思い当たりましたら、スクリプトをご提示いただければさらに調べてみようかと思います。

投稿2022/09/03 15:17

編集2022/09/03 23:56
Bongo

総合スコア10807

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

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

pikechi

2022/09/06 08:22

NavMeshModifierを試してみます。 元は壁に当たる部分の上面もベイクされておりagentも生成されました。 試したのは、workableを行った後にNotworkableを床面以外に行いました。 結果は、壁に当たる部分の上面もベイクされていましたが、agentは生成されなくなりました。 Bongo様のスクリプトをもとに書き換えて表示上も消えるか試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問