68 changed files with 1626 additions and 2205 deletions
@ -1,9 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 22e0ca7122e219d469c71ad147e8e458 |
||||
guid: 93b129b1be6217745b7dcc39a8c2dbee |
||||
folderAsset: yes |
||||
timeCreated: 1515481210 |
||||
licenseType: Pro |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 8c93e628c36fcec45920eb138495f384 |
||||
PrefabImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,9 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 63b588f3892bb4b5eb73ad3d2791e05c |
||||
guid: 8fb08947a9e690a488383e4ddd92e6de |
||||
folderAsset: yes |
||||
timeCreated: 1477656493 |
||||
licenseType: Pro |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -0,0 +1,870 @@
|
||||
using System.Collections; |
||||
using System.Collections.Generic; |
||||
using UnityEngine; |
||||
using UnityEditor; |
||||
using UnityEngine.AI; |
||||
using System.IO; |
||||
using System.Text; |
||||
using System; |
||||
|
||||
public class SceneTools |
||||
{ |
||||
[MenuItem("SceneTools/SetFloorMessage")]//添加FloorMessage脚本绑定楼层信息 |
||||
public static void SetFloorMessage() |
||||
{ |
||||
Transform neiParent = GameObject.Find("shinei").transform.GetChild(0); |
||||
for (int i = 0; i < neiParent.childCount; i++) |
||||
{ |
||||
//Debug.Log(neiParent.GetChild(i).name); |
||||
if (!neiParent.GetChild(i).GetComponent<FloorMessage>()) |
||||
{ |
||||
neiParent.GetChild(i).gameObject.AddComponent<FloorMessage>(); |
||||
} |
||||
FloorMessage msg = neiParent.GetChild(i).GetComponent<FloorMessage>(); |
||||
msg.targetTrans = GetTarget(neiParent.GetChild(i)); |
||||
msg.buildNum = neiParent.name; |
||||
if (!neiParent.GetChild(i).name.ToLower().Contains("m")) |
||||
{ |
||||
string floornum = neiParent.GetChild(i).name.Substring |
||||
(neiParent.GetChild(i).name.ToLower().IndexOf("nei") + 3, neiParent.GetChild(i).name.Length - 3); |
||||
msg.floorNum = int.Parse(floornum); |
||||
msg.interlayerNum = 0; |
||||
} |
||||
else |
||||
{ |
||||
msg.floorNum = int.Parse(neiParent.GetChild(i).name.Substring |
||||
(neiParent.GetChild(i).name.ToLower().IndexOf("nei") + 3, neiParent.GetChild(i).name.ToLower().IndexOf("m") |
||||
- neiParent.GetChild(i).name.ToLower().IndexOf("nei") - 3)); |
||||
msg.interlayerNum = int.Parse(neiParent.GetChild(i).name.Substring |
||||
(neiParent.GetChild(i).name.ToLower().IndexOf("m") + 1, neiParent.GetChild(i).name.Length - |
||||
neiParent.GetChild(i).name.ToLower().IndexOf("m") - 1)); |
||||
} |
||||
} |
||||
Transform waiParent = GameObject.Find("shiwai").transform.GetChild(0); |
||||
for (int i = 0; i < waiParent.childCount; i++) |
||||
{ |
||||
//Debug.Log(waiParent.GetChild(i).name); |
||||
if (!waiParent.GetChild(i).GetComponent<FloorMessage>()) |
||||
{ |
||||
waiParent.GetChild(i).gameObject.AddComponent<FloorMessage>(); |
||||
} |
||||
FloorMessage msg = waiParent.GetChild(i).GetComponent<FloorMessage>(); |
||||
msg.buildNum = waiParent.name; |
||||
if (!waiParent.GetChild(i).name.ToLower().Contains("m")) |
||||
{ |
||||
string floornum = waiParent.GetChild(i).name.Substring |
||||
(waiParent.GetChild(i).name.ToLower().IndexOf("wai") + 3, waiParent.GetChild(i).name.Length - 3); |
||||
msg.floorNum = int.Parse(floornum); |
||||
msg.interlayerNum = 0; |
||||
} |
||||
else |
||||
{ |
||||
msg.floorNum = int.Parse(waiParent.GetChild(i).name.Substring |
||||
(waiParent.GetChild(i).name.ToLower().IndexOf("wai") + 3, waiParent.GetChild(i).name.ToLower().IndexOf("m") |
||||
- waiParent.GetChild(i).name.ToLower().IndexOf("wai") - 3)); |
||||
msg.interlayerNum = int.Parse(waiParent.GetChild(i).name.Substring |
||||
(waiParent.GetChild(i).name.ToLower().IndexOf("m") + 1, waiParent.GetChild(i).name.Length - |
||||
waiParent.GetChild(i).name.ToLower().IndexOf("m") - 1)); |
||||
} |
||||
} |
||||
} |
||||
static Transform GetTarget(Transform parent) |
||||
{ |
||||
for (int i = 0; i < parent.childCount; i++) |
||||
{ |
||||
if (parent.GetChild(i).name.ToLower().Contains("_floor") |
||||
|| parent.GetChild(i).name.ToLower().Contains("-floor") |
||||
) |
||||
{ |
||||
if (parent.GetChild(i).GetComponent<MeshRenderer>()) |
||||
return parent.GetChild(i); |
||||
} |
||||
} |
||||
|
||||
return parent; |
||||
} |
||||
[MenuItem("SceneTools/SetShiNei")]//添加寻路层(选中shinei对象设置,注:扶梯情况特殊没有包含) |
||||
public static void SetNavLayerShiNeiFloor() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Deep); |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if ((obj[i].name.ToLower().Contains("_floor") ||//地面 |
||||
obj[i].name.ToLower().Contains("lt") || |
||||
obj[i].name.ToLower().Contains("futi")|| |
||||
obj[i].name.ToLower().Contains("diban")) |
||||
&&obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(5, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform Template = GameObject.Find("CloneEnums").transform.Find("ShiNeiFloor"); |
||||
var CloneableEnums = Template.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
if (obj[i].GetComponentInParent<FloorMessage>()) |
||||
{ |
||||
FloorMessage fmg = obj[i].GetComponentInParent<FloorMessage>(); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().buildNum = fmg.buildNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().floorNum = fmg.floorNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().interlayerNum = fmg.interlayerNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shinei; |
||||
} |
||||
else |
||||
{ |
||||
Debug.LogError("上层各目录未找到FloorMessage脚本"); |
||||
} |
||||
} |
||||
if ((obj[i].name.ToLower().Contains("_wall") ||//墙面 |
||||
obj[i].name.ToLower().Contains("zhuzi") || |
||||
obj[i].name.ToLower().Contains("-wall")) && |
||||
obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<NavMeshModifier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<NavMeshModifier>(); |
||||
} |
||||
NavMeshModifier mod = obj[i].gameObject.GetComponent<NavMeshModifier>(); |
||||
mod.overrideArea = true; |
||||
mod.area = 1; |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiDiMianLouDing/CheNengZou")]//地面的楼顶(车能走),常见为地下建筑上的公路 |
||||
public static void DiMianLouDingCheNengZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("CarRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(3, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform Template = GameObject.Find("CloneEnums").transform.Find("CarRoad"); |
||||
var CloneableEnums = Template.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
if (obj[i].GetComponentInParent<FloorMessage>()) |
||||
{ |
||||
FloorMessage fmg = obj[i].GetComponentInParent<FloorMessage>(); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().buildNum = fmg.buildNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().floorNum = fmg.floorNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().interlayerNum = fmg.interlayerNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
else |
||||
{ |
||||
Debug.LogError("上层各目录未找到FloorMessage脚本"); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiDiMianLouDing/RenNengZou")]//地面的楼顶(人能走),常见为地下建筑上的小路 |
||||
public static void DiMianLouDingRenNengZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(2, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform Template = GameObject.Find("CloneEnums").transform.Find("ShiWaiSoldier"); |
||||
var CloneableEnums = Template.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
if (obj[i].GetComponentInParent<FloorMessage>()) |
||||
{ |
||||
FloorMessage fmg = obj[i].GetComponentInParent<FloorMessage>(); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().buildNum = fmg.buildNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().floorNum = fmg.floorNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().interlayerNum = fmg.interlayerNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
else |
||||
{ |
||||
Debug.LogError("上层各目录未找到FloorMessage脚本"); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiDiMianLouDing/DouBuZou")]//地面的楼顶(都不能走),常见为地下建筑上的花坛 |
||||
public static void DiMianLouDingDouBuZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("CarRoad"); |
||||
if (!obj[i].gameObject.GetComponent<NavMeshModifier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<NavMeshModifier>(); |
||||
} |
||||
NavMeshModifier mod = obj[i].gameObject.GetComponent<NavMeshModifier>(); |
||||
mod.overrideArea = true; |
||||
mod.area = 1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiPuTongLouDing/RenNengZou")]//普通的楼顶(人能走),常见为地上建筑的楼顶地板 |
||||
public static void PuTongLouDingRenNengZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(2, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform Template = GameObject.Find("CloneEnums").transform.Find("ShiNeiFloor"); |
||||
var CloneableEnums = Template.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
if (obj[i].GetComponentInParent<FloorMessage>()) |
||||
{ |
||||
FloorMessage fmg = obj[i].GetComponentInParent<FloorMessage>(); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().buildNum = fmg.buildNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().floorNum = fmg.floorNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().interlayerNum = fmg.interlayerNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
else |
||||
{ |
||||
Debug.LogError("上层各目录未找到FloorMessage脚本"); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiPuTongLouDing/DouBuZou")]//普通的楼顶(都不能走) |
||||
public static void PuTongLouDingDouBuZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<NavMeshModifier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<NavMeshModifier>(); |
||||
} |
||||
NavMeshModifier mod = obj[i].gameObject.GetComponent<NavMeshModifier>(); |
||||
mod.overrideArea = true; |
||||
mod.area = 1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiDiMian/CheNengZou")]//地面(车能走),常见为公路 |
||||
public static void DiMianCheNengZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("CarRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(2, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform CarRoad = GameObject.Find("CloneEnums").transform.Find("CarRoad"); |
||||
var CloneableEnums = CarRoad.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiDiMian/RenNengZou")]//地面(人能走),常见为小路 |
||||
public static void DiMianRenNengZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(2, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform CarRoad = GameObject.Find("CloneEnums").transform.Find("ShiWaiSoldier"); |
||||
var CloneableEnums = CarRoad.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetShiWaiDiMian/DouBuZou")]//地面(都不能走),常见为花坛 |
||||
public static void DiMianDouBuZou() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("CarRoad"); |
||||
if (!obj[i].gameObject.GetComponent<NavMeshModifier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<NavMeshModifier>(); |
||||
} |
||||
NavMeshModifier mod = obj[i].gameObject.GetComponent<NavMeshModifier>(); |
||||
mod.overrideArea = true; |
||||
mod.area = 1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetGuan/SetNengZouRenGuanDing")]//能上人的罐顶 |
||||
public static void NengZouRenGuanDing() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(2, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform CarRoad = GameObject.Find("CloneEnums").transform.Find("OilTop"); |
||||
var CloneableEnums = CarRoad.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetGuan/SetBuZouRenGuanDing")]//不能上人的罐顶 |
||||
public static void SetBuZouRenGuanDing() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
//obj[i].gameObject.layer = LayerMask.NameToLayer("SoldierRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
//if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
//{ |
||||
// obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
//} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(2, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform CarRoad = GameObject.Find("CloneEnums").transform.Find("OilTop"); |
||||
var CloneableEnums = CarRoad.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetGuan/SetGuanBi")]//罐壁 |
||||
public static void GuanBi() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Unfiltered); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
obj[i].gameObject.layer = LayerMask.NameToLayer("CarRoad"); |
||||
if (!obj[i].gameObject.GetComponent<MeshCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<MeshCollider>(); |
||||
} |
||||
//if (!obj[i].gameObject.GetComponent<PathFindingClick>()) |
||||
//{ |
||||
// obj[i].gameObject.AddComponent<PathFindingClick>(); |
||||
//} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(2, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
Transform CarRoad = GameObject.Find("CloneEnums").transform.Find("OilWall"); |
||||
var CloneableEnums = CarRoad.GetComponent<CloneableEnums>(); |
||||
enumParent.CloneableTypes = CloneableEnums.CloneableTypes; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
|
||||
|
||||
if (!obj[i].gameObject.GetComponent<NavMeshModifier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<NavMeshModifier>(); |
||||
} |
||||
NavMeshModifier mod = obj[i].gameObject.GetComponent<NavMeshModifier>(); |
||||
mod.overrideArea = true; |
||||
mod.area = 1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/RemoveColider")]//移除碰撞器 |
||||
public static void RemoveColider() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Deep); |
||||
{ |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
if (obj[i].GetComponent<MeshCollider>()) |
||||
{ |
||||
UnityEngine.Object.DestroyImmediate(obj[i].GetComponent<MeshCollider>(), true); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetCloneEnumsNei")]//设置室内克隆类型 |
||||
public static void SetCloneEnumsNei() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.DeepAssets); |
||||
{ |
||||
List<CloneObjType> CloneableTypes = new List<CloneObjType>(); |
||||
for (int i = (int)CloneObjType.WarningLine; i <= (int)CloneObjType.FireOpenType; i++) |
||||
{ |
||||
if (i != (int)CloneObjType.FireNormal && |
||||
i != (int)CloneObjType.SmokeNormal && |
||||
i != (int)CloneObjType.Splash && |
||||
i != (int)CloneObjType.Boilover && |
||||
i != (int)CloneObjType.Headquarters && |
||||
i != (int)CloneObjType.StagingArea && |
||||
i != (int)CloneObjType.FireHuge && |
||||
i != (int)CloneObjType.FireFlow) |
||||
{ |
||||
CloneableTypes.Add((CloneObjType)i); |
||||
} |
||||
} |
||||
if (obj[0].GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[0].GetComponent<CloneableEnums>().CloneableTypes = CloneableTypes; |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetshineiXHS")]//设置消火栓属性 |
||||
public static void SetSNXHS() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Deep); |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].name.ToLower().Contains("xhs") && |
||||
obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
if (!obj[i].gameObject.GetComponent<BoxCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<BoxCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(1, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.XHS; |
||||
if (!obj[i].gameObject.GetComponent<WaterSupplier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<WaterSupplier>(); |
||||
} |
||||
obj[i].gameObject.GetComponent<WaterSupplier>().WaterReceiverType = WaterType.water; |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
|
||||
List<CloneObjType> EnumsList = new List<CloneObjType>() { |
||||
CloneObjType.WaterLine, |
||||
CloneObjType.TwinkleLine |
||||
}; |
||||
enumParent.CloneableTypes = EnumsList; |
||||
if (obj[i].GetComponentInParent<FloorMessage>()) |
||||
{ |
||||
FloorMessage fmg = obj[i].GetComponentInParent<FloorMessage>(); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.XHS; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().buildNum = fmg.buildNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().floorNum = fmg.floorNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().interlayerNum = fmg.interlayerNum; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shinei; |
||||
} |
||||
else |
||||
{ |
||||
Debug.LogError("上层各目录未找到FloorMessage脚本"); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetshiwaiXHS")]//设置室外消火栓 |
||||
public static void SetSWXHS() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Deep); |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].name.ToLower().Contains("xhs") && |
||||
obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
if (!obj[i].gameObject.GetComponent<BoxCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<BoxCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(1, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.XHS; |
||||
if (!obj[i].gameObject.GetComponent<WaterSupplier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<WaterSupplier>(); |
||||
} |
||||
obj[i].gameObject.GetComponent<WaterSupplier>().WaterReceiverType = WaterType.water; |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
|
||||
List<CloneObjType> EnumsList = new List<CloneObjType>() { |
||||
CloneObjType.WaterLine, |
||||
CloneObjType.TwinkleLine |
||||
}; |
||||
enumParent.CloneableTypes = EnumsList; |
||||
|
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.XHS; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/SetshiwaiPMS")]//设置室外泡沫栓 |
||||
public static void SetSWPMS() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Deep); |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if (obj[i].name.ToLower().Contains("pms") && |
||||
obj[i].GetComponent<MeshRenderer>()) |
||||
{ |
||||
if (!obj[i].gameObject.GetComponent<BoxCollider>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<BoxCollider>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneGameObjInfo>(); |
||||
} |
||||
if (!obj[i].gameObject.GetComponent<StaticeObjAddToEntities>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<StaticeObjAddToEntities>(); |
||||
} |
||||
if (obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjID == 0) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(1, 1); |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.XHS; |
||||
if (!obj[i].gameObject.GetComponent<WaterSupplier>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<WaterSupplier>(); |
||||
} |
||||
obj[i].gameObject.GetComponent<WaterSupplier>().WaterReceiverType = WaterType.both; |
||||
if (!obj[i].gameObject.GetComponent<CloneableEnums>()) |
||||
{ |
||||
obj[i].gameObject.AddComponent<CloneableEnums>(); |
||||
} |
||||
CloneableEnums enumParent = obj[i].gameObject.GetComponent<CloneableEnums>(); |
||||
|
||||
List<CloneObjType> EnumsList = new List<CloneObjType>() { |
||||
CloneObjType.WaterLine, |
||||
CloneObjType.TwinkleLine |
||||
}; |
||||
enumParent.CloneableTypes = EnumsList; |
||||
|
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.XHS; |
||||
obj[i].gameObject.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/CreateStaticGameObjId", false, 10000)] |
||||
public static void CreateStaticGameObjId() |
||||
{ |
||||
Transform[] objs = Selection.GetTransforms(SelectionMode.Deep); |
||||
foreach (var obj in objs) |
||||
{ |
||||
if (obj.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
long staticGameObjId = (long)GUID.NewGuid(1, 1); |
||||
obj.GetComponent<CloneGameObjInfo>().SetGameObjID(staticGameObjId); |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/ResetCloneGameObjInfoType", false, 10000)] |
||||
public static void ResetCloneGameObjInfoType() |
||||
{ |
||||
Transform[] objs = Selection.GetTransforms(SelectionMode.Deep); |
||||
foreach (var obj in objs) |
||||
{ |
||||
if (obj.GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
Debug.Log(obj.name); |
||||
obj.GetComponent<CloneGameObjInfo>().inOutType = ObjectInOutType.shiwai; |
||||
} |
||||
} |
||||
} |
||||
[MenuItem("SceneTools/CheckEmpty")]//检查克隆类型为空值的情况 |
||||
public static void CheckEmpty() |
||||
{ |
||||
Transform[] obj = Selection.GetTransforms(SelectionMode.Deep); |
||||
for (int i = 0; i < obj.Length; i++) |
||||
{ |
||||
if ( |
||||
obj[i].GetComponent<CloneGameObjInfo>()) |
||||
{ |
||||
if (obj[i].GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.None) |
||||
{ |
||||
Debug.LogError("克隆类型有空值" + obj[i].name); |
||||
obj[i].GetComponent<CloneGameObjInfo>().gameObjType = CloneObjType.StaticGameObject; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,8 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 6fa04b4743e3947eba4d7b9e5832ea69 |
||||
timeCreated: 1477036742 |
||||
licenseType: Pro |
||||
guid: 897c231eaac7aa04686627c31697e0ad |
||||
MonoImporter: |
||||
externalObjects: {} |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
@ -1,258 +0,0 @@
|
||||
using UnityEngine; |
||||
using UnityEngine.AI; |
||||
|
||||
namespace UnityEditor.AI |
||||
{ |
||||
public static class NavMeshComponentsGUIUtility |
||||
{ |
||||
public static void AreaPopup(string labelName, SerializedProperty areaProperty) |
||||
{ |
||||
var areaIndex = -1; |
||||
var areaNames = GameObjectUtility.GetNavMeshAreaNames(); |
||||
for (var i = 0; i < areaNames.Length; i++) |
||||
{ |
||||
var areaValue = GameObjectUtility.GetNavMeshAreaFromName(areaNames[i]); |
||||
if (areaValue == areaProperty.intValue) |
||||
areaIndex = i; |
||||
} |
||||
ArrayUtility.Add(ref areaNames, ""); |
||||
ArrayUtility.Add(ref areaNames, "Open Area Settings..."); |
||||
|
||||
var rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); |
||||
EditorGUI.BeginProperty(rect, GUIContent.none, areaProperty); |
||||
|
||||
EditorGUI.BeginChangeCheck(); |
||||
areaIndex = EditorGUI.Popup(rect, labelName, areaIndex, areaNames); |
||||
|
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
if (areaIndex >= 0 && areaIndex < areaNames.Length - 2) |
||||
areaProperty.intValue = GameObjectUtility.GetNavMeshAreaFromName(areaNames[areaIndex]); |
||||
else if (areaIndex == areaNames.Length - 1) |
||||
NavMeshEditorHelpers.OpenAreaSettings(); |
||||
} |
||||
|
||||
EditorGUI.EndProperty(); |
||||
} |
||||
|
||||
public static void AgentTypePopup(string labelName, SerializedProperty agentTypeID) |
||||
{ |
||||
var index = -1; |
||||
var count = NavMesh.GetSettingsCount(); |
||||
var agentTypeNames = new string[count + 2]; |
||||
for (var i = 0; i < count; i++) |
||||
{ |
||||
var id = NavMesh.GetSettingsByIndex(i).agentTypeID; |
||||
var name = NavMesh.GetSettingsNameFromID(id); |
||||
agentTypeNames[i] = name; |
||||
if (id == agentTypeID.intValue) |
||||
index = i; |
||||
} |
||||
agentTypeNames[count] = ""; |
||||
agentTypeNames[count + 1] = "Open Agent Settings..."; |
||||
|
||||
bool validAgentType = index != -1; |
||||
if (!validAgentType) |
||||
{ |
||||
EditorGUILayout.HelpBox("Agent Type invalid.", MessageType.Warning); |
||||
} |
||||
|
||||
var rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); |
||||
EditorGUI.BeginProperty(rect, GUIContent.none, agentTypeID); |
||||
|
||||
EditorGUI.BeginChangeCheck(); |
||||
index = EditorGUI.Popup(rect, labelName, index, agentTypeNames); |
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
if (index >= 0 && index < count) |
||||
{ |
||||
var id = NavMesh.GetSettingsByIndex(index).agentTypeID; |
||||
agentTypeID.intValue = id; |
||||
} |
||||
else if (index == count + 1) |
||||
{ |
||||
NavMeshEditorHelpers.OpenAgentSettings(-1); |
||||
} |
||||
} |
||||
|
||||
EditorGUI.EndProperty(); |
||||
} |
||||
|
||||
// Agent mask is a set (internally array/list) of agentTypeIDs. |
||||
// It is used to describe which agents modifiers apply to. |
||||
// There is a special case of "None" which is an empty array. |
||||
// There is a special case of "All" which is an array of length 1, and value of -1. |
||||
public static void AgentMaskPopup(string labelName, SerializedProperty agentMask) |
||||
{ |
||||
// Contents of the dropdown box. |
||||
string popupContent = ""; |
||||
|
||||
if (agentMask.hasMultipleDifferentValues) |
||||
popupContent = "\u2014"; |
||||
else |
||||
popupContent = GetAgentMaskLabelName(agentMask); |
||||
|
||||
var content = new GUIContent(popupContent); |
||||
var popupRect = GUILayoutUtility.GetRect(content, EditorStyles.popup); |
||||
|
||||
EditorGUI.BeginProperty(popupRect, GUIContent.none, agentMask); |
||||
popupRect = EditorGUI.PrefixLabel(popupRect, 0, new GUIContent(labelName)); |
||||
bool pressed = GUI.Button(popupRect, content, EditorStyles.popup); |
||||
|
||||
if (pressed) |
||||
{ |
||||
var show = !agentMask.hasMultipleDifferentValues; |
||||
var showNone = show && agentMask.arraySize == 0; |
||||
var showAll = show && IsAll(agentMask); |
||||
|
||||
var menu = new GenericMenu(); |
||||
menu.AddItem(new GUIContent("None"), showNone, SetAgentMaskNone, agentMask); |
||||
menu.AddItem(new GUIContent("All"), showAll, SetAgentMaskAll, agentMask); |
||||
menu.AddSeparator(""); |
||||
|
||||
var count = NavMesh.GetSettingsCount(); |
||||
for (var i = 0; i < count; i++) |
||||
{ |
||||
var id = NavMesh.GetSettingsByIndex(i).agentTypeID; |
||||
var sname = NavMesh.GetSettingsNameFromID(id); |
||||
|
||||
var showSelected = show && AgentMaskHasSelectedAgentTypeID(agentMask, id); |
||||
var userData = new object[] { agentMask, id, !showSelected }; |
||||
menu.AddItem(new GUIContent(sname), showSelected, ToggleAgentMaskItem, userData); |
||||
} |
||||
|
||||
menu.DropDown(popupRect); |
||||
} |
||||
|
||||
EditorGUI.EndProperty(); |
||||
} |
||||
|
||||
public static GameObject CreateAndSelectGameObject(string suggestedName, GameObject parent) |
||||
{ |
||||
var parentTransform = parent != null ? parent.transform : null; |
||||
var uniqueName = GameObjectUtility.GetUniqueNameForSibling(parentTransform, suggestedName); |
||||
var child = new GameObject(uniqueName); |
||||
|
||||
Undo.RegisterCreatedObjectUndo(child, "Create " + uniqueName); |
||||
if (parentTransform != null) |
||||
Undo.SetTransformParent(child.transform, parentTransform, "Parent " + uniqueName); |
||||
|
||||
Selection.activeGameObject = child; |
||||
|
||||
return child; |
||||
} |
||||
|
||||
static bool IsAll(SerializedProperty agentMask) |
||||
{ |
||||
return agentMask.arraySize == 1 && agentMask.GetArrayElementAtIndex(0).intValue == -1; |
||||
} |
||||
|
||||
static void ToggleAgentMaskItem(object userData) |
||||
{ |
||||
var args = (object[])userData; |
||||
var agentMask = (SerializedProperty)args[0]; |
||||
var agentTypeID = (int)args[1]; |
||||
var value = (bool)args[2]; |
||||
|
||||
ToggleAgentMaskItem(agentMask, agentTypeID, value); |
||||
} |
||||
|
||||
static void ToggleAgentMaskItem(SerializedProperty agentMask, int agentTypeID, bool value) |
||||
{ |
||||
if (agentMask.hasMultipleDifferentValues) |
||||
{ |
||||
agentMask.ClearArray(); |
||||
agentMask.serializedObject.ApplyModifiedProperties(); |
||||
} |
||||
|
||||
// Find which index this agent type is in the agentMask array. |
||||
int idx = -1; |
||||
for (var j = 0; j < agentMask.arraySize; j++) |
||||
{ |
||||
var elem = agentMask.GetArrayElementAtIndex(j); |
||||
if (elem.intValue == agentTypeID) |
||||
idx = j; |
||||
} |
||||
|
||||
// Handle "All" special case. |
||||
if (IsAll(agentMask)) |
||||
{ |
||||
agentMask.DeleteArrayElementAtIndex(0); |
||||
} |
||||
|
||||
// Toggle value. |
||||
if (value) |
||||
{ |
||||
if (idx == -1) |
||||
{ |
||||
agentMask.InsertArrayElementAtIndex(agentMask.arraySize); |
||||
agentMask.GetArrayElementAtIndex(agentMask.arraySize - 1).intValue = agentTypeID; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (idx != -1) |
||||
{ |
||||
agentMask.DeleteArrayElementAtIndex(idx); |
||||
} |
||||
} |
||||
|
||||
agentMask.serializedObject.ApplyModifiedProperties(); |
||||
} |
||||
|
||||
static void SetAgentMaskNone(object data) |
||||
{ |
||||
var agentMask = (SerializedProperty)data; |
||||
agentMask.ClearArray(); |
||||
agentMask.serializedObject.ApplyModifiedProperties(); |
||||
} |
||||
|
||||
static void SetAgentMaskAll(object data) |
||||
{ |
||||
var agentMask = (SerializedProperty)data; |
||||
agentMask.ClearArray(); |
||||
agentMask.InsertArrayElementAtIndex(0); |
||||
agentMask.GetArrayElementAtIndex(0).intValue = -1; |
||||
agentMask.serializedObject.ApplyModifiedProperties(); |
||||
} |
||||
|
||||
static string GetAgentMaskLabelName(SerializedProperty agentMask) |
||||
{ |
||||
if (agentMask.arraySize == 0) |
||||
return "None"; |
||||
|
||||
if (IsAll(agentMask)) |
||||
return "All"; |
||||
|
||||
if (agentMask.arraySize <= 3) |
||||
{ |
||||
var labelName = ""; |
||||
for (var j = 0; j < agentMask.arraySize; j++) |
||||
{ |
||||
var elem = agentMask.GetArrayElementAtIndex(j); |
||||
var settingsName = NavMesh.GetSettingsNameFromID(elem.intValue); |
||||
if (string.IsNullOrEmpty(settingsName)) |
||||
continue; |
||||
|
||||
if (labelName.Length > 0) |
||||
labelName += ", "; |
||||
labelName += settingsName; |
||||
} |
||||
return labelName; |
||||
} |
||||
|
||||
return "Mixed..."; |
||||
} |
||||
|
||||
static bool AgentMaskHasSelectedAgentTypeID(SerializedProperty agentMask, int agentTypeID) |
||||
{ |
||||
for (var j = 0; j < agentMask.arraySize; j++) |
||||
{ |
||||
var elem = agentMask.GetArrayElementAtIndex(j); |
||||
if (elem.intValue == agentTypeID) |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 77fba670b979046f18d52d751e0d4659 |
||||
timeCreated: 1480524815 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {instanceID: 0} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,279 +0,0 @@
|
||||
using UnityEngine; |
||||
using UnityEngine.AI; |
||||
|
||||
namespace UnityEditor.AI |
||||
{ |
||||
[CanEditMultipleObjects] |
||||
[CustomEditor(typeof(NavMeshLink))] |
||||
class NavMeshLinkEditor : Editor |
||||
{ |
||||
SerializedProperty m_AgentTypeID; |
||||
SerializedProperty m_Area; |
||||
SerializedProperty m_CostModifier; |
||||
SerializedProperty m_AutoUpdatePosition; |
||||
SerializedProperty m_Bidirectional; |
||||
SerializedProperty m_EndPoint; |
||||
SerializedProperty m_StartPoint; |
||||
SerializedProperty m_Width; |
||||
|
||||
static int s_SelectedID; |
||||
static int s_SelectedPoint = -1; |
||||
|
||||
static Color s_HandleColor = new Color(255f, 167f, 39f, 210f) / 255; |
||||
static Color s_HandleColorDisabled = new Color(255f * 0.75f, 167f * 0.75f, 39f * 0.75f, 100f) / 255; |
||||
|
||||
void OnEnable() |
||||
{ |
||||
m_AgentTypeID = serializedObject.FindProperty("m_AgentTypeID"); |
||||
m_Area = serializedObject.FindProperty("m_Area"); |
||||
m_CostModifier = serializedObject.FindProperty("m_CostModifier"); |
||||
m_AutoUpdatePosition = serializedObject.FindProperty("m_AutoUpdatePosition"); |
||||
m_Bidirectional = serializedObject.FindProperty("m_Bidirectional"); |
||||
m_EndPoint = serializedObject.FindProperty("m_EndPoint"); |
||||
m_StartPoint = serializedObject.FindProperty("m_StartPoint"); |
||||
m_Width = serializedObject.FindProperty("m_Width"); |
||||
|
||||
s_SelectedID = 0; |
||||
s_SelectedPoint = -1; |
||||
|
||||
NavMeshVisualizationSettings.showNavigation++; |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
NavMeshVisualizationSettings.showNavigation--; |
||||
} |
||||
|
||||
static Matrix4x4 UnscaledLocalToWorldMatrix(Transform t) |
||||
{ |
||||
return Matrix4x4.TRS(t.position, t.rotation, Vector3.one); |
||||
} |
||||
|
||||
void AlignTransformToEndPoints(NavMeshLink navLink) |
||||
{ |
||||
var mat = UnscaledLocalToWorldMatrix(navLink.transform); |
||||
|
||||
var worldStartPt = mat.MultiplyPoint(navLink.startPoint); |
||||
var worldEndPt = mat.MultiplyPoint(navLink.endPoint); |
||||
|
||||
var forward = worldEndPt - worldStartPt; |
||||
var up = navLink.transform.up; |
||||
|
||||
// Flatten |
||||
forward -= Vector3.Dot(up, forward) * up; |
||||
|
||||
var transform = navLink.transform; |
||||
transform.rotation = Quaternion.LookRotation(forward, up); |
||||
transform.position = (worldEndPt + worldStartPt) * 0.5f; |
||||
transform.localScale = Vector3.one; |
||||
|
||||
navLink.startPoint = transform.InverseTransformPoint(worldStartPt); |
||||
navLink.endPoint = transform.InverseTransformPoint(worldEndPt); |
||||
} |
||||
|
||||
public override void OnInspectorGUI() |
||||
{ |
||||
serializedObject.Update(); |
||||
|
||||
NavMeshComponentsGUIUtility.AgentTypePopup("Agent Type", m_AgentTypeID); |
||||
EditorGUILayout.Space(); |
||||
|
||||
EditorGUILayout.PropertyField(m_StartPoint); |
||||
EditorGUILayout.PropertyField(m_EndPoint); |
||||
|
||||
GUILayout.BeginHorizontal(); |
||||
GUILayout.Space(EditorGUIUtility.labelWidth); |
||||
if (GUILayout.Button("Swap")) |
||||
{ |
||||
foreach (NavMeshLink navLink in targets) |
||||
{ |
||||
var tmp = navLink.startPoint; |
||||
navLink.startPoint = navLink.endPoint; |
||||
navLink.endPoint = tmp; |
||||
} |
||||
SceneView.RepaintAll(); |
||||
} |
||||
if (GUILayout.Button("Align Transform")) |
||||
{ |
||||
foreach (NavMeshLink navLink in targets) |
||||
{ |
||||
Undo.RecordObject(navLink.transform, "Align Transform to End Points"); |
||||
Undo.RecordObject(navLink, "Align Transform to End Points"); |
||||
AlignTransformToEndPoints(navLink); |
||||
} |
||||
SceneView.RepaintAll(); |
||||
} |
||||
GUILayout.EndHorizontal(); |
||||
EditorGUILayout.Space(); |
||||
|
||||
EditorGUILayout.PropertyField(m_Width); |
||||
EditorGUILayout.PropertyField(m_CostModifier); |
||||
EditorGUILayout.PropertyField(m_AutoUpdatePosition); |
||||
EditorGUILayout.PropertyField(m_Bidirectional); |
||||
|
||||
NavMeshComponentsGUIUtility.AreaPopup("Area Type", m_Area); |
||||
|
||||
serializedObject.ApplyModifiedProperties(); |
||||
|
||||
EditorGUILayout.Space(); |
||||
} |
||||
|
||||
static Vector3 CalcLinkRight(NavMeshLink navLink) |
||||
{ |
||||
var dir = navLink.endPoint - navLink.startPoint; |
||||
return (new Vector3(-dir.z, 0.0f, dir.x)).normalized; |
||||
} |
||||
|
||||
static void DrawLink(NavMeshLink navLink) |
||||
{ |
||||
var right = CalcLinkRight(navLink); |
||||
var rad = navLink.width * 0.5f; |
||||
|
||||
Gizmos.DrawLine(navLink.startPoint - right * rad, navLink.startPoint + right * rad); |
||||
Gizmos.DrawLine(navLink.endPoint - right * rad, navLink.endPoint + right * rad); |
||||
Gizmos.DrawLine(navLink.startPoint - right * rad, navLink.endPoint - right * rad); |
||||
Gizmos.DrawLine(navLink.startPoint + right * rad, navLink.endPoint + right * rad); |
||||
} |
||||
|
||||
[DrawGizmo(GizmoType.Selected | GizmoType.Active | GizmoType.Pickable)] |
||||
static void RenderBoxGizmo(NavMeshLink navLink, GizmoType gizmoType) |
||||
{ |
||||
if (!EditorApplication.isPlaying) |
||||
navLink.UpdateLink(); |
||||
|
||||
var color = s_HandleColor; |
||||
if (!navLink.enabled) |
||||
color = s_HandleColorDisabled; |
||||
|
||||
var oldColor = Gizmos.color; |
||||
var oldMatrix = Gizmos.matrix; |
||||
|
||||
Gizmos.matrix = UnscaledLocalToWorldMatrix(navLink.transform); |
||||
|
||||
Gizmos.color = color; |
||||
DrawLink(navLink); |
||||
|
||||
Gizmos.matrix = oldMatrix; |
||||
Gizmos.color = oldColor; |
||||
|
||||
Gizmos.DrawIcon(navLink.transform.position, "NavMeshLink Icon", true); |
||||
} |
||||
|
||||
[DrawGizmo(GizmoType.NotInSelectionHierarchy | GizmoType.Pickable)] |
||||
static void RenderBoxGizmoNotSelected(NavMeshLink navLink, GizmoType gizmoType) |
||||
{ |
||||
if (NavMeshVisualizationSettings.showNavigation > 0) |
||||
{ |
||||
var color = s_HandleColor; |
||||
if (!navLink.enabled) |
||||
color = s_HandleColorDisabled; |
||||
|
||||
var oldColor = Gizmos.color; |
||||
var oldMatrix = Gizmos.matrix; |
||||
|
||||
Gizmos.matrix = UnscaledLocalToWorldMatrix(navLink.transform); |
||||
|
||||
Gizmos.color = color; |
||||
DrawLink(navLink); |
||||
|
||||
Gizmos.matrix = oldMatrix; |
||||
Gizmos.color = oldColor; |
||||
} |
||||
|
||||
Gizmos.DrawIcon(navLink.transform.position, "NavMeshLink Icon", true); |
||||
} |
||||
|
||||
public void OnSceneGUI() |
||||
{ |
||||
var navLink = (NavMeshLink)target; |
||||
if (!navLink.enabled) |
||||
return; |
||||
|
||||
var mat = UnscaledLocalToWorldMatrix(navLink.transform); |
||||
|
||||
var startPt = mat.MultiplyPoint(navLink.startPoint); |
||||
var endPt = mat.MultiplyPoint(navLink.endPoint); |
||||
var midPt = Vector3.Lerp(startPt, endPt, 0.35f); |
||||
var startSize = HandleUtility.GetHandleSize(startPt); |
||||
var endSize = HandleUtility.GetHandleSize(endPt); |
||||
var midSize = HandleUtility.GetHandleSize(midPt); |
||||
|
||||
var zup = Quaternion.FromToRotation(Vector3.forward, Vector3.up); |
||||
var right = mat.MultiplyVector(CalcLinkRight(navLink)); |
||||
|
||||
var oldColor = Handles.color; |
||||
Handles.color = s_HandleColor; |
||||
|
||||
Vector3 pos; |
||||
|
||||
if (navLink.GetInstanceID() == s_SelectedID && s_SelectedPoint == 0) |
||||
{ |
||||
EditorGUI.BeginChangeCheck(); |
||||
Handles.CubeHandleCap(0, startPt, zup, 0.1f * startSize, Event.current.type); |
||||
pos = Handles.PositionHandle(startPt, navLink.transform.rotation); |
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
Undo.RecordObject(navLink, "Move link point"); |
||||
navLink.startPoint = mat.inverse.MultiplyPoint(pos); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (Handles.Button(startPt, zup, 0.1f * startSize, 0.1f * startSize, Handles.CubeHandleCap)) |
||||
{ |
||||
s_SelectedPoint = 0; |
||||
s_SelectedID = navLink.GetInstanceID(); |
||||
} |
||||
} |
||||
|
||||
if (navLink.GetInstanceID() == s_SelectedID && s_SelectedPoint == 1) |
||||
{ |
||||
EditorGUI.BeginChangeCheck(); |
||||
Handles.CubeHandleCap(0, endPt, zup, 0.1f * startSize, Event.current.type); |
||||
pos = Handles.PositionHandle(endPt, navLink.transform.rotation); |
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
Undo.RecordObject(navLink, "Move link point"); |
||||
navLink.endPoint = mat.inverse.MultiplyPoint(pos); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (Handles.Button(endPt, zup, 0.1f * endSize, 0.1f * endSize, Handles.CubeHandleCap)) |
||||
{ |
||||
s_SelectedPoint = 1; |
||||
s_SelectedID = navLink.GetInstanceID(); |
||||
} |
||||
} |
||||
|
||||
EditorGUI.BeginChangeCheck(); |
||||
pos = Handles.Slider(midPt + right * navLink.width * 0.5f, right, midSize * 0.03f, Handles.DotHandleCap, 0); |
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
Undo.RecordObject(navLink, "Adjust link width"); |
||||
navLink.width = Mathf.Max(0.0f, 2.0f * Vector3.Dot(right, (pos - midPt))); |
||||
} |
||||
|
||||
EditorGUI.BeginChangeCheck(); |
||||
pos = Handles.Slider(midPt - right * navLink.width * 0.5f, -right, midSize * 0.03f, Handles.DotHandleCap, 0); |
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
Undo.RecordObject(navLink, "Adjust link width"); |
||||
navLink.width = Mathf.Max(0.0f, 2.0f * Vector3.Dot(-right, (pos - midPt))); |
||||
} |
||||
|
||||
Handles.color = oldColor; |
||||
} |
||||
|
||||
[MenuItem("GameObject/AI/NavMesh Link", false, 2002)] |
||||
static public void CreateNavMeshLink(MenuCommand menuCommand) |
||||
{ |
||||
var parent = menuCommand.context as GameObject; |
||||
GameObject go = NavMeshComponentsGUIUtility.CreateAndSelectGameObject("NavMesh Link", parent); |
||||
go.AddComponent<NavMeshLink>(); |
||||
var view = SceneView.lastActiveSceneView; |
||||
if (view != null) |
||||
view.MoveToView(go.transform); |
||||
} |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: ece1e865d1ad84587872fe8580ab5a20 |
||||
timeCreated: 1477036743 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {instanceID: 0} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,49 +0,0 @@
|
||||
using UnityEngine.AI; |
||||
|
||||
namespace UnityEditor.AI |
||||
{ |
||||
[CanEditMultipleObjects] |
||||
[CustomEditor(typeof(NavMeshModifier))] |
||||
class NavMeshModifierEditor : Editor |
||||
{ |
||||
SerializedProperty m_AffectedAgents; |
||||
SerializedProperty m_Area; |
||||
SerializedProperty m_IgnoreFromBuild; |
||||
SerializedProperty m_OverrideArea; |
||||
|
||||
void OnEnable() |
||||
{ |
||||
m_AffectedAgents = serializedObject.FindProperty("m_AffectedAgents"); |
||||
m_Area = serializedObject.FindProperty("m_Area"); |
||||
m_IgnoreFromBuild = serializedObject.FindProperty("m_IgnoreFromBuild"); |
||||
m_OverrideArea = serializedObject.FindProperty("m_OverrideArea"); |
||||
|
||||
NavMeshVisualizationSettings.showNavigation++; |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
NavMeshVisualizationSettings.showNavigation--; |
||||
} |
||||
|
||||
public override void OnInspectorGUI() |
||||
{ |
||||
serializedObject.Update(); |
||||
|
||||
EditorGUILayout.PropertyField(m_IgnoreFromBuild); |
||||
|
||||
EditorGUILayout.PropertyField(m_OverrideArea); |
||||
if (m_OverrideArea.boolValue) |
||||
{ |
||||
EditorGUI.indentLevel++; |
||||
NavMeshComponentsGUIUtility.AreaPopup("Area Type", m_Area); |
||||
EditorGUI.indentLevel--; |
||||
} |
||||
|
||||
NavMeshComponentsGUIUtility.AgentMaskPopup("Affected Agents", m_AffectedAgents); |
||||
EditorGUILayout.Space(); |
||||
|
||||
serializedObject.ApplyModifiedProperties(); |
||||
} |
||||
} |
||||
} |
@ -1,154 +0,0 @@
|
||||
using UnityEditor.IMGUI.Controls; |
||||
using UnityEditorInternal; |
||||
using UnityEngine.AI; |
||||
using UnityEngine; |
||||
|
||||
namespace UnityEditor.AI |
||||
{ |
||||
[CanEditMultipleObjects] |
||||
[CustomEditor(typeof(NavMeshModifierVolume))] |
||||
class NavMeshModifierVolumeEditor : Editor |
||||
{ |
||||
SerializedProperty m_AffectedAgents; |
||||
SerializedProperty m_Area; |
||||
SerializedProperty m_Center; |
||||
SerializedProperty m_Size; |
||||
|
||||
static Color s_HandleColor = new Color(187f, 138f, 240f, 210f) / 255; |
||||
static Color s_HandleColorDisabled = new Color(187f * 0.75f, 138f * 0.75f, 240f * 0.75f, 100f) / 255; |
||||
|
||||
static int s_HandleControlIDHint = typeof(NavMeshModifierVolumeEditor).Name.GetHashCode(); |
||||
BoxBoundsHandle m_BoundsHandle = new BoxBoundsHandle(s_HandleControlIDHint); |
||||
|
||||
bool editingCollider |
||||
{ |
||||
get { return EditMode.editMode == EditMode.SceneViewEditMode.Collider && EditMode.IsOwner(this); } |
||||
} |
||||
|
||||
void OnEnable() |
||||
{ |
||||
m_AffectedAgents = serializedObject.FindProperty("m_AffectedAgents"); |
||||
m_Area = serializedObject.FindProperty("m_Area"); |
||||
m_Center = serializedObject.FindProperty("m_Center"); |
||||
m_Size = serializedObject.FindProperty("m_Size"); |
||||
|
||||
NavMeshVisualizationSettings.showNavigation++; |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
NavMeshVisualizationSettings.showNavigation--; |
||||
} |
||||
|
||||
public override void OnInspectorGUI() |
||||
{ |
||||
serializedObject.Update(); |
||||
|
||||
InspectorEditButtonGUI(); |
||||
|
||||
EditorGUILayout.PropertyField(m_Size); |
||||
EditorGUILayout.PropertyField(m_Center); |
||||
|
||||
NavMeshComponentsGUIUtility.AreaPopup("Area Type", m_Area); |
||||
NavMeshComponentsGUIUtility.AgentMaskPopup("Affected Agents", m_AffectedAgents); |
||||
EditorGUILayout.Space(); |
||||
|
||||
serializedObject.ApplyModifiedProperties(); |
||||
} |
||||
|
||||
[DrawGizmo(GizmoType.Selected | GizmoType.Active)] |
||||
static void RenderBoxGizmo(NavMeshModifierVolume navModifier, GizmoType gizmoType) |
||||
{ |
||||
var color = navModifier.enabled ? s_HandleColor : s_HandleColorDisabled; |
||||
var colorTrans = new Color(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, color.a * 0.15f); |
||||
|
||||
var oldColor = Gizmos.color; |
||||
var oldMatrix = Gizmos.matrix; |
||||
|
||||
Gizmos.matrix = navModifier.transform.localToWorldMatrix; |
||||
|
||||
Gizmos.color = colorTrans; |
||||
Gizmos.DrawCube(navModifier.center, navModifier.size); |
||||
|
||||
Gizmos.color = color; |
||||
Gizmos.DrawWireCube(navModifier.center, navModifier.size); |
||||
|
||||
Gizmos.matrix = oldMatrix; |
||||
Gizmos.color = oldColor; |
||||
|
||||
Gizmos.DrawIcon(navModifier.transform.position, "NavMeshModifierVolume Icon", true); |
||||
} |
||||
|
||||
[DrawGizmo(GizmoType.NotInSelectionHierarchy | GizmoType.Pickable)] |
||||
static void RenderBoxGizmoNotSelected(NavMeshModifierVolume navModifier, GizmoType gizmoType) |
||||
{ |
||||
if (NavMeshVisualizationSettings.showNavigation > 0) |
||||
{ |
||||
var color = navModifier.enabled ? s_HandleColor : s_HandleColorDisabled; |
||||
var oldColor = Gizmos.color; |
||||
var oldMatrix = Gizmos.matrix; |
||||
|
||||
Gizmos.matrix = navModifier.transform.localToWorldMatrix; |
||||
|
||||
Gizmos.color = color; |
||||
Gizmos.DrawWireCube(navModifier.center, navModifier.size); |
||||
|
||||
Gizmos.matrix = oldMatrix; |
||||
Gizmos.color = oldColor; |
||||
} |
||||
|
||||
Gizmos.DrawIcon(navModifier.transform.position, "NavMeshModifierVolume Icon", true); |
||||
} |
||||
|
||||
void InspectorEditButtonGUI() |
||||
{ |
||||
var navModifier = (NavMeshModifierVolume)target; |
||||
var bounds = new Bounds(navModifier.transform.position, navModifier.size); |
||||
|
||||
EditMode.DoEditModeInspectorModeButton( |
||||
EditMode.SceneViewEditMode.Collider, |
||||
"Edit Volume", |
||||
EditorGUIUtility.IconContent("EditCollider"), |
||||
bounds, |
||||
this |
||||
); |
||||
} |
||||
|
||||
void OnSceneGUI() |
||||
{ |
||||
if (!editingCollider) |
||||
return; |
||||
|
||||
var vol = (NavMeshModifierVolume)target; |
||||
var color = vol.enabled ? s_HandleColor : s_HandleColorDisabled; |
||||
using (new Handles.DrawingScope(color, vol.transform.localToWorldMatrix)) |
||||
{ |
||||
m_BoundsHandle.center = vol.center; |
||||
m_BoundsHandle.size = vol.size; |
||||
|
||||
EditorGUI.BeginChangeCheck(); |
||||
m_BoundsHandle.DrawHandle(); |
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
Undo.RecordObject(vol, "Modified NavMesh Modifier Volume"); |
||||
Vector3 center = m_BoundsHandle.center; |
||||
Vector3 size = m_BoundsHandle.size; |
||||
vol.center = center; |
||||
vol.size = size; |
||||
EditorUtility.SetDirty(target); |
||||
} |
||||
} |
||||
} |
||||
|
||||
[MenuItem("GameObject/AI/NavMesh Modifier Volume", false, 2001)] |
||||
static public void CreateNavMeshModifierVolume(MenuCommand menuCommand) |
||||
{ |
||||
var parent = menuCommand.context as GameObject; |
||||
var go = NavMeshComponentsGUIUtility.CreateAndSelectGameObject("NavMesh Modifier Volume", parent); |
||||
go.AddComponent<NavMeshModifierVolume>(); |
||||
var view = SceneView.lastActiveSceneView; |
||||
if (view != null) |
||||
view.MoveToView(go.transform); |
||||
} |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: c0f3bef2a67ae4e139538afec3e59b03 |
||||
timeCreated: 1477036743 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {instanceID: 0} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,490 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using UnityEditor.IMGUI.Controls; |
||||
using UnityEditor.SceneManagement; |
||||
using UnityEditorInternal; |
||||
using UnityEngine.AI; |
||||
using UnityEngine; |
||||
|
||||
namespace UnityEditor.AI |
||||
{ |
||||
[CanEditMultipleObjects] |
||||
[CustomEditor(typeof(NavMeshSurface))] |
||||
class NavMeshSurfaceEditor : Editor |
||||
{ |
||||
SerializedProperty m_AgentTypeID; |
||||
SerializedProperty m_BuildHeightMesh; |
||||
SerializedProperty m_Center; |
||||
SerializedProperty m_CollectObjects; |
||||
SerializedProperty m_DefaultArea; |
||||
SerializedProperty m_LayerMask; |
||||
SerializedProperty m_OverrideTileSize; |
||||
SerializedProperty m_OverrideVoxelSize; |
||||
SerializedProperty m_Size; |
||||
SerializedProperty m_TileSize; |
||||
SerializedProperty m_UseGeometry; |
||||
SerializedProperty m_VoxelSize; |
||||
|
||||
class Styles |
||||
{ |
||||
public readonly GUIContent m_LayerMask = new GUIContent("Include Layers"); |
||||
|
||||
public readonly GUIContent m_ShowInputGeom = new GUIContent("Show Input Geom"); |
||||
public readonly GUIContent m_ShowVoxels = new GUIContent("Show Voxels"); |
||||
public readonly GUIContent m_ShowRegions = new GUIContent("Show Regions"); |
||||
public readonly GUIContent m_ShowRawContours = new GUIContent("Show Raw Contours"); |
||||
public readonly GUIContent m_ShowContours = new GUIContent("Show Contours"); |
||||
public readonly GUIContent m_ShowPolyMesh = new GUIContent("Show Poly Mesh"); |
||||
public readonly GUIContent m_ShowPolyMeshDetail = new GUIContent("Show Poly Mesh Detail"); |
||||
} |
||||
|
||||
struct AsyncBakeOperation |
||||
{ |
||||
public NavMeshSurface surface; |
||||
public NavMeshData bakeData; |
||||
public AsyncOperation bakeOperation; |
||||
} |
||||
|
||||
static List<AsyncBakeOperation> s_BakeOperations = new List<AsyncBakeOperation>(); |
||||
|
||||
static Styles s_Styles; |
||||
|
||||
static bool s_ShowDebugOptions; |
||||
|
||||
static Color s_HandleColor = new Color(127f, 214f, 244f, 100f) / 255; |
||||
static Color s_HandleColorSelected = new Color(127f, 214f, 244f, 210f) / 255; |
||||
static Color s_HandleColorDisabled = new Color(127f * 0.75f, 214f * 0.75f, 244f * 0.75f, 100f) / 255; |
||||
|
||||
static int s_HandleControlIDHint = typeof(NavMeshSurfaceEditor).Name.GetHashCode(); |
||||
BoxBoundsHandle m_BoundsHandle = new BoxBoundsHandle(s_HandleControlIDHint); |
||||
|
||||
bool editingCollider |
||||
{ |
||||
get { return EditMode.editMode == EditMode.SceneViewEditMode.Collider && EditMode.IsOwner(this); } |
||||
} |
||||
|
||||
void OnEnable() |
||||
{ |
||||
m_AgentTypeID = serializedObject.FindProperty("m_AgentTypeID"); |
||||
m_BuildHeightMesh = serializedObject.FindProperty("m_BuildHeightMesh"); |
||||
m_Center = serializedObject.FindProperty("m_Center"); |
||||
m_CollectObjects = serializedObject.FindProperty("m_CollectObjects"); |
||||
m_DefaultArea = serializedObject.FindProperty("m_DefaultArea"); |
||||
m_LayerMask = serializedObject.FindProperty("m_LayerMask"); |
||||
m_OverrideTileSize = serializedObject.FindProperty("m_OverrideTileSize"); |
||||
m_OverrideVoxelSize = serializedObject.FindProperty("m_OverrideVoxelSize"); |
||||
m_Size = serializedObject.FindProperty("m_Size"); |
||||
m_TileSize = serializedObject.FindProperty("m_TileSize"); |
||||
m_UseGeometry = serializedObject.FindProperty("m_UseGeometry"); |
||||
m_VoxelSize = serializedObject.FindProperty("m_VoxelSize"); |
||||
|
||||
NavMeshVisualizationSettings.showNavigation++; |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
NavMeshVisualizationSettings.showNavigation--; |
||||
} |
||||
|
||||
static string GetAndEnsureTargetPath(NavMeshSurface surface) |
||||
{ |
||||
// Create directory for the asset if it does not exist yet. |
||||
var activeScenePath = surface.gameObject.scene.path; |
||||
|
||||
var targetPath = "Assets"; |
||||
if (!string.IsNullOrEmpty(activeScenePath)) |
||||
targetPath = Path.Combine(Path.GetDirectoryName(activeScenePath), Path.GetFileNameWithoutExtension(activeScenePath)); |
||||
if (!Directory.Exists(targetPath)) |
||||
Directory.CreateDirectory(targetPath); |
||||
return targetPath; |
||||
} |
||||
|
||||
static void CreateNavMeshAsset(NavMeshSurface surface) |
||||
{ |
||||
var targetPath = GetAndEnsureTargetPath(surface); |
||||
|
||||
var combinedAssetPath = Path.Combine(targetPath, "NavMesh-" + surface.name + ".asset"); |
||||
combinedAssetPath = AssetDatabase.GenerateUniqueAssetPath(combinedAssetPath); |
||||
AssetDatabase.CreateAsset(surface.navMeshData, combinedAssetPath); |
||||
} |
||||
|
||||
static NavMeshData GetNavMeshAssetToDelete(NavMeshSurface navSurface) |
||||
{ |
||||
var prefabType = PrefabUtility.GetPrefabType(navSurface); |
||||
if (prefabType == PrefabType.PrefabInstance || prefabType == PrefabType.DisconnectedPrefabInstance) |
||||
{ |
||||
// Don't allow deleting the asset belonging to the prefab parent |
||||
var parentSurface = PrefabUtility.GetPrefabParent(navSurface) as NavMeshSurface; |
||||
if (parentSurface && navSurface.navMeshData == parentSurface.navMeshData) |
||||
return null; |
||||
} |
||||
return navSurface.navMeshData; |
||||
} |
||||
|
||||
void ClearSurface(NavMeshSurface navSurface) |
||||
{ |
||||
var assetToDelete = GetNavMeshAssetToDelete(navSurface); |
||||
navSurface.RemoveData(); |
||||
navSurface.navMeshData = null; |
||||
EditorUtility.SetDirty(navSurface); |
||||
|
||||
if (assetToDelete) |
||||
{ |
||||
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(assetToDelete)); |
||||
EditorSceneManager.MarkSceneDirty(navSurface.gameObject.scene); |
||||
} |
||||
} |
||||
|
||||
public override void OnInspectorGUI() |
||||
{ |
||||
if (s_Styles == null) |
||||
s_Styles = new Styles(); |
||||
|
||||
serializedObject.Update(); |
||||
|
||||
var bs = NavMesh.GetSettingsByID(m_AgentTypeID.intValue); |
||||
|
||||
if (bs.agentTypeID != -1) |
||||
{ |
||||
// Draw image |
||||
const float diagramHeight = 80.0f; |
||||
Rect agentDiagramRect = EditorGUILayout.GetControlRect(false, diagramHeight); |
||||
NavMeshEditorHelpers.DrawAgentDiagram(agentDiagramRect, bs.agentRadius, bs.agentHeight, bs.agentClimb, bs.agentSlope); |
||||
} |
||||
NavMeshComponentsGUIUtility.AgentTypePopup("Agent Type", m_AgentTypeID); |
||||
|
||||
EditorGUILayout.Space(); |
||||
|
||||
EditorGUILayout.PropertyField(m_CollectObjects); |
||||
if ((CollectObjects)m_CollectObjects.enumValueIndex == CollectObjects.Volume) |
||||
{ |
||||
EditorGUI.indentLevel++; |
||||
InspectorEditButtonGUI(); |
||||
EditorGUILayout.PropertyField(m_Size); |
||||
EditorGUILayout.PropertyField(m_Center); |
||||
} |
||||
else |
||||
{ |
||||
if (editingCollider) |
||||
EditMode.QuitEditMode(); |
||||
} |
||||
|
||||
EditorGUILayout.PropertyField(m_LayerMask, s_Styles.m_LayerMask); |
||||
EditorGUILayout.PropertyField(m_UseGeometry); |
||||
|
||||
EditorGUILayout.Space(); |
||||
|
||||
EditorGUILayout.Space(); |
||||
|
||||
m_OverrideVoxelSize.isExpanded = EditorGUILayout.Foldout(m_OverrideVoxelSize.isExpanded, "Advanced"); |
||||
if (m_OverrideVoxelSize.isExpanded) |
||||
{ |
||||
EditorGUI.indentLevel++; |
||||
|
||||
NavMeshComponentsGUIUtility.AreaPopup("Default Area", m_DefaultArea); |
||||
|
||||
// Override voxel size. |
||||
EditorGUILayout.PropertyField(m_OverrideVoxelSize); |
||||
|
||||
using (new EditorGUI.DisabledScope(!m_OverrideVoxelSize.boolValue || m_OverrideVoxelSize.hasMultipleDifferentValues)) |
||||
{ |
||||
EditorGUI.indentLevel++; |
||||
|
||||
EditorGUILayout.PropertyField(m_VoxelSize); |
||||
|
||||
if (!m_OverrideVoxelSize.hasMultipleDifferentValues) |
||||
{ |
||||
if (!m_AgentTypeID.hasMultipleDifferentValues) |
||||
{ |
||||
float voxelsPerRadius = m_VoxelSize.floatValue > 0.0f ? (bs.agentRadius / m_VoxelSize.floatValue) : 0.0f; |
||||
EditorGUILayout.LabelField(" ", voxelsPerRadius.ToString("0.00") + " voxels per agent radius", EditorStyles.miniLabel); |
||||
} |
||||
if (m_OverrideVoxelSize.boolValue) |
||||
EditorGUILayout.HelpBox("Voxel size controls how accurately the navigation mesh is generated from the level geometry. A good voxel size is 2-4 voxels per agent radius. Making voxel size smaller will increase build time.", MessageType.None); |
||||
} |
||||
EditorGUI.indentLevel--; |
||||
} |
||||
|
||||
// Override tile size |
||||
EditorGUILayout.PropertyField(m_OverrideTileSize); |
||||
|
||||
using (new EditorGUI.DisabledScope(!m_OverrideTileSize.boolValue || m_OverrideTileSize.hasMultipleDifferentValues)) |
||||
{ |
||||
EditorGUI.indentLevel++; |
||||
|
||||
EditorGUILayout.PropertyField(m_TileSize); |
||||
|
||||
if (!m_TileSize.hasMultipleDifferentValues && !m_VoxelSize.hasMultipleDifferentValues) |
||||
{ |
||||
float tileWorldSize = m_TileSize.intValue * m_VoxelSize.floatValue; |
||||
EditorGUILayout.LabelField(" ", tileWorldSize.ToString("0.00") + " world units", EditorStyles.miniLabel); |
||||
} |
||||
|
||||
if (!m_OverrideTileSize.hasMultipleDifferentValues) |
||||
{ |
||||
if (m_OverrideTileSize.boolValue) |
||||
EditorGUILayout.HelpBox("Tile size controls the how local the changes to the world are (rebuild or carve). Small tile size allows more local changes, while potentially generating more data in overal.", MessageType.None); |
||||
} |
||||
EditorGUI.indentLevel--; |
||||
} |
||||
|
||||
|
||||
// Height mesh |
||||
using (new EditorGUI.DisabledScope(true)) |
||||
{ |
||||
EditorGUILayout.PropertyField(m_BuildHeightMesh); |
||||
} |
||||
|
||||
EditorGUILayout.Space(); |
||||
EditorGUI.indentLevel--; |
||||
} |
||||
|
||||
EditorGUILayout.Space(); |
||||
|
||||
serializedObject.ApplyModifiedProperties(); |
||||
|
||||
var hadError = false; |
||||
var multipleTargets = targets.Length > 1; |
||||
foreach (NavMeshSurface navSurface in targets) |
||||
{ |
||||
var settings = navSurface.GetBuildSettings(); |
||||
// Calculating bounds is potentially expensive when unbounded - so here we just use the center/size. |
||||
// It means the validation is not checking vertical voxel limit correctly when the surface is set to something else than "in volume". |
||||
var bounds = new Bounds(Vector3.zero, Vector3.zero); |
||||
if (navSurface.collectObjects == CollectObjects.Volume) |
||||
{ |
||||
bounds = new Bounds(navSurface.center, navSurface.size); |
||||
} |
||||
|
||||
var errors = settings.ValidationReport(bounds); |
||||
if (errors.Length > 0) |
||||
{ |
||||
if (multipleTargets) |
||||
EditorGUILayout.LabelField(navSurface.name); |
||||
foreach (var err in errors) |
||||
{ |
||||
EditorGUILayout.HelpBox(err, MessageType.Warning); |
||||
} |
||||
GUILayout.BeginHorizontal(); |
||||
GUILayout.Space(EditorGUIUtility.labelWidth); |
||||
if (GUILayout.Button("Open Agent Settings...", EditorStyles.miniButton)) |
||||
NavMeshEditorHelpers.OpenAgentSettings(navSurface.agentTypeID); |
||||
GUILayout.EndHorizontal(); |
||||
hadError = true; |
||||
} |
||||
} |
||||
|
||||
if (hadError) |
||||
EditorGUILayout.Space(); |
||||
|
||||
using (new EditorGUI.DisabledScope(Application.isPlaying || m_AgentTypeID.intValue == -1)) |
||||
{ |
||||
GUILayout.BeginHorizontal(); |
||||
GUILayout.Space(EditorGUIUtility.labelWidth); |
||||
if (GUILayout.Button("Clear")) |
||||
{ |
||||
foreach (NavMeshSurface s in targets) |
||||
ClearSurface(s); |
||||
SceneView.RepaintAll(); |
||||
} |
||||
|
||||
if (GUILayout.Button("Bake")) |
||||
{ |
||||
// Remove first to avoid double registration of the callback |
||||
EditorApplication.update -= UpdateAsyncBuildOperations; |
||||
EditorApplication.update += UpdateAsyncBuildOperations; |
||||
|
||||
foreach (NavMeshSurface surf in targets) |
||||
{ |
||||
var oper = new AsyncBakeOperation(); |
||||
|
||||
oper.bakeData = InitializeBakeData(surf); |
||||
oper.bakeOperation = surf.UpdateNavMesh(oper.bakeData); |
||||
oper.surface = surf; |
||||
|
||||
s_BakeOperations.Add(oper); |
||||
} |
||||
} |
||||
|
||||
GUILayout.EndHorizontal(); |
||||
} |
||||
|
||||
// Show progress for the selected targets |
||||
for (int i = s_BakeOperations.Count - 1; i >= 0; --i) |
||||
{ |
||||
if (!targets.Contains(s_BakeOperations[i].surface)) |
||||
continue; |
||||
|
||||
var oper = s_BakeOperations[i].bakeOperation; |
||||
if (oper == null) |
||||
continue; |
||||
|
||||
var p = oper.progress; |
||||
if (oper.isDone) |
||||
{ |
||||
SceneView.RepaintAll(); |
||||
continue; |
||||
} |
||||
|
||||
GUILayout.BeginHorizontal(); |
||||
|
||||
if (GUILayout.Button("Cancel", EditorStyles.miniButton)) |
||||
{ |
||||
var bakeData = s_BakeOperations[i].bakeData; |
||||
UnityEngine.AI.NavMeshBuilder.Cancel(bakeData); |
||||
s_BakeOperations.RemoveAt(i); |
||||
} |
||||
|
||||
EditorGUI.ProgressBar(EditorGUILayout.GetControlRect(), p, "Baking: " + (int)(100 * p) + "%"); |
||||
if (p <= 1) |
||||
Repaint(); |
||||
|
||||
GUILayout.EndHorizontal(); |
||||
} |
||||
} |
||||
|
||||
static NavMeshData InitializeBakeData(NavMeshSurface surface) |
||||
{ |
||||
var emptySources = new List<NavMeshBuildSource>(); |
||||
var emptyBounds = new Bounds(); |
||||
return UnityEngine.AI.NavMeshBuilder.BuildNavMeshData(surface.GetBuildSettings(), emptySources, emptyBounds |
||||
, surface.transform.position, surface.transform.rotation); |
||||
} |
||||
|
||||
static void UpdateAsyncBuildOperations() |
||||
{ |
||||
foreach (var oper in s_BakeOperations) |
||||
{ |
||||
if (oper.surface == null || oper.bakeOperation == null) |
||||
continue; |
||||
|
||||
if (oper.bakeOperation.isDone) |
||||
{ |
||||
var surface = oper.surface; |
||||
var delete = GetNavMeshAssetToDelete(surface); |
||||
if (delete != null) |
||||
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(delete)); |
||||
|
||||
surface.RemoveData(); |
||||
surface.navMeshData = oper.bakeData; |
||||
if (surface.isActiveAndEnabled) |
||||
surface.AddData(); |
||||
CreateNavMeshAsset(surface); |
||||
EditorSceneManager.MarkSceneDirty(surface.gameObject.scene); |
||||
} |
||||
} |
||||
s_BakeOperations.RemoveAll(o => o.bakeOperation == null || o.bakeOperation.isDone); |
||||
if (s_BakeOperations.Count == 0) |
||||
EditorApplication.update -= UpdateAsyncBuildOperations; |
||||
} |
||||
|
||||
[DrawGizmo(GizmoType.Selected | GizmoType.Active | GizmoType.Pickable)] |
||||
static void RenderBoxGizmoSelected(NavMeshSurface navSurface, GizmoType gizmoType) |
||||
{ |
||||
RenderBoxGizmo(navSurface, gizmoType, true); |
||||
} |
||||
|
||||
[DrawGizmo(GizmoType.NotInSelectionHierarchy | GizmoType.Pickable)] |
||||
static void RenderBoxGizmoNotSelected(NavMeshSurface navSurface, GizmoType gizmoType) |
||||
{ |
||||
if (NavMeshVisualizationSettings.showNavigation > 0) |
||||
RenderBoxGizmo(navSurface, gizmoType, false); |
||||
else |
||||
Gizmos.DrawIcon(navSurface.transform.position, "NavMeshSurface Icon", true); |
||||
} |
||||
|
||||
static void RenderBoxGizmo(NavMeshSurface navSurface, GizmoType gizmoType, bool selected) |
||||
{ |
||||
var color = selected ? s_HandleColorSelected : s_HandleColor; |
||||
if (!navSurface.enabled) |
||||
color = s_HandleColorDisabled; |
||||
|
||||
var oldColor = Gizmos.color; |
||||
var oldMatrix = Gizmos.matrix; |
||||
|
||||
// Use the unscaled matrix for the NavMeshSurface |
||||
var localToWorld = Matrix4x4.TRS(navSurface.transform.position, navSurface.transform.rotation, Vector3.one); |
||||
Gizmos.matrix = localToWorld; |
||||
|
||||
if (navSurface.collectObjects == CollectObjects.Volume) |
||||
{ |
||||
Gizmos.color = color; |
||||
Gizmos.DrawWireCube(navSurface.center, navSurface.size); |
||||
|
||||
if (selected && navSurface.enabled) |
||||
{ |
||||
var colorTrans = new Color(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, color.a * 0.15f); |
||||
Gizmos.color = colorTrans; |
||||
Gizmos.DrawCube(navSurface.center, navSurface.size); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (navSurface.navMeshData != null) |
||||
{ |
||||
var bounds = navSurface.navMeshData.sourceBounds; |
||||
Gizmos.color = Color.grey; |
||||
Gizmos.DrawWireCube(bounds.center, bounds.size); |
||||
} |
||||
} |
||||
|
||||
Gizmos.matrix = oldMatrix; |
||||
Gizmos.color = oldColor; |
||||
|
||||
Gizmos.DrawIcon(navSurface.transform.position, "NavMeshSurface Icon", true); |
||||
} |
||||
|
||||
void InspectorEditButtonGUI() |
||||
{ |
||||
var navSurface = (NavMeshSurface)target; |
||||
var bounds = new Bounds(navSurface.transform.position, navSurface.size); |
||||
|
||||
EditMode.DoEditModeInspectorModeButton( |
||||
EditMode.SceneViewEditMode.Collider, |
||||
"Edit Volume", |
||||
EditorGUIUtility.IconContent("EditCollider"), |
||||
bounds, |
||||
this |
||||
); |
||||
} |
||||
|
||||
void OnSceneGUI() |
||||
{ |
||||
if (!editingCollider) |
||||
return; |
||||
|
||||
var navSurface = (NavMeshSurface)target; |
||||
var color = navSurface.enabled ? s_HandleColor : s_HandleColorDisabled; |
||||
var localToWorld = Matrix4x4.TRS(navSurface.transform.position, navSurface.transform.rotation, Vector3.one); |
||||
using (new Handles.DrawingScope(color, localToWorld)) |
||||
{ |
||||
m_BoundsHandle.center = navSurface.center; |
||||
m_BoundsHandle.size = navSurface.size; |
||||
|
||||
EditorGUI.BeginChangeCheck(); |
||||
m_BoundsHandle.DrawHandle(); |
||||
if (EditorGUI.EndChangeCheck()) |
||||
{ |
||||
Undo.RecordObject(navSurface, "Modified NavMesh Surface"); |
||||
Vector3 center = m_BoundsHandle.center; |
||||
Vector3 size = m_BoundsHandle.size; |
||||
navSurface.center = center; |
||||
navSurface.size = size; |
||||
EditorUtility.SetDirty(target); |
||||
} |
||||
} |
||||
} |
||||
|
||||
[MenuItem("GameObject/AI/NavMesh Surface", false, 2000)] |
||||
public static void CreateNavMeshSurface(MenuCommand menuCommand) |
||||
{ |
||||
var parent = menuCommand.context as GameObject; |
||||
var go = NavMeshComponentsGUIUtility.CreateAndSelectGameObject("NavMesh Surface", parent); |
||||
go.AddComponent<NavMeshSurface>(); |
||||
var view = SceneView.lastActiveSceneView; |
||||
if (view != null) |
||||
view.MoveToView(go.transform); |
||||
} |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 1c32167dbf3314852b6006a288eb449b |
||||
timeCreated: 1476968447 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {instanceID: 0} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,172 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace UnityEngine.AI |
||||
{ |
||||
[ExecuteInEditMode] |
||||
[DefaultExecutionOrder(-101)] |
||||
[AddComponentMenu("Navigation/NavMeshLink", 33)] |
||||
[HelpURL("https://github.com/Unity-Technologies/NavMeshComponents#documentation-draft")] |
||||
public class NavMeshLink : MonoBehaviour |
||||
{ |
||||
[SerializeField] |
||||
int m_AgentTypeID; |
||||
public int agentTypeID { get { return m_AgentTypeID; } set { m_AgentTypeID = value; UpdateLink(); } } |
||||
|
||||
[SerializeField] |
||||
Vector3 m_StartPoint = new Vector3(0.0f, 0.0f, -2.5f); |
||||
public Vector3 startPoint { get { return m_StartPoint; } set { m_StartPoint = value; UpdateLink(); } } |
||||
|
||||
[SerializeField] |
||||
Vector3 m_EndPoint = new Vector3(0.0f, 0.0f, 2.5f); |
||||
public Vector3 endPoint { get { return m_EndPoint; } set { m_EndPoint = value; UpdateLink(); } } |
||||
|
||||
[SerializeField] |
||||
float m_Width; |
||||
public float width { get { return m_Width; } set { m_Width = value; UpdateLink(); } } |
||||
|
||||
[SerializeField] |
||||
int m_CostModifier = -1; |
||||
public int costModifier { get { return m_CostModifier; } set { m_CostModifier = value; UpdateLink(); } } |
||||
|
||||
[SerializeField] |
||||
bool m_Bidirectional = true; |
||||
public bool bidirectional { get { return m_Bidirectional; } set { m_Bidirectional = value; UpdateLink(); } } |
||||
|
||||
[SerializeField] |
||||
bool m_AutoUpdatePosition; |
||||
public bool autoUpdate { get { return m_AutoUpdatePosition; } set { SetAutoUpdate(value); } } |
||||
|
||||
[SerializeField] |
||||
int m_Area; |
||||
public int area { get { return m_Area; } set { m_Area = value; UpdateLink(); } } |
||||
|
||||
NavMeshLinkInstance m_LinkInstance = new NavMeshLinkInstance(); |
||||
|
||||
Vector3 m_LastPosition = Vector3.zero; |
||||
Quaternion m_LastRotation = Quaternion.identity; |
||||
|
||||
static readonly List<NavMeshLink> s_Tracked = new List<NavMeshLink>(); |
||||
|
||||
void OnEnable() |
||||
{ |
||||
AddLink(); |
||||
if (m_AutoUpdatePosition && m_LinkInstance.valid) |
||||
AddTracking(this); |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
RemoveTracking(this); |
||||
m_LinkInstance.Remove(); |
||||
} |
||||
|
||||
public void UpdateLink() |
||||
{ |
||||
m_LinkInstance.Remove(); |
||||
AddLink(); |
||||
} |
||||
|
||||
static void AddTracking(NavMeshLink link) |
||||
{ |
||||
#if UNITY_EDITOR |
||||
if (s_Tracked.Contains(link)) |
||||
{ |
||||
Debug.LogError("Link is already tracked: " + link); |
||||
return; |
||||
} |
||||
#endif |
||||
|
||||
if (s_Tracked.Count == 0) |
||||
NavMesh.onPreUpdate += UpdateTrackedInstances; |
||||
|
||||
s_Tracked.Add(link); |
||||
} |
||||
|
||||
static void RemoveTracking(NavMeshLink link) |
||||
{ |
||||
s_Tracked.Remove(link); |
||||
|
||||
if (s_Tracked.Count == 0) |
||||
NavMesh.onPreUpdate -= UpdateTrackedInstances; |
||||
} |
||||
|
||||
void SetAutoUpdate(bool value) |
||||
{ |
||||
if (m_AutoUpdatePosition == value) |
||||
return; |
||||
m_AutoUpdatePosition = value; |
||||
if (value) |
||||
AddTracking(this); |
||||
else |
||||
RemoveTracking(this); |
||||
} |
||||
|
||||
void AddLink() |
||||
{ |
||||
#if UNITY_EDITOR |
||||
if (m_LinkInstance.valid) |
||||
{ |
||||
Debug.LogError("Link is already added: " + this); |
||||
return; |
||||
} |
||||
#endif |
||||
|
||||
var link = new NavMeshLinkData(); |
||||
link.startPosition = m_StartPoint; |
||||
link.endPosition = m_EndPoint; |
||||
link.width = m_Width; |
||||
link.costModifier = m_CostModifier; |
||||
link.bidirectional = m_Bidirectional; |
||||
link.area = m_Area; |
||||
link.agentTypeID = m_AgentTypeID; |
||||
m_LinkInstance = NavMesh.AddLink(link, transform.position, transform.rotation); |
||||
if (m_LinkInstance.valid) |
||||
m_LinkInstance.owner = this; |
||||
|
||||
m_LastPosition = transform.position; |
||||
m_LastRotation = transform.rotation; |
||||
} |
||||
|
||||
bool HasTransformChanged() |
||||
{ |
||||
if (m_LastPosition != transform.position) return true; |
||||
if (m_LastRotation != transform.rotation) return true; |
||||
return false; |
||||
} |
||||
|
||||
void OnDidApplyAnimationProperties() |
||||
{ |
||||
UpdateLink(); |
||||
} |
||||
|
||||
static void UpdateTrackedInstances() |
||||
{ |
||||
foreach (var instance in s_Tracked) |
||||
{ |
||||
if (instance.HasTransformChanged()) |
||||
instance.UpdateLink(); |
||||
} |
||||
} |
||||
|
||||
#if UNITY_EDITOR |
||||
void OnValidate() |
||||
{ |
||||
m_Width = Mathf.Max(0.0f, m_Width); |
||||
|
||||
if (!m_LinkInstance.valid) |
||||
return; |
||||
|
||||
UpdateLink(); |
||||
|
||||
if (!m_AutoUpdatePosition) |
||||
{ |
||||
RemoveTracking(this); |
||||
} |
||||
else if (!s_Tracked.Contains(this)) |
||||
{ |
||||
AddTracking(this); |
||||
} |
||||
} |
||||
#endif |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 6eeb5dc026fdf4b488bc7ae0138ab719 |
||||
timeCreated: 1477924439 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {fileID: 2800000, guid: 92f4afa3e25264f5b964937ccea49ff2, type: 3} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,54 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace UnityEngine.AI |
||||
{ |
||||
[ExecuteInEditMode] |
||||
[AddComponentMenu("Navigation/NavMeshModifier", 32)] |
||||
[HelpURL("https://github.com/Unity-Technologies/NavMeshComponents#documentation-draft")] |
||||
public class NavMeshModifier : MonoBehaviour |
||||
{ |
||||
[SerializeField] |
||||
bool m_OverrideArea; |
||||
public bool overrideArea { get { return m_OverrideArea; } set { m_OverrideArea = value; } } |
||||
|
||||
[SerializeField] |
||||
int m_Area; |
||||
public int area { get { return m_Area; } set { m_Area = value; } } |
||||
|
||||
[SerializeField] |
||||
bool m_IgnoreFromBuild; |
||||
public bool ignoreFromBuild { get { return m_IgnoreFromBuild; } set { m_IgnoreFromBuild = value; } } |
||||
|
||||
// List of agent types the modifier is applied for. |
||||
// Special values: empty == None, m_AffectedAgents[0] =-1 == All. |
||||
[SerializeField] |
||||
List<int> m_AffectedAgents = new List<int>(new int[] { -1 }); // Default value is All |
||||
|
||||
static readonly List<NavMeshModifier> s_NavMeshModifiers = new List<NavMeshModifier>(); |
||||
|
||||
public static List<NavMeshModifier> activeModifiers |
||||
{ |
||||
get { return s_NavMeshModifiers; } |
||||
} |
||||
|
||||
void OnEnable() |
||||
{ |
||||
if (!s_NavMeshModifiers.Contains(this)) |
||||
s_NavMeshModifiers.Add(this); |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
s_NavMeshModifiers.Remove(this); |
||||
} |
||||
|
||||
public bool AffectsAgentType(int agentTypeID) |
||||
{ |
||||
if (m_AffectedAgents.Count == 0) |
||||
return false; |
||||
if (m_AffectedAgents[0] == -1) |
||||
return true; |
||||
return m_AffectedAgents.IndexOf(agentTypeID) != -1; |
||||
} |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 1e3fdca004f2d45fe8abbed571a8abd5 |
||||
timeCreated: 1477924411 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {fileID: 2800000, guid: cc7b9475dbddf4f9088d327d6e10ab77, type: 3} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,54 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace UnityEngine.AI |
||||
{ |
||||
[ExecuteInEditMode] |
||||
[AddComponentMenu("Navigation/NavMeshModifierVolume", 31)] |
||||
[HelpURL("https://github.com/Unity-Technologies/NavMeshComponents#documentation-draft")] |
||||
public class NavMeshModifierVolume : MonoBehaviour |
||||
{ |
||||
[SerializeField] |
||||
Vector3 m_Size = new Vector3(4.0f, 3.0f, 4.0f); |
||||
public Vector3 size { get { return m_Size; } set { m_Size = value; } } |
||||
|
||||
[SerializeField] |
||||
Vector3 m_Center = new Vector3(0, 1.0f, 0); |
||||
public Vector3 center { get { return m_Center; } set { m_Center = value; } } |
||||
|
||||
[SerializeField] |
||||
int m_Area; |
||||
public int area { get { return m_Area; } set { m_Area = value; } } |
||||
|
||||
// List of agent types the modifier is applied for. |
||||
// Special values: empty == None, m_AffectedAgents[0] =-1 == All. |
||||
[SerializeField] |
||||
List<int> m_AffectedAgents = new List<int>(new int[] { -1 }); // Default value is All |
||||
|
||||
static readonly List<NavMeshModifierVolume> s_NavMeshModifiers = new List<NavMeshModifierVolume>(); |
||||
|
||||
public static List<NavMeshModifierVolume> activeModifiers |
||||
{ |
||||
get { return s_NavMeshModifiers; } |
||||
} |
||||
|
||||
void OnEnable() |
||||
{ |
||||
if (!s_NavMeshModifiers.Contains(this)) |
||||
s_NavMeshModifiers.Add(this); |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
s_NavMeshModifiers.Remove(this); |
||||
} |
||||
|
||||
public bool AffectsAgentType(int agentTypeID) |
||||
{ |
||||
if (m_AffectedAgents.Count == 0) |
||||
return false; |
||||
if (m_AffectedAgents[0] == -1) |
||||
return true; |
||||
return m_AffectedAgents.IndexOf(agentTypeID) != -1; |
||||
} |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 35e95dc5ff2b64380880dd7ac5922847 |
||||
timeCreated: 1477924430 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {fileID: 2800000, guid: cc7b9475dbddf4f9088d327d6e10ab77, type: 3} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -1,426 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace UnityEngine.AI |
||||
{ |
||||
public enum CollectObjects |
||||
{ |
||||
All = 0, |
||||
Volume = 1, |
||||
Children = 2, |
||||
} |
||||
|
||||
[ExecuteInEditMode] |
||||
[DefaultExecutionOrder(-102)] |
||||
[AddComponentMenu("Navigation/NavMeshSurface", 30)] |
||||
[HelpURL("https://github.com/Unity-Technologies/NavMeshComponents#documentation-draft")] |
||||
public class NavMeshSurface : MonoBehaviour |
||||
{ |
||||
[SerializeField] |
||||
int m_AgentTypeID; |
||||
public int agentTypeID { get { return m_AgentTypeID; } set { m_AgentTypeID = value; } } |
||||
|
||||
[SerializeField] |
||||
CollectObjects m_CollectObjects = CollectObjects.All; |
||||
public CollectObjects collectObjects { get { return m_CollectObjects; } set { m_CollectObjects = value; } } |
||||
|
||||
[SerializeField] |
||||
Vector3 m_Size = new Vector3(10.0f, 10.0f, 10.0f); |
||||
public Vector3 size { get { return m_Size; } set { m_Size = value; } } |
||||
|
||||
[SerializeField] |
||||
Vector3 m_Center = new Vector3(0, 2.0f, 0); |
||||
public Vector3 center { get { return m_Center; } set { m_Center = value; } } |
||||
|
||||
[SerializeField] |
||||
LayerMask m_LayerMask = ~0; |
||||
public LayerMask layerMask { get { return m_LayerMask; } set { m_LayerMask = value; } } |
||||
|
||||
[SerializeField] |
||||
NavMeshCollectGeometry m_UseGeometry = NavMeshCollectGeometry.RenderMeshes; |
||||
public NavMeshCollectGeometry useGeometry { get { return m_UseGeometry; } set { m_UseGeometry = value; } } |
||||
|
||||
[SerializeField] |
||||
int m_DefaultArea; |
||||
public int defaultArea { get { return m_DefaultArea; } set { m_DefaultArea = value; } } |
||||
|
||||
[SerializeField] |
||||
bool m_IgnoreNavMeshAgent = true; |
||||
public bool ignoreNavMeshAgent { get { return m_IgnoreNavMeshAgent; } set { m_IgnoreNavMeshAgent = value; } } |
||||
|
||||
[SerializeField] |
||||
bool m_IgnoreNavMeshObstacle = true; |
||||
public bool ignoreNavMeshObstacle { get { return m_IgnoreNavMeshObstacle; } set { m_IgnoreNavMeshObstacle = value; } } |
||||
|
||||
[SerializeField] |
||||
bool m_OverrideTileSize; |
||||
public bool overrideTileSize { get { return m_OverrideTileSize; } set { m_OverrideTileSize = value; } } |
||||
[SerializeField] |
||||
int m_TileSize = 256; |
||||
public int tileSize { get { return m_TileSize; } set { m_TileSize = value; } } |
||||
[SerializeField] |
||||
bool m_OverrideVoxelSize; |
||||
public bool overrideVoxelSize { get { return m_OverrideVoxelSize; } set { m_OverrideVoxelSize = value; } } |
||||
[SerializeField] |
||||
float m_VoxelSize; |
||||
public float voxelSize { get { return m_VoxelSize; } set { m_VoxelSize = value; } } |
||||
|
||||
// Currently not supported advanced options |
||||
[SerializeField] |
||||
bool m_BuildHeightMesh; |
||||
public bool buildHeightMesh { get { return m_BuildHeightMesh; } set { m_BuildHeightMesh = value; } } |
||||
|
||||
// Reference to whole scene navmesh data asset. |
||||
[UnityEngine.Serialization.FormerlySerializedAs("m_BakedNavMeshData")] |
||||
[SerializeField] |
||||
NavMeshData m_NavMeshData; |
||||
public NavMeshData navMeshData { get { return m_NavMeshData; } set { m_NavMeshData = value; } } |
||||
|
||||
// Do not serialize - runtime only state. |
||||
NavMeshDataInstance m_NavMeshDataInstance; |
||||
Vector3 m_LastPosition = Vector3.zero; |
||||
Quaternion m_LastRotation = Quaternion.identity; |
||||
|
||||
static readonly List<NavMeshSurface> s_NavMeshSurfaces = new List<NavMeshSurface>(); |
||||
|
||||
public static List<NavMeshSurface> activeSurfaces |
||||
{ |
||||
get { return s_NavMeshSurfaces; } |
||||
} |
||||
|
||||
void OnEnable() |
||||
{ |
||||
Register(this); |
||||
AddData(); |
||||
} |
||||
|
||||
void OnDisable() |
||||
{ |
||||
RemoveData(); |
||||
Unregister(this); |
||||
} |
||||
|
||||
public void AddData() |
||||
{ |
||||
if (m_NavMeshDataInstance.valid) |
||||
return; |
||||
|
||||
if (m_NavMeshData != null) |
||||
{ |
||||
m_NavMeshDataInstance = NavMesh.AddNavMeshData(m_NavMeshData, transform.position, transform.rotation); |
||||
m_NavMeshDataInstance.owner = this; |
||||
} |
||||
|
||||
m_LastPosition = transform.position; |
||||
m_LastRotation = transform.rotation; |
||||
} |
||||
|
||||
public void RemoveData() |
||||
{ |
||||
m_NavMeshDataInstance.Remove(); |
||||
m_NavMeshDataInstance = new NavMeshDataInstance(); |
||||
} |
||||
|
||||
public NavMeshBuildSettings GetBuildSettings() |
||||
{ |
||||
var buildSettings = NavMesh.GetSettingsByID(m_AgentTypeID); |
||||
if (buildSettings.agentTypeID == -1) |
||||
{ |
||||
Debug.LogWarning("No build settings for agent type ID " + agentTypeID, this); |
||||
buildSettings.agentTypeID = m_AgentTypeID; |
||||
} |
||||
|
||||
if (overrideTileSize) |
||||
{ |
||||
buildSettings.overrideTileSize = true; |
||||
buildSettings.tileSize = tileSize; |
||||
} |
||||
if (overrideVoxelSize) |
||||
{ |
||||
buildSettings.overrideVoxelSize = true; |
||||
buildSettings.voxelSize = voxelSize; |
||||
} |
||||
return buildSettings; |
||||
} |
||||
|
||||
public void BuildNavMesh() |
||||
{ |
||||
var sources = CollectSources(); |
||||
|
||||
// Use unscaled bounds - this differs in behaviour from e.g. collider components. |
||||
// But is similar to reflection probe - and since navmesh data has no scaling support - it is the right choice here. |
||||
var sourcesBounds = new Bounds(m_Center, Abs(m_Size)); |
||||
if (m_CollectObjects == CollectObjects.All || m_CollectObjects == CollectObjects.Children) |
||||
{ |
||||
sourcesBounds = CalculateWorldBounds(sources); |
||||
} |
||||
|
||||
var data = NavMeshBuilder.BuildNavMeshData(GetBuildSettings(), |
||||
sources, sourcesBounds, transform.position, transform.rotation); |
||||
|
||||
if (data != null) |
||||
{ |
||||
data.name = gameObject.name; |
||||
RemoveData(); |
||||
m_NavMeshData = data; |
||||
if (isActiveAndEnabled) |
||||
AddData(); |
||||
} |
||||
} |
||||
|
||||
public AsyncOperation UpdateNavMesh(NavMeshData data) |
||||
{ |
||||
var sources = CollectSources(); |
||||
|
||||
// Use unscaled bounds - this differs in behaviour from e.g. collider components. |
||||
// But is similar to reflection probe - and since navmesh data has no scaling support - it is the right choice here. |
||||
var sourcesBounds = new Bounds(m_Center, Abs(m_Size)); |
||||
if (m_CollectObjects == CollectObjects.All || m_CollectObjects == CollectObjects.Children) |
||||
sourcesBounds = CalculateWorldBounds(sources); |
||||
|
||||
return NavMeshBuilder.UpdateNavMeshDataAsync(data, GetBuildSettings(), sources, sourcesBounds); |
||||
} |
||||
|
||||
static void Register(NavMeshSurface surface) |
||||
{ |
||||
if (s_NavMeshSurfaces.Count == 0) |
||||
NavMesh.onPreUpdate += UpdateActive; |
||||
|
||||
if (!s_NavMeshSurfaces.Contains(surface)) |
||||
s_NavMeshSurfaces.Add(surface); |
||||
} |
||||
|
||||
static void Unregister(NavMeshSurface surface) |
||||
{ |
||||
s_NavMeshSurfaces.Remove(surface); |
||||
|
||||
if (s_NavMeshSurfaces.Count == 0) |
||||
NavMesh.onPreUpdate -= UpdateActive; |
||||
} |
||||
|
||||
static void UpdateActive() |
||||
{ |
||||
for (var i = 0; i < s_NavMeshSurfaces.Count; ++i) |
||||
s_NavMeshSurfaces[i].UpdateDataIfTransformChanged(); |
||||
} |
||||
|
||||
void AppendModifierVolumes(ref List<NavMeshBuildSource> sources) |
||||
{ |
||||
// Modifiers |
||||
List<NavMeshModifierVolume> modifiers; |
||||
if (m_CollectObjects == CollectObjects.Children) |
||||
{ |
||||
modifiers = new List<NavMeshModifierVolume>(GetComponentsInChildren<NavMeshModifierVolume>()); |
||||
modifiers.RemoveAll(x => !x.isActiveAndEnabled); |
||||
} |
||||
else |
||||
{ |
||||
modifiers = NavMeshModifierVolume.activeModifiers; |
||||
} |
||||
|
||||
foreach (var m in modifiers) |
||||
{ |
||||
if ((m_LayerMask & (1 << m.gameObject.layer)) == 0) |
||||
continue; |
||||
if (!m.AffectsAgentType(m_AgentTypeID)) |
||||
continue; |
||||
var mcenter = m.transform.TransformPoint(m.center); |
||||
var scale = m.transform.lossyScale; |
||||
var msize = new Vector3(m.size.x * Mathf.Abs(scale.x), m.size.y * Mathf.Abs(scale.y), m.size.z * Mathf.Abs(scale.z)); |
||||
|
||||
var src = new NavMeshBuildSource(); |
||||
src.shape = NavMeshBuildSourceShape.ModifierBox; |
||||
src.transform = Matrix4x4.TRS(mcenter, m.transform.rotation, Vector3.one); |
||||
src.size = msize; |
||||
src.area = m.area; |
||||
sources.Add(src); |
||||
} |
||||
} |
||||
|
||||
List<NavMeshBuildSource> CollectSources() |
||||
{ |
||||
var sources = new List<NavMeshBuildSource>(); |
||||
var markups = new List<NavMeshBuildMarkup>(); |
||||
|
||||
List<NavMeshModifier> modifiers; |
||||
if (m_CollectObjects == CollectObjects.Children) |
||||
{ |
||||
modifiers = new List<NavMeshModifier>(GetComponentsInChildren<NavMeshModifier>()); |
||||
modifiers.RemoveAll(x => !x.isActiveAndEnabled); |
||||
} |
||||
else |
||||
{ |
||||
modifiers = NavMeshModifier.activeModifiers; |
||||
} |
||||
|
||||
foreach (var m in modifiers) |
||||
{ |
||||
if ((m_LayerMask & (1 << m.gameObject.layer)) == 0) |
||||
continue; |
||||
if (!m.AffectsAgentType(m_AgentTypeID)) |
||||
continue; |
||||
var markup = new NavMeshBuildMarkup(); |
||||
markup.root = m.transform; |
||||
markup.overrideArea = m.overrideArea; |
||||
markup.area = m.area; |
||||
markup.ignoreFromBuild = m.ignoreFromBuild; |
||||
markups.Add(markup); |
||||
} |
||||
|
||||
if (m_CollectObjects == CollectObjects.All) |
||||
{ |
||||
NavMeshBuilder.CollectSources(null, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); |
||||
} |
||||
else if (m_CollectObjects == CollectObjects.Children) |
||||
{ |
||||
NavMeshBuilder.CollectSources(transform, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); |
||||
} |
||||
else if (m_CollectObjects == CollectObjects.Volume) |
||||
{ |
||||
Matrix4x4 localToWorld = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one); |
||||
var worldBounds = GetWorldBounds(localToWorld, new Bounds(m_Center, m_Size)); |
||||
NavMeshBuilder.CollectSources(worldBounds, m_LayerMask, m_UseGeometry, m_DefaultArea, markups, sources); |
||||
} |
||||
|
||||
if (m_IgnoreNavMeshAgent) |
||||
sources.RemoveAll((x) => (x.component != null && x.component.gameObject.GetComponent<NavMeshAgent>() != null)); |
||||
|
||||
if (m_IgnoreNavMeshObstacle) |
||||
sources.RemoveAll((x) => (x.component != null && x.component.gameObject.GetComponent<NavMeshObstacle>() != null)); |
||||
|
||||
AppendModifierVolumes(ref sources); |
||||
|
||||
return sources; |
||||
} |
||||
|
||||
static Vector3 Abs(Vector3 v) |
||||
{ |
||||
return new Vector3(Mathf.Abs(v.x), Mathf.Abs(v.y), Mathf.Abs(v.z)); |
||||
} |
||||
|
||||
static Bounds GetWorldBounds(Matrix4x4 mat, Bounds bounds) |
||||
{ |
||||
var absAxisX = Abs(mat.MultiplyVector(Vector3.right)); |
||||
var absAxisY = Abs(mat.MultiplyVector(Vector3.up)); |
||||
var absAxisZ = Abs(mat.MultiplyVector(Vector3.forward)); |
||||
var worldPosition = mat.MultiplyPoint(bounds.center); |
||||
var worldSize = absAxisX * bounds.size.x + absAxisY * bounds.size.y + absAxisZ * bounds.size.z; |
||||
return new Bounds(worldPosition, worldSize); |
||||
} |
||||
|
||||
Bounds CalculateWorldBounds(List<NavMeshBuildSource> sources) |
||||
{ |
||||
// Use the unscaled matrix for the NavMeshSurface |
||||
Matrix4x4 worldToLocal = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one); |
||||
worldToLocal = worldToLocal.inverse; |
||||
|
||||
var result = new Bounds(); |
||||
foreach (var src in sources) |
||||
{ |
||||
switch (src.shape) |
||||
{ |
||||
case NavMeshBuildSourceShape.Mesh: |
||||
{ |
||||
var m = src.sourceObject as Mesh; |
||||
result.Encapsulate(GetWorldBounds(worldToLocal * src.transform, m.bounds)); |
||||
break; |
||||
} |
||||
case NavMeshBuildSourceShape.Terrain: |
||||
{ |
||||
// Terrain pivot is lower/left corner - shift bounds accordingly |
||||
var t = src.sourceObject as TerrainData; |
||||
result.Encapsulate(GetWorldBounds(worldToLocal * src.transform, new Bounds(0.5f * t.size, t.size))); |
||||
break; |
||||
} |
||||
case NavMeshBuildSourceShape.Box: |
||||
case NavMeshBuildSourceShape.Sphere: |
||||
case NavMeshBuildSourceShape.Capsule: |
||||
case NavMeshBuildSourceShape.ModifierBox: |
||||
result.Encapsulate(GetWorldBounds(worldToLocal * src.transform, new Bounds(Vector3.zero, src.size))); |
||||
break; |
||||
} |
||||
} |
||||
// Inflate the bounds a bit to avoid clipping co-planar sources |
||||
result.Expand(0.1f); |
||||
return result; |
||||
} |
||||
|
||||
bool HasTransformChanged() |
||||
{ |
||||
if (m_LastPosition != transform.position) return true; |
||||
if (m_LastRotation != transform.rotation) return true; |
||||
return false; |
||||
} |
||||
|
||||
void UpdateDataIfTransformChanged() |
||||
{ |
||||
if (HasTransformChanged()) |
||||
{ |
||||
RemoveData(); |
||||
AddData(); |
||||
} |
||||
} |
||||
|
||||
#if UNITY_EDITOR |
||||
bool UnshareNavMeshAsset() |
||||
{ |
||||
// Nothing to unshare |
||||
if (m_NavMeshData == null) |
||||
return false; |
||||
|
||||
// Prefab parent owns the asset reference |
||||
var prefabType = UnityEditor.PrefabUtility.GetPrefabType(this); |
||||
if (prefabType == UnityEditor.PrefabType.Prefab) |
||||
return false; |
||||
|
||||
// An instance can share asset reference only with its prefab parent |
||||
var prefab = UnityEditor.PrefabUtility.GetPrefabParent(this) as NavMeshSurface; |
||||
if (prefab != null && prefab.navMeshData == navMeshData) |
||||
return false; |
||||
|
||||
// Don't allow referencing an asset that's assigned to another surface |
||||
for (var i = 0; i < s_NavMeshSurfaces.Count; ++i) |
||||
{ |
||||
var surface = s_NavMeshSurfaces[i]; |
||||
if (surface != this && surface.m_NavMeshData == m_NavMeshData) |
||||
return true; |
||||
} |
||||
|
||||
// Asset is not referenced by known surfaces |
||||
return false; |
||||
} |
||||
|
||||
void OnValidate() |
||||
{ |
||||
if (UnshareNavMeshAsset()) |
||||
{ |
||||
Debug.LogWarning("Duplicating NavMeshSurface does not duplicate the referenced navmesh data", this); |
||||
m_NavMeshData = null; |
||||
} |
||||
|
||||
var settings = NavMesh.GetSettingsByID(m_AgentTypeID); |
||||
if (settings.agentTypeID != -1) |
||||
{ |
||||
// When unchecking the override control, revert to automatic value. |
||||
const float kMinVoxelSize = 0.01f; |
||||
if (!m_OverrideVoxelSize) |
||||
m_VoxelSize = settings.agentRadius / 3.0f; |
||||
if (m_VoxelSize < kMinVoxelSize) |
||||
m_VoxelSize = kMinVoxelSize; |
||||
|
||||
// When unchecking the override control, revert to default value. |
||||
const int kMinTileSize = 16; |
||||
const int kMaxTileSize = 1024; |
||||
const int kDefaultTileSize = 256; |
||||
|
||||
if (!m_OverrideTileSize) |
||||
m_TileSize = kDefaultTileSize; |
||||
// Make sure tilesize is in sane range. |
||||
if (m_TileSize < kMinTileSize) |
||||
m_TileSize = kMinTileSize; |
||||
if (m_TileSize > kMaxTileSize) |
||||
m_TileSize = kMaxTileSize; |
||||
} |
||||
} |
||||
#endif |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 7a5ac11cc976e418e8d13136b07e1f52 |
||||
timeCreated: 1477658803 |
||||
licenseType: Pro |
||||
MonoImporter: |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {fileID: 2800000, guid: e4f97225bcfb64760a1c81f460837f01, type: 3} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
Binary file not shown.
@ -1,9 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: ce67aa87f613246dda63a54a59c6399e |
||||
guid: b3d1f32d65c07f442ac9ff9fafaa5664 |
||||
folderAsset: yes |
||||
timeCreated: 1477656493 |
||||
licenseType: Pro |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 15a941f60c12a414d9c417b2ce58ce20 |
||||
NativeFormatImporter: |
||||
externalObjects: {} |
||||
mainObjectFileID: 23800000 |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 5443fbb919536b54b905a1b2b7b2c5ba |
||||
NativeFormatImporter: |
||||
externalObjects: {} |
||||
mainObjectFileID: 23800000 |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: b0daca81a49210144bec4f5f73f08dfa |
||||
NativeFormatImporter: |
||||
externalObjects: {} |
||||
mainObjectFileID: 23800000 |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: e2b7b1b508a9d0e408d7684334527b2c |
||||
folderAsset: yes |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 6b89ef4c944b9e7418d3b4024d0decca |
||||
folderAsset: yes |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2 |
||||
guid: db7969351fcfedb4b975989e8ca37743 |
||||
folderAsset: yes |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
@ -0,0 +1,7 @@
|
||||
ManifestFileVersion: 0 |
||||
CRC: 3737317855 |
||||
AssetBundleManifest: |
||||
AssetBundleInfos: |
||||
Info_0: |
||||
Name: buildingscene |
||||
Dependencies: {} |
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: f259f3e16fd96e6468c25ceefdbbb99c |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 56999be2a9831e041ba167c4259defbf |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
@ -0,0 +1,90 @@
|
||||
ManifestFileVersion: 0 |
||||
CRC: 820184934 |
||||
Hashes: |
||||
AssetFileHash: |
||||
serializedVersion: 2 |
||||
Hash: 8efddcccf497dc89569f5d7e55548236 |
||||
TypeTreeHash: |
||||
serializedVersion: 2 |
||||
Hash: 8fbbfb655623d14ed1f0c3b555d04896 |
||||
HashAppended: 0 |
||||
ClassTypes: |
||||
- Class: 1 |
||||
Script: {instanceID: 0} |
||||
- Class: 4 |
||||
Script: {instanceID: 0} |
||||
- Class: 21 |
||||
Script: {instanceID: 0} |
||||
- Class: 23 |
||||
Script: {instanceID: 0} |
||||
- Class: 28 |
||||
Script: {instanceID: 0} |
||||
- Class: 33 |
||||
Script: {instanceID: 0} |
||||
- Class: 43 |
||||
Script: {instanceID: 0} |
||||
- Class: 48 |
||||
Script: {instanceID: 0} |
||||
- Class: 54 |
||||
Script: {instanceID: 0} |
||||
- Class: 64 |
||||
Script: {instanceID: 0} |
||||
- Class: 65 |
||||
Script: {instanceID: 0} |
||||
- Class: 89 |
||||
Script: {instanceID: 0} |
||||
- Class: 90 |
||||
Script: {instanceID: 0} |
||||
- Class: 95 |
||||
Script: {instanceID: 0} |
||||
- Class: 104 |
||||
Script: {instanceID: 0} |
||||
- Class: 108 |
||||
Script: {instanceID: 0} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: aa1f1270d46555242a09e19e2554b69d, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: fd42edc0528b69e47a0c0407a6f90de3, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: 712a283132a1e8b46bd64e3f0f5d00ef, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: fc5d3a91519213c43bec42ee0cd908b5, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: 9e8d81443c4641144bb54392c5b90233, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: 855cd69516f3c9e4095be8f84d8cbb33, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: 28640857f2acbb94a8a9b0cb8c93f6e2, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: 1484a02a1308f9543948959945236b07, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: f2c11c5c093508449a2f2850d6770784, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: 7a592bcc2aa8b3c4bbbd433c6588e4c7, type: 3} |
||||
- Class: 114 |
||||
Script: {fileID: 11500000, guid: 55475a7d97e0f00459a5739bca447956, type: 3} |
||||
- Class: 115 |
||||
Script: {instanceID: 0} |
||||
- Class: 123 |
||||
Script: {instanceID: 0} |
||||
- Class: 136 |
||||
Script: {instanceID: 0} |
||||
- Class: 157 |
||||
Script: {instanceID: 0} |
||||
- Class: 193 |
||||
Script: {instanceID: 0} |
||||
- Class: 205 |
||||
Script: {instanceID: 0} |
||||
- Class: 226 |
||||
Script: {instanceID: 0} |
||||
- Class: 227 |
||||
Script: {instanceID: 0} |
||||
- Class: 228 |
||||
Script: {instanceID: 0} |
||||
- Class: 238 |
||||
Script: {instanceID: 0} |
||||
- Class: 258 |
||||
Script: {instanceID: 0} |
||||
Assets: |
||||
- Assets/Scenes/BuildingScene.unity |
||||
Dependencies: [] |
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: f2679ae8e40a0364ab3a2dcb617e64b6 |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 41c8806823b86434fb654692c5eb42e5 |
||||
DefaultImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 59ca76adf7b7af2488cf553f93ee7d8d |
||||
TextScriptImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Binary file not shown.
Loading…
Reference in new issue