示例#1
0
    /// <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;
        }
    }
示例#2
0
    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;
    }