前提
ボクセルのステージでブロックを積み上げた際に、
NavMeshSurfaceで動的にメッシュを生成すると画像のようになってしまいます。
オブジェクトの上にメッシュを作りたくないのですがNotworkableなどを試してもうまくいきません。
解決方法がありましたらご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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 }
下図のように壁の上にも通行可能エリアが発生してしまいましたが...
コメントアウトを解除し、さらにインスペクター上で壁エリアを「Not Walkable」に設定したところ、
壁の上には通行可能エリアが発生しなくなりました。
ご質問者さんのスクリプトと比較して気になる点が思い当たりましたら、スクリプトをご提示いただければさらに調べてみようかと思います。
投稿2022/09/03 15:17
編集2022/09/03 23:56総合スコア10807
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/06 08:22