//创建地图 public static GameObject CreateMap(Object mapSource, Vector3 worldPos = default(Vector3), Vector2 mapGridSize = default(Vector2), Color GridGolor = default(Color)) { if (mapGridSize == default(Vector2)) { mapGridSize = new Vector2(72f, 40f); } if (GridGolor == default(Color)) { GridGolor.a = 1f; } GameObject map = PrefabUtility.InstantiatePrefab(mapSource) as GameObject; SceneEditorSettings.currMap = map; map.transform.localPosition = worldPos; map.transform.localScale = Vector3.one; UISceneMap uimap = map.AddComponent <UISceneMap>(); uimap.mapSettingData.sourcePath = AssetDatabase.GetAssetPath(mapSource); uimap.mapSettingData.Type = SceneElementType.MAP; uimap.axisColors = GridGolor; uimap.renderFrom = new Vector3(-mapGridSize.x, -mapGridSize.y, 0); uimap.renderTo = new Vector3(mapGridSize.x, mapGridSize.y, 0); uimap.InitData(); return(map); }
//bool isfllowCamera = false; public void OnSceneGUI() { base.OnSceneGUI(); if (uiMap == null) { uiMap = (UISceneMap)target; } Handles.BeginGUI(); //规定GUI显示区域 GUILayout.BeginArea(new Rect(100, 70, 200, 100)); /*正在编辑*/ GUILayout.Label(EditorStringConfig.getString(10030) + ":" + uiMap.gameObject.name); //GFGrid gfGrid = SceneEditorSettings.mapGrid; /*显示网格*/ uiMap.isShowMap = GUILayout.Toggle(uiMap.isShowMap, EditorStringConfig.getString(10005)); /*允许复活*/ uiMap.mapData.canReborn = System.Convert.ToInt32(GUILayout.Toggle(System.Convert.ToBoolean(uiMap.mapData.canReborn), EditorStringConfig.getString(10039))); GUILayout.EndArea(); Handles.EndGUI(); }
//自动生成游戏数据 public static void AutoGenerateGameData() { if (SceneEditorSettings.currMap == null) { EditorUtility.DisplayDialog("友情提示", "当前是场景为空,请先创建场景", "确定"); return; } //获取地图 UISceneMap mapData = SceneEditorSettings.currMap.GetComponent <UISceneMap>(); //获取NPC UINPC[] npcDatas = SceneEditorSettings.currMap.GetComponentsInChildren <UINPC>(); //获取碰撞盒子 UISpecialArea[] areaData = SceneEditorSettings.currMap.GetComponentsInChildren <UISpecialArea>(); string path = EditorUtility.SaveFilePanel("导出配置文件", Application.dataPath + "/StreamingAssets/Config", "SceneEditorData", "cfg"); if (string.IsNullOrEmpty(path)) { return; } try { FileStream aFile = new FileStream(path, FileMode.Create); StreamWriter sw = new StreamWriter(aFile); //写入地图 mapData.UpdateData(); sw.WriteLine("M" + fastJSON.JSON.Instance.ToJSON(mapData.mapData)); //写入NPC foreach (UINPC data in npcDatas) { data.UpdateData(); sw.WriteLine("N" + fastJSON.JSON.Instance.ToJSON(data.npcData)); } //写入碰撞盒子 foreach (UISpecialArea data in areaData) { data.UpdateData(); sw.WriteLine("C" + fastJSON.JSON.Instance.ToJSON(data.areaData)); } sw.Close(); } catch (IOException ex) { EditorUtility.DisplayDialog("错误", ex.ToString(), "确定"); } }
public override void OnInspectorGUI() { if (uiMap == null) { uiMap = (UISceneMap)target; } uiMap.mapData.canReborn = System.Convert.ToInt32(GUILayout.Toggle(System.Convert.ToBoolean(uiMap.mapData.canReborn), "canReborn")); if (GUI.changed) { SceneView.RepaintAll(); } }
//创建种植物 public static GameObject CreatePlant(Object resource, Vector3 worldpos, Vector3 scale, SceneElementType type, bool BornAtMap = true, Vector3 worldrotation = default(Vector3)) { GameObject createObj = PrefabUtility.InstantiatePrefab(resource) as GameObject; UISceneMap uiSceneMap = SceneEditorSettings.currMap.GetComponent <UISceneMap>(); int TypeIndex = (int)type; if (uiSceneMap != null) { createObj.transform.parent = uiSceneMap.ElementParents[TypeIndex - 1]; createObj.transform.localScale = scale; createObj.transform.rotation = Quaternion.Euler(worldrotation); createObj.transform.position = worldpos; } switch (type) { case SceneElementType.NPC: { UINPC npc = null; if (createObj != null) { npc = createObj.AddComponent <UINPC>(); } if (npc != null) { //保存数据 npc.npcSettingData.isAtMap = BornAtMap; npc.npcSettingData.Type = type; npc.npcSettingData.sourcePath = AssetDatabase.GetAssetPath(resource); CharacterController controller = npc.GetComponent <CharacterController>(); if (controller != null) { CapsuleCollider capsule = npc.gameObject.AddComponent <CapsuleCollider>(); if (capsule != null) { capsule.center = controller.center; capsule.radius = controller.radius; capsule.height = controller.height; capsule.direction = 1; } } } break; } case SceneElementType.BUILDING: { break; } case SceneElementType.TREE: { break; } default: { UISpecialArea area = createObj.GetComponent <UISpecialArea>(); if (area == null) { area = createObj.AddComponent <UISpecialArea>(); } //保存数据 area.areaSettingData.isAtMap = BornAtMap; area.areaSettingData.Type = type; area.areaSettingData.sourcePath = AssetDatabase.GetAssetPath(resource); break; } } Selection.activeObject = createObj; return(createObj); }
//自动导入配置文件 public static void AutoImportSettingFile() { string path = EditorUtility.OpenFilePanel("导入场景配置文件", Application.dataPath + "/Editor/SceneEditor/JC", "bytes"); if (string.IsNullOrEmpty(path)) { return; } List <SceneEditorSettingBaseData> settingDataList = new List <SceneEditorSettingBaseData>(); string strLine = null; try { FileStream aFile = new FileStream(path, FileMode.Open); StreamReader sr = new StreamReader(aFile); strLine = sr.ReadLine(); while (strLine != null) { if (strLine.Length > 0) { SceneEditorSettingBaseData settingData = null; string content = strLine.Substring(1); switch (strLine[0]) { case 'M': { MapSettingData mapData = fastJSON.JSON.Instance.ToObject <MapSettingData>(content); settingData = (SceneEditorSettingBaseData)mapData; break; } case 'N': { NPCSettingData npcData = fastJSON.JSON.Instance.ToObject <NPCSettingData>(content); settingData = (SceneEditorSettingBaseData)npcData; break; } case 'C': { SpecialAreaSettingData areaData = fastJSON.JSON.Instance.ToObject <SpecialAreaSettingData>(content); settingData = (SceneEditorSettingBaseData)areaData; break; } } if (settingData != null) { settingDataList.Add(settingData); } } strLine = sr.ReadLine(); } sr.Close(); } catch (IOException ex) { EditorUtility.DisplayDialog("错误", ex.ToString(), "确定"); return; } //Debug.LogError("settingDataList.count="+settingDataList.Count.ToString() ); //生成场景 foreach (SceneEditorSettingBaseData baseData in settingDataList) { GameObject create = null; if (baseData.Type == SceneElementType.MAP) { MapSettingData data = (MapSettingData)baseData; create = CreateMap(data.sourcePath, new Vector3(data.Attribute.pos[0], data.Attribute.pos[1], data.Attribute.pos[2]), new Vector2(data.GridSize[0], data.GridSize[1]), new Color(data.GridColor[0], data.GridColor[1], data.GridColor[2], data.GridColor[3])); if (create != null) { UISceneMap uimap = create.GetComponent <UISceneMap>(); if (uimap != null) { uimap.settingData = data; uimap.mapData = data.Attribute; uimap.InitData(); } } else { break; } } else if (baseData.Type == SceneElementType.NPC) { NPCSettingData data = (NPCSettingData)baseData; create = CreatePlant(data.sourcePath, new Vector3(data.Attribute.pos[0], data.Attribute.pos[1], data.Attribute.pos[2]), new Vector3(data.Attribute.scale[0], data.Attribute.scale[1], data.Attribute.scale[2]), data.Type, data.isAtMap, new Vector3(data.Attribute.rotation[0], data.Attribute.rotation[1], data.Attribute.rotation[2])); if (create != null) { //Debug.LogError(data.Attribute.startIntervalTime.ToString()); UINPC uinpc = create.GetComponent <UINPC>(); if (uinpc != null) { uinpc.settingData = data; uinpc.npcData = data.Attribute; uinpc.InitData(); } } } else { SpecialAreaSettingData data = (SpecialAreaSettingData)baseData; create = CreatePlant(data.sourcePath, new Vector3(data.Attribute.pos[0], data.Attribute.pos[1], data.Attribute.pos[2]), new Vector3(data.Attribute.scale[0], data.Attribute.scale[1], data.Attribute.scale[2]), data.Type, data.isAtMap, new Vector3(data.Attribute.rotation[0], data.Attribute.rotation[1], data.Attribute.rotation[2])); UISpecialArea uiarea = create.GetComponent <UISpecialArea>(); if (uiarea != null) { uiarea.settingData = data; uiarea.areaData = data.Attribute; uiarea.InitData(); } } } }
static void OnSceneDraw(SceneView sceneView) { if (Event.current.isKey) { if (Event.current.type == EventType.KeyDown) { if (Event.current.keyCode == KeyCode.A) { SceneEditorSettings.isOpenFllowMouse = !SceneEditorSettings.isOpenFllowMouse; } } } if (Event.current.isMouse) { if (Event.current.type == EventType.MouseDown) { /*拖拽鼠标具备选中功能*/ if (Tools.current == Tool.View) { Vector3 mousePosition = Event.current.mousePosition; float height = SceneView.currentDrawingSceneView.position.height; mousePosition.y = height - mousePosition.y - 15f; Ray ray = sceneView.camera.ScreenPointToRay(mousePosition); RaycastHit hit; Physics.Raycast(ray, out hit); if (hit.transform != null && hit.transform.name != "Grid") { GameObject OldSelection = Selection.activeObject as GameObject; if (OldSelection != hit.transform.gameObject) { UISceneElementBase _old = null; if (OldSelection != null) { _old = OldSelection.GetComponent <UISceneElementBase>(); } if (_old != null) { _old.OnLostFocus(); } UISceneElementBase _new = hit.transform.gameObject.GetComponent <UISceneElementBase>(); if (_new != null) { _new.OnFocus(); } Selection.activeObject = hit.transform.gameObject; } } } } } //开始绘制GUI Handles.BeginGUI(); GUILayout.BeginArea(new Rect(0, sceneView.position.height - 70, 200, 200)); string currMapName = ""; if (SceneEditorSettings.currMap != null) { currMapName = SceneEditorSettings.currMap.name; } /*正在编辑*/ GUILayout.Label(EditorStringConfig.getString(10030) + ": " + currMapName); #region 标跟随 /*是否打开了鼠标跟随功能*/ bool isOpenFllowMouseOld = SceneEditorSettings.isOpenFllowMouse; SceneEditorSettings.isOpenFllowMouse = GUILayout.Toggle(SceneEditorSettings.isOpenFllowMouse, EditorStringConfig.getString(10032) + "(" + EditorStringConfig.getString(10045) + ":A)"); /*从拖拽状态切出*/ if (isOpenFllowMouseOld != SceneEditorSettings.isOpenFllowMouse && isOpenFllowMouseOld) { Tools.current = Tool.Move; } /*强制鼠标拖拽*/ if (SceneEditorSettings.isOpenFllowMouse) { Tools.current = Tool.View; } #endregion if (SceneEditorSettings.currMap != null) { UISceneMap map = SceneEditorSettings.currMap.GetComponent <UISceneMap>(); if (map != null) { if (map.EditorCamera != null) { //bool isOldOpen = isOpenSceneCamera; /*打开场景摄像机*/ isOpenSceneCamera = GUILayout.Toggle(isOpenSceneCamera, EditorStringConfig.getString(10029)); map.EditorCamera.enabled = isOpenSceneCamera; //map.EditorCamera.hideFlags = HideFlags.NotEditable; if (map.EditorCamera.isOrthoGraphic) { map.EditorCamera.isOrthoGraphic = false; } map.EditorCamera.transform.rotation = sceneView.camera.transform.rotation; map.EditorCamera.transform.position = sceneView.camera.transform.position; } } } GUILayout.EndArea(); Handles.EndGUI(); }
void OnGUI() { // NewDrawTest(); // return; SetFontStyle(Color.gray, 18, FontStyle.Italic, EditorStyles.label); GUILayout.BeginHorizontal(); /*版本:1.0.1*/ GUILayout.Label(EditorStringConfig.getString(10000), style); GUILayout.EndHorizontal(); DrawLine(); GUILayout.Space(15); GUILayout.BeginHorizontal(); SetFontStyle(Color.gray, 15, FontStyle.Italic); /*正在编辑地图:*/ GUILayout.Label(EditorStringConfig.getString(10001), style); SceneEditorSettings.currMap = EditorGUILayout.ObjectField(SceneEditorSettings.currMap, typeof(GameObject), true) as GameObject; /*刷新数据*/ if (GUILayout.Button(EditorStringConfig.getString(10002, 10003), GUILayout.Width(60), GUILayout.Height(16))) { RefreshAllData(); } GUILayout.EndHorizontal(); GameObject currMap = SceneEditorSettings.currMap; bool isHaveMap = currMap == null; if (isHaveMap) { /*未检测到场景,你可以\n1.创建一个新场景. \n2.导入一个已经保存的场景配置表.\n3.从Hierarchy视图中拖入一个已有的场景*/ EditorGUILayout.HelpBox(EditorStringConfig.getString(10021), MessageType.Error); ShowMapMenu(); } else { GUILayout.Space(10); GUILayout.BeginHorizontal(); /*销毁地图*/ if (GUILayout.Button(EditorStringConfig.getString(10022), GUILayout.Width(150), GUILayout.Height(40))) { /*"友情提示","你确定要销毁地图","确定","取消"*/ bool result = EditorUtility.DisplayDialog(EditorStringConfig.getString(10023), EditorStringConfig.getString(10024) + currMap.name, EditorStringConfig.getString(10025), EditorStringConfig.getString(10026)); if (result) { GameObject currMapObj = GameObject.Find(currMap.name); DestroyImmediate(currMapObj); currMapId = 0; SceneEditorSettings.currMap = null; } } /*载入配置表*/ if (GUILayout.Button(EditorStringConfig.getString(10016), GUILayout.Width(150), GUILayout.Height(40))) { /*"友情提示","是否先保存当前场景?","确定","取消"*/ bool result = EditorUtility.DisplayDialog(EditorStringConfig.getString(10023), EditorStringConfig.getString(10027), EditorStringConfig.getString(10025), EditorStringConfig.getString(10026)); if (result) { SceneEditorTools.AutoGenerateSettingFile(); } else { GameObject currMapObj = GameObject.Find(currMap.name); DestroyImmediate(currMapObj); SceneEditorSettings.currMap = null; } SceneEditorTools.AutoImportSettingFile(); } GUILayout.EndHorizontal(); //如果当前创建了地图 if (currMap != null) { GUILayout.Space(10); DrawLine(); SetFontStyle(Color.gray, 12, FontStyle.Italic, EditorStyles.foldout); /*地图编辑*/ SceneEditorSettings.isEditorMapGrid = EditorGUILayout.Foldout(SceneEditorSettings.isEditorMapGrid, EditorStringConfig.getString(10004), style); if (SceneEditorSettings.isEditorMapGrid) { ++EditorGUI.indentLevel; GameObject map = SceneEditorSettings.currMap; UISceneMap uimap = map.GetComponent <UISceneMap>(); if (uimap != null) { bool oldShowMap = uimap.isShowMap; /*显示网格*/ uimap.isShowMap = EditorGUILayout.Toggle(EditorStringConfig.getString(10005), uimap.isShowMap); if (oldShowMap != uimap.isShowMap) { SceneView.RepaintAll(); } float gridwidth = uimap.renderTo.x - uimap.renderFrom.x; float gridheight = uimap.renderTo.y - uimap.renderFrom.y; Vector2 gridSize = new Vector3(gridwidth, gridheight); Vector2 oldgridSize = gridSize; /*网格大小*/ gridSize = EditorGUILayout.Vector2Field(EditorStringConfig.getString(10006), gridSize); uimap.renderFrom = new Vector3(-gridSize.x / 2f, -gridSize.y / 2f, 0); uimap.renderTo = new Vector3(gridSize.x / 2f, gridSize.y / 2f, 0); if (oldgridSize != gridSize) { SceneView.RepaintAll(); } Color oldaxisColors = uimap.axisColors; /*网络颜色*/ uimap.axisColors = EditorGUILayout.ColorField(EditorStringConfig.getString(10007), uimap.axisColors); if (oldaxisColors != uimap.axisColors) { SceneView.RepaintAll(); } } --EditorGUI.indentLevel; } //显示网络编辑模块 GUILayout.Space(10); DrawLine(); string[] FarmingType = System.Enum.GetNames(typeof(SceneElementType)); /*请选择*/ FarmingType[0] = EditorStringConfig.getString(10008); SetFontStyle(Color.gray, 12, FontStyle.Italic, EditorStyles.foldout); /*地图种怪编辑*/ SceneEditorSettings.isOpenFarming = EditorGUILayout.Foldout(SceneEditorSettings.isOpenFarming, EditorStringConfig.getString(10009), style); if (SceneEditorSettings.isOpenFarming) { ++EditorGUI.indentLevel; EditorGUILayout.BeginHorizontal(); /*种植类型*/ SceneEditorSettings.farmingTypeIndex = EditorGUILayout.Popup(EditorStringConfig.getString(10010), SceneEditorSettings.farmingTypeIndex, FarmingType); /*编辑*/ if (GUILayout.Button(EditorStringConfig.getString(10011), GUILayout.Width(50), GUILayout.Height(16))) { SceneEditorGridWindow window = (SceneEditorGridWindow)EditorWindow.GetWindow(typeof(SceneEditorGridWindow)); window.Init(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //如果用户选择了一种类型 if (SceneEditorSettings.farmingTypeIndex > 0) { Object PlantSource = SceneEditorSettings.GetPlantFileObject((SceneElementType)SceneEditorSettings.farmingTypeIndex); EditorGUILayout.BeginHorizontal(); /*资源来源*/ Object currPlantSource = EditorGUILayout.ObjectField(EditorStringConfig.getString(10012), PlantSource, typeof(Object)); //资源文件夹是否发生了改变 bool isChanged = PlantSource != currPlantSource; SceneEditorSettings.SetPlantFileObject((SceneElementType)SceneEditorSettings.farmingTypeIndex, currPlantSource); /*刷新*/ if (GUILayout.Button(EditorStringConfig.getString(10002), GUILayout.Width(50), GUILayout.Height(16))) { if (currPlantSource != null) { GetGameObjectsNameInFolder(currPlantSource); } } EditorGUILayout.EndHorizontal(); if (PlantSource != null) { if (isChanged) { GetGameObjectsNameInFolder(currPlantSource); } GUILayout.Space(5); PlantSourceIndex = EditorGUILayout.Popup(FarmingType[SceneEditorSettings.farmingTypeIndex] + "名称:", PlantSourceIndex, PlantSourceName.ToArray()); } GUILayout.Space(5); GUILayout.BeginHorizontal(); GUILayout.Space(this.position.width - 100); /*更新地图分类*/ if (GUILayout.Button(EditorStringConfig.getString(10013), GUILayout.Width(100), GUILayout.Height(40))) { SceneEditorSettings.currMap.GetComponent <UISceneMap>().RefreshClassification(); } GUILayout.EndHorizontal(); GUILayout.Space(5); ShowZhongGuai(FarmingType); } --EditorGUI.indentLevel; } } } GUILayout.Space(5); DrawLine(); }