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; }