/// <summary> /// 更新地块可以移动的方向 /// </summary> /// <param name="terrainPiece"></param> public void ChangeTerrainPieceEnableDirection(TerrainPieceInfo terrainPiece, TerrainPieceDirection terrainPieceDirection, bool enable) { Dictionary <TerrainPieceDirection, bool> directionFlagDict = terrainPiece.DirectionFlagDict; Dictionary <TerrainPieceDirection, bool> updateDict = new Dictionary <TerrainPieceDirection, bool>(); // 可以兼容的方向 Dictionary <TerrainPieceDirection, List <TerrainPieceDirection> > terrainPieceDirectionCompatibleDict = m_Root.GamePlay.GetTerrainPieceDirectionCompatibleDict(); List <TerrainPieceDirection> compatibleDirectionList = terrainPieceDirectionCompatibleDict[terrainPieceDirection]; for (int index = 0; index < compatibleDirectionList.Count; index++) { TerrainPieceDirection compatibleDirection = compatibleDirectionList[index]; updateDict.Add(compatibleDirection, directionFlagDict[compatibleDirection]); } updateDict[terrainPieceDirection] = enable; //不能兼容的方向 Dictionary <TerrainPieceDirection, bool> .Enumerator enumerator = directionFlagDict.GetEnumerator(); while (enumerator.MoveNext()) { TerrainPieceDirection curTerrainPieceDirection = enumerator.Current.Key; if (!updateDict.ContainsKey(curTerrainPieceDirection)) { if (enable) { updateDict.Add(curTerrainPieceDirection, false); } else { updateDict.Add(curTerrainPieceDirection, directionFlagDict[curTerrainPieceDirection]); } } } //更新 enumerator = updateDict.GetEnumerator(); while (enumerator.MoveNext()) { TerrainPieceDirection curTerrainPieceDirection = enumerator.Current.Key; directionFlagDict[curTerrainPieceDirection] = enumerator.Current.Value; } }
private void UpdatePieceSidePosition(TerrainPieceInfo terrainPiece) { int index = 0; Dictionary <TerrainPieceDirection, bool> .Enumerator enumerator = terrainPiece.DirectionFlagDict.GetEnumerator(); while (enumerator.MoveNext()) { TerrainPieceDirection direction = enumerator.Current.Key; bool enable = enumerator.Current.Value; if (direction == TerrainPieceDirection.Up) { terrainPiece.UpFlagTransform.gameObject.SetActive(enable); } else if (direction == TerrainPieceDirection.Down) { terrainPiece.DownFlagTransform.gameObject.SetActive(enable); } else { Transform sideTransform = terrainPiece.SideTransforms[index]; GameObject sideGameobject = sideTransform.gameObject; sideGameobject.SetActive(enable); if (enable) { Vector3 v3Direction = m_Root.Tool.Enum2Vector3Direction[direction]; Vector3 sidePosition = v3Direction * m_BuildingInfo.SideShiftingValue; sideTransform.localPosition = sidePosition; Material material = terrainPiece.SideMaterials[index]; int shaderLayer = m_Root.GamePlay.GetFloorShaderTargerLayer((int)terrainPiece.LogicPosition.y, FloorShaderLayer.PieceSide); material.renderQueue = shaderLayer; } index += 1; } } }
private void GUI_UpdateCurTerrainPiece() { TerrainPieceInfo terrainPieceInfo = m_Scene.GetCurrentTerrainPieceInfo(); if (terrainPieceInfo == null) { return; } GUI_Title("当前地块"); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("逻辑位置", GUILayout.Width(GUI_LableWidth)); EditorGUILayout.LabelField(terrainPieceInfo.LogicPosition.x.ToString()); EditorGUILayout.LabelField(terrainPieceInfo.LogicPosition.y.ToString()); EditorGUILayout.LabelField(terrainPieceInfo.LogicPosition.z.ToString()); EditorGUILayout.EndHorizontal(); // IsCoverBaseInfo EditorGUILayout.BeginHorizontal(); if (!GUI_UpdateCurTerrainPiece_Init) { GUI_UpdateCurTerrainPiece_IsCover = terrainPieceInfo.ArtInfo.IsCoverBaseInfo; } EditorGUILayout.LabelField("是否颜色覆盖", GUILayout.Width(GUI_LableWidth)); GUI_UpdateCurTerrainPiece_IsCover = EditorGUILayout.Toggle(GUI_UpdateCurTerrainPiece_IsCover); if (GUI_UpdateCurTerrainPiece_IsCover != terrainPieceInfo.ArtInfo.IsCoverBaseInfo) { terrainPieceInfo.ArtInfo.IsCoverBaseInfo = GUI_UpdateCurTerrainPiece_IsCover; IsUpdateCurrentPiece = true; } EditorGUILayout.EndHorizontal(); // MyColor EditorGUILayout.BeginHorizontal(); if (!GUI_UpdateCurTerrainPiece_Init) { GUI_UpdateCurTerrainPiece_MyColor = terrainPieceInfo.ArtInfo.MyColor; } EditorGUILayout.LabelField("自身颜色", GUILayout.Width(GUI_LableWidth)); GUI_UpdateCurTerrainPiece_MyColor = EditorGUILayout.ColorField(GUI_UpdateCurTerrainPiece_MyColor); if (GUI_UpdateCurTerrainPiece_MyColor != terrainPieceInfo.ArtInfo.MyColor) { terrainPieceInfo.ArtInfo.MyColor = GUI_UpdateCurTerrainPiece_MyColor; IsUpdateCurrentPiece = true; } EditorGUILayout.EndHorizontal(); //Direction Dictionary <TerrainPieceDirection, bool> .Enumerator enumerator = terrainPieceInfo.DirectionFlagDict.GetEnumerator(); if (!GUI_UpdateCurTerrainPiece_Init || GUI_UpdateCurTerrainPiece_UpdateDirection) { GUI_UpdateCurTerrainPiece_DirectionEnableDict.Clear(); GUI_UpdateCurTerrainPiece_DirectionMeasureDict.Clear(); while (enumerator.MoveNext()) { TerrainPieceDirection terrainPieceDirection = enumerator.Current.Key; bool enable = enumerator.Current.Value; GUI_UpdateCurTerrainPiece_DirectionEnableDict.Add(terrainPieceDirection, enable); int measure = terrainPieceInfo.DirectionMeasureDict[terrainPieceDirection]; GUI_UpdateCurTerrainPiece_DirectionMeasureDict.Add(terrainPieceDirection, measure); } GUI_UpdateCurTerrainPiece_UpdateDirection = false; } if (TerrainPieceDirectionNameDict == null) { TerrainPieceDirectionNameDict = new Dictionary <TerrainPieceDirection, string>() { { TerrainPieceDirection.Left, "左边(x = 1)" }, { TerrainPieceDirection.Right, "右边(x = -1)" }, { TerrainPieceDirection.Forward, "前边(z = 1)" }, { TerrainPieceDirection.Back, "后边(z = -1)" }, { TerrainPieceDirection.Up, "往上(y = 1)" }, { TerrainPieceDirection.Down, "向下(y = -1)" }, }; } while (enumerator.MoveNext()) { TerrainPieceDirection terrainPieceDirection = enumerator.Current.Key; bool enable = enumerator.Current.Value; string name = TerrainPieceDirectionNameDict[terrainPieceDirection]; int measure = terrainPieceInfo.DirectionMeasureDict[terrainPieceDirection]; bool isChange = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(name, GUILayout.Width(GUI_LableWidth)); bool guiEnabele = GUI_UpdateCurTerrainPiece_DirectionEnableDict[terrainPieceDirection]; guiEnabele = EditorGUILayout.Toggle(guiEnabele); if (guiEnabele != enable) { m_Scene.ChangeTerrainPieceEnableDirection(terrainPieceInfo, terrainPieceDirection, guiEnabele); IsUpdateCurrentPiece = true; GUI_UpdateCurTerrainPiece_UpdateDirection = true; isChange = true; } if (guiEnabele) { int guiMeasure = GUI_UpdateCurTerrainPiece_DirectionMeasureDict[terrainPieceDirection]; guiMeasure = EditorGUILayout.IntField(guiMeasure); if (guiMeasure != measure) { terrainPieceInfo.DirectionMeasureDict[terrainPieceDirection] = guiMeasure; GUI_UpdateCurTerrainPiece_DirectionMeasureDict[terrainPieceDirection] = guiMeasure; IsUpdateCurrentPiece = true; isChange = true; } } EditorGUILayout.EndHorizontal(); if (isChange) { break; } } GUI_UpdateCurTerrainPiece_Init = true; }