Example #1
0
        private void DoInstantiateAllUnit()
        {
            if (m_WaitInstantiateCount != 0)
            {
                return;
            }

            DoDestroyAllUnit();
            AreaLayerInfo[] areaLayerInfos = m_AreaDetailInfo.AreaLayerInfos;
            if (areaLayerInfos != null && areaLayerInfos.Length > 0)
            {
                for (int iLayer = 0; iLayer < areaLayerInfos.Length; iLayer++)
                {
                    List <SceneUnitInfo> units = areaLayerInfos[iLayer].m_Units;
                    if (units != null && units.Count > 0)
                    {
                        m_WaitInstantiateCount += units.Count;
                        for (int iUnit = 0; iUnit < units.Count; iUnit++)
                        {
                            SceneUnitInfo iterUnitInfo = units[iUnit];
                            InstantiateUnit(iterUnitInfo, m_UnitsRoot);
                        }
                    }
                }
            }
        }
Example #2
0
        public void FillUnitInfo(ref SceneUnitInfo unitInfo, Area area, Quaternion areaInverseRotation)
        {
            unitInfo.LocalPosition = area.transform.InverseTransformPoint(transform.position);
            unitInfo.LocalRotation = areaInverseRotation * transform.rotation;
            unitInfo.LocalScale    = ObjectUtility.CalculateLossyScale(transform, area.transform);

            unitInfo._AABB     = m_AABB;
            unitInfo._Diameter = MathUtility.CaculateLongestSide(m_AABB);
        }
Example #3
0
        public void DeSerialize(BinaryReader reader)
        {
            m_Priority = reader.ReadInt32();
            m_GridSize = reader.ReadInt32();
            m_Offest   = reader.ReadInt32();

            int indexCount = reader.ReadInt32();

            if (indexCount > 0)
            {
                AreaVirtualGridIndexs = new List <long>();
                for (int iIndex = 0; iIndex < indexCount; iIndex++)
                {
                    AreaVirtualGridIndexs.Add(reader.ReadInt64());
                }
            }

            int gridCount = reader.ReadInt32();

            if (gridCount > 0)
            {
                AreaVirtualGridInfos = new List <AreaVirtualGridInfo>();
                for (int iGrid = 0; iGrid < gridCount; iGrid++)
                {
                    AreaVirtualGridInfo gridInfo = new AreaVirtualGridInfo();
                    gridInfo.DeSerialize(reader);

                    m_MinIndexX = Mathf.Min(gridInfo.m_IndexX, m_MinIndexX);
                    m_MaxIndexX = Mathf.Max(gridInfo.m_IndexX, m_MaxIndexX);

                    m_MinIndexY = Mathf.Min(gridInfo.m_IndexY, m_MinIndexY);
                    m_MaxIndexY = Mathf.Max(gridInfo.m_IndexY, m_MaxIndexY);

                    m_MinIndexZ = Mathf.Min(gridInfo.m_IndexZ, m_MinIndexZ);
                    m_MaxIndexZ = Mathf.Max(gridInfo.m_IndexZ, m_MaxIndexZ);
                    AreaVirtualGridInfos.Add(gridInfo);
                }
            }


            int unitCount = reader.ReadInt32();

            if (unitCount > 0)
            {
                m_Units = new List <SceneUnitInfo>();
                for (int iUnit = 0; iUnit < unitCount; iUnit++)
                {
                    SceneUnitInfo sceneUnitInfo = new SceneUnitInfo();
                    sceneUnitInfo.DeSerialize(reader);
                    m_Units.Add(sceneUnitInfo);
                }
            }
        }
Example #4
0
        public void Serialize(BinaryWriter writer)
        {
            writer.Write(m_Priority);
            writer.Write(m_GridSize);
            writer.Write(m_Offest);

            List <long> areaVirtualGridIndexs = AreaVirtualGridIndexs;

            if (areaVirtualGridIndexs == null || areaVirtualGridIndexs.Count <= 0)
            {
                writer.Write(0);
            }
            else
            {
                writer.Write(areaVirtualGridIndexs.Count);
                for (int iIndex = 0; iIndex < areaVirtualGridIndexs.Count; iIndex++)
                {
                    writer.Write(areaVirtualGridIndexs[iIndex]);
                }
            }

            List <AreaVirtualGridInfo> areaVirtualGridInfos = AreaVirtualGridInfos;

            if (areaVirtualGridInfos == null || areaVirtualGridInfos.Count <= 0)
            {
                writer.Write(0);
            }
            else
            {
                writer.Write(areaVirtualGridInfos.Count);
                for (int iGrid = 0; iGrid < areaVirtualGridInfos.Count; iGrid++)
                {
                    AreaVirtualGridInfo gridInfo = areaVirtualGridInfos[iGrid];
                    gridInfo.Serialize(writer);
                }
            }

            List <SceneUnitInfo> units = m_Units;

            if (units == null || units.Count <= 0)
            {
                writer.Write(0);
            }
            else
            {
                writer.Write(units.Count);
                for (int iUnit = 0; iUnit < units.Count; iUnit++)
                {
                    SceneUnitInfo sceneUnitInfo = units[iUnit];
                    sceneUnitInfo.Serialize(writer);
                }
            }
        }
Example #5
0
        private void InstantiateUnit(SceneUnitInfo unitInfo, Transform parent)
        {
            if (m_Owner.UseAsset)
            {
                AssetUtil.InstanceAssetAsync(m_AreaDetailInfo.AssetInfos[unitInfo.AssetIndex].AddressableKey, (pathOrAddress, uObj, userData) =>
                {
                    if (uObj != null)
                    {
                        GameObject resultObj = uObj as GameObject;
                        if (resultObj != null)
                        {
                            m_WaitInstantiateCount--;
                            Transform t = resultObj.transform;
                            t.SetParent(m_UnitsRoot);
                            t.localPosition = unitInfo.LocalPosition;
                            t.localRotation = unitInfo.LocalRotation;
                            t.localScale    = unitInfo.LocalScale;
                        }
                    }
                });
            }
            else
            {
                m_WaitInstantiateCount--;
                string path = string.Format("{0}/{1}Map_{2}/{3}.prefab"
                                            , MapEditorUtility.GetOrCreateMapEditorSetting().AssetExportDirectory
                                            , Constants.UNIT_PREFAB_EXPORT_DIRECTORY
                                            , m_Owner.MapInfo.Uid
                                            , m_AreaDetailInfo.AssetInfos[unitInfo.AssetIndex].AddressableKey);

                GameObject asset = AssetDatabase.LoadAssetAtPath <GameObject>(path);
                if (asset == null)
                {
                    string[] paths = AssetDatabase.FindAssets(m_AreaDetailInfo.AssetInfos[unitInfo.AssetIndex].AddressableKey);
                    if (paths != null && paths.Length > 0)
                    {
                        path  = AssetDatabase.GUIDToAssetPath(paths[0]);
                        asset = AssetDatabase.LoadAssetAtPath <GameObject>(path);
                    }
                }

                if (asset != null)
                {
                    Transform t = Instantiate(asset).transform;
                    t.SetParent(parent);
                    t.localPosition = unitInfo.LocalPosition;
                    t.localRotation = unitInfo.LocalRotation;
                    t.localScale    = unitInfo.LocalScale;
                }
            }
        }
Example #6
0
        private void OnDrawGizmosSelected()
        {
            if (m_AreaLayerInfos != null && m_AreaLayerInfos.Length > 0)
            {
                for (int iLayer = 0; iLayer < m_AreaLayerInfos.Length; iLayer++)
                {
                    //if(m_ShowLayer[iLayer])
                    {
                        AreaLayerInfo layerInfo = m_AreaLayerInfos[iLayer];
                        if (layerInfo != null)
                        {
                            List <AreaVirtualGridInfo> areaVirtualGridInfos = layerInfo.AreaVirtualGridInfos;
                            if (areaVirtualGridInfos != null && areaVirtualGridInfos.Count > 0)
                            {
                                for (int iArea = 0; iArea < areaVirtualGridInfos.Count; iArea++)
                                {
                                    AreaVirtualGridInfo gridInfo = areaVirtualGridInfos[iArea];
                                    if (m_ShowLayer[iLayer])
                                    {
                                        Gizmos.color = m_Colors[iLayer];
                                        Gizmos.DrawWireCube(gridInfo.m_Position, new Vector3(layerInfo.m_GridSize, layerInfo.m_GridSize, layerInfo.m_GridSize));
                                    }

                                    if (m_ShowUnitAB[iLayer])
                                    {
                                        List <int> unitIndexs = gridInfo.m_UnitIndexs;
                                        if (unitIndexs != null && unitIndexs.Count > 0)
                                        {
                                            for (int iUnit = 0; iUnit < unitIndexs.Count; iUnit++)
                                            {
                                                SceneUnitInfo unitInfo = layerInfo.m_Units[unitIndexs[iUnit]];
                                                Gizmos.color = new Color(1, 1, 1, 0.2f);
                                                Gizmos.DrawWireCube(unitInfo._AABB.center, unitInfo._AABB.size);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Example #7
0
        public void ShowSceneUI()
        {
            return;

            if (m_AreaLayerInfos != null && m_AreaLayerInfos.Length > 0)
            {
                for (int iLayer = 0; iLayer < m_AreaLayerInfos.Length; iLayer++)
                {
                    if (m_ShowLayer[iLayer])
                    {
                        AreaLayerInfo layerInfo = m_AreaLayerInfos[iLayer];
                        if (layerInfo != null)
                        {
                            List <AreaVirtualGridInfo> areaVirtualGridInfos = layerInfo.AreaVirtualGridInfos;
                            if (areaVirtualGridInfos != null && areaVirtualGridInfos.Count > 0)
                            {
                                for (int iArea = 0; iArea < areaVirtualGridInfos.Count; iArea++)
                                {
                                    AreaVirtualGridInfo gridInfo   = areaVirtualGridInfos[iArea];
                                    List <int>          unitIndexs = gridInfo.m_UnitIndexs;
                                    if (unitIndexs != null && unitIndexs.Count > 0)
                                    {
                                        for (int iUnit = 0; iUnit < unitIndexs.Count; iUnit++)
                                        {
                                            SceneUnitInfo unitInfo  = layerInfo.m_Units[unitIndexs[iUnit]];
                                            AssetInfo     assetInfo = m_AreaDetailInfo.AssetInfos[unitInfo.AssetIndex];
                                            Handles.Label(unitInfo.LocalPosition, assetInfo.AddressableKey);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Example #8
0
        private void OnInstantiateUnitCompleted(string pathOrAddress, UnityObject obj, SystemObject userData)
        {
            m_RuningUnitCommandCount--;

            LoadUnitData loadData      = userData as LoadUnitData;
            int          unitIndex     = loadData.m_UnitIndex;
            int          unitCommandId = loadData.m_CommandId;


            UnitData unitData = m_UnitDatas[unitIndex];

            if (m_IsReleasing)
            {
                UnityObject.DestroyImmediate(obj);
                unitData.RemoveState(UnitState.Instantiating);
                unitData.AddState(UnitState.Released);
                unitData.GameObject = null;
                unitData.ClearRef();
            }
            else
            {
                GameObject resultGameObject = obj as GameObject;

                m_InstantiatedUnitCount++;

                unitData.GameObject = resultGameObject;
                unitData.RemoveState(UnitState.Instantiating);
                unitData.AddState(UnitState.Instantiated);

                SceneUnitInfo unitInfo      = m_Units[unitIndex];
                Transform     unitTransform = resultGameObject.transform;
                unitTransform.SetParent(m_AreaController.GetRoot(), false);
                unitTransform.localPosition = unitInfo.LocalPosition;
                unitTransform.localRotation = unitInfo.LocalRotation;
                unitTransform.localScale    = unitInfo.LocalScale;

                RendererInfo[] rendererInfos = unitInfo.RendererInfos;
                if (rendererInfos != null && rendererInfos.Length > 0)
                {
                    for (int iRenderer = 0; iRenderer < rendererInfos.Length; iRenderer++)
                    {
                        RendererInfo iterRendererInfo = rendererInfos[iRenderer];

                        Transform iterRendererTranfsorm = unitTransform;
                        if (iterRendererInfo.TransformIndexs != null)
                        {
                            for (int iTransformIndex = 0; iTransformIndex < iterRendererInfo.TransformIndexs.Length; iTransformIndex++)
                            {
                                iterRendererTranfsorm = iterRendererTranfsorm.GetChild(iterRendererInfo.TransformIndexs[iTransformIndex]);
                            }
                        }

                        Renderer iterRenderer = iterRendererTranfsorm.GetComponent <Renderer>();
                        if (iterRenderer && iterRendererInfo.LightmapIndex >= 0)
                        {
                            /*  for (int iMaterial = 0; iMaterial < iterRenderer.materials.Length; iMaterial++)
                             * {
                             *    Material iterMaterial = iterRenderer.materials[iMaterial];
                             *    if (CRenderer.Shaders.GetInstance().TryFindShader(iterMaterial.shader.name, out Shader shader))
                             *    {
                             *        iterMaterial.shader = shader;
                             *    }
                             * }*/
                            iterRenderer.lightmapIndex       = iterRendererInfo.LightmapIndex;
                            iterRenderer.lightmapScaleOffset = iterRendererInfo.LightmapScaleOffset;

                            iterRenderer.realtimeLightmapIndex       = iterRendererInfo.RealLightmapIndex;
                            iterRenderer.realtimeLightmapScaleOffset = iterRendererInfo.RealLightmapScaleOffset;
                        }
                    }
                }
            }
            m_UnitDatas[unitIndex] = unitData;
        }
Example #9
0
        /// <summary>
        /// 执行删除和生成命令
        /// </summary>
        private void DoUpdateUnitCommand()
        {
            int releaseCommandCount = 0;
            int enqueueCommandCount = 0;

            while (m_RuningUnitCommandCount + releaseCommandCount
                   < Constants.MAX_RUNING_UNITCOMMAND_COUNT &&
                   m_UnitCommands.Count > enqueueCommandCount)
            {
                UnitCommand iterUnitCommand = m_UnitCommands.Dequeue();
                UnitData    iterUnitData    = m_UnitDatas[iterUnitCommand.UnitIndex];
                switch (iterUnitCommand.Command)
                {
                case CommandType.Instantiate:
                    if (iterUnitData.HasState(UnitState.WaitRelease))
                    {
                        continue;
                    }
                    // 防止重复实例化
                    else if (!iterUnitData.HasState(UnitState.Instantiated) &&
                             !iterUnitData.HasState(UnitState.Instantiating) &&
                             iterUnitData.HasState(UnitState.WaitInstantiate))
                    {
                        m_RuningUnitCommandCount++;


                        SceneUnitInfo unitInfo = m_Units[iterUnitCommand.UnitIndex];
                        AssetUtil.InstanceAssetAsync(m_AssetInfos[unitInfo.AssetIndex].AddressableKey
                                                     , OnInstantiateUnitCompleted, AssetLoaderPriority.Default, null
                                                     , new LoadUnitData(iterUnitCommand.UnitIndex, iterUnitCommand.CommandId));

                        iterUnitData.RemoveState(UnitState.WaitInstantiate);
                        iterUnitData.AddState(UnitState.Instantiating);
                    }
                    break;

                case CommandType.Release:
                    if (iterUnitData.HasState(UnitState.WaitRelease))
                    {
                        if (iterUnitData.HasState(UnitState.Instantiated))
                        {
                            //Debug.LogError("release:" + iterUnitData.GameObject.name);
                            UnityObject.DestroyImmediate(iterUnitData.GameObject);
                            iterUnitData.GameObject = null;
                            iterUnitData.SetState(UnitState.Released);
                            iterUnitData.ClearRef();
                            m_InstantiatedUnitCount--;
                            releaseCommandCount++;
                        }
                        else
                        {
                            //Debug.LogError("未释放waitRelease:" + iterUnitData.GameObject.name);
                            m_UnitCommands.Enqueue(iterUnitCommand);
                            enqueueCommandCount++;
                        }
                    }
                    break;

                default:
                    break;
                }

                m_UnitDatas[iterUnitCommand.UnitIndex] = iterUnitData;
            }
        }