public PropsSpecification GeneratePropsSpecification(FloorSpecification floorSpecification) { _propGenerators = GetComponents <PropGenerationWidget>().ToList(); var specification = new PropsSpecification(floorSpecification.Size); _propGenerators.ForEach(c => c.AddProps(specification, floorSpecification)); return(specification); }
public override void AddProps(PropsSpecification propsSpecification, FloorSpecification floorSpecification) { var propsCount = Mathf.RoundToInt(floorSpecification.Size.x * floorSpecification.Size.y * _propsDensity); for (int i = 0; i < propsCount; i++) { var coords = new Vector2Int(_random.RandomInt(floorSpecification.Size.x), _random.RandomInt(floorSpecification.Size.y)); var angle = _random.RandomElement(new List <float>() { 0, 90, 180, 270 }); var propPrefab = _random.RandomElement(_possibleProps); if (floorSpecification.FloorPresenceArray[coords.x, coords.y]) { propsSpecification.SetDefinition(coords, new PropInstanceDefinition() { Angle = angle, Prefab = propPrefab }); } } }
public void InstantiateProps(PropsSpecification propsSpecification) { DestroyCurrentWalls(); var size = propsSpecification.Size; var centerOffset = size / 2; for (int x = 0; x < size.x; x++) { for (int y = 0; y < size.y; y++) { var definition = propsSpecification.Props[x, y]; if (definition != null) { var prop = GameObject.Instantiate(definition.Prefab, _propsParent); prop.transform.localPosition = new Vector3(x, 0, y) - new Vector3(centerOffset.x, 0, centerOffset.y) + new Vector3(definition.OffsetFromCenter.x, 0, definition.OffsetFromCenter.y); prop.transform.localRotation = Quaternion.Euler(0, definition.Angle, 0); prop.name = $"Prop-{x}-{y} - {definition.Prefab.name}"; } } } }
public override void AddProps(PropsSpecification propsSpecification, FloorSpecification floorSpecification) { var propsGroupsCount = Mathf.RoundToInt(floorSpecification.Size.x * floorSpecification.Size.y * _propsGroupsDensity); for (int i = 0; i < propsGroupsCount; i++) { var coords = new Vector2Int(_random.RandomInt(floorSpecification.Size.x), _random.RandomInt(floorSpecification.Size.y)); var groupRadius = Mathf.CeilToInt(_random.RandomFloat(_groupRadiusRange.x, _groupRadiusRange.y)); var countInGroup = _random.RandomFloat(_propsDensityPerGroupRange.x, _propsDensityPerGroupRange.y) * (groupRadius + 1) * (groupRadius + 1); for (int j = 0; j < countInGroup; j++) { var thisPropCoords = coords + new Vector2Int(_random.RandomInt(-groupRadius, groupRadius), _random.RandomInt(-groupRadius, groupRadius)); if (thisPropCoords.x >= 0 && thisPropCoords.y >= 0 && thisPropCoords.x < floorSpecification.Size.x && thisPropCoords.y < floorSpecification.Size.y) { var angle = _random.RandomFloat(0, 360); var propPrefab = _random.RandomElement(_possibleProps); var offsetFromCenter = new Vector2(_random.RandomFloat(-0.5f, 0.5f), _random.RandomFloat(-0.5f, 0.5f)); if (floorSpecification.FloorPresenceArray[thisPropCoords.x, thisPropCoords.y]) { propsSpecification.SetDefinition(thisPropCoords, new PropInstanceDefinition() { Angle = angle, Prefab = propPrefab, OffsetFromCenter = offsetFromCenter }); } } } } }
private void ClearOutBlackHoleArea(FloorSpecification floorSpecification, WallsSpecification wallsSpecification, PropsSpecification propsSpecification) { var size = floorSpecification.Size; var center = size / 2; for (int x = 0; x < size.x; x++) { for (int y = 0; y < size.y; y++) { var distanceToCenter = Vector2.Distance(new Vector2(x, y), center); if (distanceToCenter < _blackHoleAreaSize) { floorSpecification.FloorPresenceArray[x, y] = true; wallsSpecification.EmptyWalls(new Vector2Int(x, y)); propsSpecification.SetDefinition(new Vector2Int(x, y), null); } } } }
public abstract void AddProps(PropsSpecification specification, FloorSpecification floorSpecification);