Пример #1
0
        private void HandleDataChanged(
            SliceUnitData <UnityWorldData> oldData,
            ref SliceUnitData <UnityWorldData> newData,
            GridItemPropertyChange changeType
            )
        {
            // TODO should we do something?
            if (changeType == GridItemPropertyChange.HealthChange)
            {
                newData.Data = oldData.Data;
                return;
            }

            if (oldData.Data?.Structure != null)
            {
                UnityExtensions.Destroy(oldData.Data.Structure);
            }

            if (oldData.Data?.Tile != null)
            {
                UnityExtensions.Destroy(oldData.Data.Tile.gameObject);
            }

            var item = newData.GridItem;

            var worldPosition = newData.Position.ToVector3();

            var tileDescriptor = TileLookup.FindTileOrNull(item.TileType);
            var tileBehavior   = tileDescriptor.Construct(
                new PositionAndRotation(worldPosition, PossibleRotations[(byte)item.TileRotation]),
                WorldGrid,
                newData.Position
                );

            GameObject placeableInstance = null;

            if (item.StructureType != 0)
            {
                var associatedStructure = TileLookup.FindStructureOrNull(item.StructureType);
                if (associatedStructure == null)
                {
                    Debug.Log($"No object type of «{item.StructureType}» found while building world");
                }
                else
                {
                    placeableInstance = associatedStructure.CreateInstanceInWorld(this, newData.Position);
                }
            }

            newData.Data = new UnityWorldData
            {
                Tile      = tileBehavior,
                Structure = placeableInstance
            };
        }
        private void HandleChanged(SliceUnitData <ViewGridItemData> oldData, ref SliceUnitData <ViewGridItemData> newData)
        {
            if (oldData.Data.IsValid)
            {
                UnityObjectPool tilePool = _tilePools[oldData.GridItem.Type];
                tilePool.Restore(oldData.Data.Tile);

                if (oldData.GridItem.BuildingType != BuildingType.None)
                {
                    UnityObjectPool buildingPool = _buildingPools[oldData.GridItem.BuildingType];
                    buildingPool.Restore(oldData.Data.Building);
                }
            }

            GridItem        item             = newData.GridItem;
            UnityObjectPool tileTemplatePool = _tilePools[item.Type];

            GameObject tileInstance = tileTemplatePool.Get();

            tileInstance.transform.position = newData.Position.ToUpperRight(Vector2.zero);
            tileInstance.transform.rotation = Quaternion.Euler(0, 0, item.Variant * 90);

            var newInstance = new ViewGridItemData();

            newInstance.Tile = tileInstance;

            if (newData.GridItem.BuildingType != BuildingType.None)
            {
                UnityObjectPool buildingPool     = _buildingPools[newData.GridItem.BuildingType];
                var             buildingInstance = buildingPool.Get();
                buildingInstance.transform.position = newData.Position.ToUpperRight(Vector2.zero);
                newInstance.Building = buildingInstance;
            }

            newData.Data = newInstance;
        }