public void SpawnNumber(double content, Vector3 location) { _accumulator += content; if (!_poolController.ObjectsAvailable() || !(Time.time - _lastSpawn > _spawnDelay) || _accumulator < 11) { return; } var instance = _poolController.Spawn() as FloatingNumber; if (!instance) { throw new NullReferenceException(); } Vector2 screenPosition = Camera.main.WorldToScreenPoint( new Vector3( location.x + Random.Range(-.2f, .2f), 0f, location.z + Random.Range(-.2f, .2f) )); instance.transform.SetParent(_canvas.transform, false); instance.transform.position = screenPosition; instance.transform.localScale = new Vector3(1, 1, 1); instance.SetNumber(_accumulator); instance.StartPlayback(); _accumulator = 0; _lastSpawn = Time.time; PoolCount = _poolController.ObjectCount(); }
private void SpawnRandomFood() { var index = Random.Range(0, m_foodList.Count); var foodObj = m_foodList[index]; m_randomRot.y = Random.Range(0.0f, 360.0f); m_randomRot.z = Random.Range(0.0f, 360.0f); var food = m_objectPool.Spawn(foodObj.gameObject, transform.position, Quaternion.identity); food.transform.eulerAngles = m_randomRot; }
public void Initialize() { _edgeFlames = new List <GridItem>(); _activeFlames = new List <GridItem>(); _flamePrefab = Resources.Load <FlameController>("Prefabs/Flame"); Vector3 floorSize = gameObject.transform.localScale; float height = floorSize.z; float width = floorSize.x; Vector3 itemSize = new Vector3(width / _columns, 1.1f, height / _rows); _flamePrefab.transform.localScale = itemSize; _flamePool = GameMaster.InstantiatePool(_firePoolSize, _flamePrefab, "FlamePool"); _fireGrid = new GridController(_rows, _columns, _payloadDepth, gameObject); _fireGrid.InitVariable("intensity", 0d, item => { var g = new Gradient(); var gColor = new GradientColorKey[4]; gColor[0].color = Color.white; gColor[0].time = 0f; gColor[1].color = Color.gray; gColor[1].time = 0.25f; gColor[2].color = Color.yellow; gColor[2].time = 0.5f; gColor[3].color = Color.red; gColor[3].time = 1f; var gAlpha = new GradientAlphaKey[1]; gAlpha[0].alpha = 1f; gAlpha[0].time = 0f; g.SetKeys(gColor, gAlpha); var main = item.GetPayload <FlameController>(0) .GetComponent <ParticleSystem>().main; main.startColor = g.Evaluate( (float)(item.GetVariable <double>("intensity") / (_maxFlameIntensity)) ); }); _fireGrid.InitVariable <bool>("flammable", item => { Vector3 pos = _fireGrid.GetPosition(item._gridCoords); var posLeft = new Vector3( pos.x + _fireGrid._itemWidth / 2, 0.2f, pos.y ); var posDown = new Vector3( pos.x, 0.2f, pos.y + _fireGrid._itemHeight / 2 ); var rayLeft = new Ray(posLeft, Vector3.left); var rayDown = new Ray(posDown, Vector3.back); Debug.DrawRay(rayLeft.origin, rayLeft.direction * _fireGrid._itemWidth, Color.white, 30000); Debug.DrawRay(rayDown.origin, rayDown.direction * _fireGrid._itemHeight, Color.white, 30000); var flammable = !(Physics.Raycast(rayDown, _fireGrid._itemHeight) || Physics.Raycast(rayLeft, _fireGrid._itemWidth)); return(flammable); }); _fireGrid.InitVariable("onfire", false); foreach (Vector2 coords in _startingFlames) { FlameController flame = _flamePool.Spawn() as FlameController; if (!flame) { throw new Exception("Can't start a fire! Someone bring more matches!!"); } var gridCoords = _fireGrid.GetPosition(coords); flame.transform.position = new Vector3( gridCoords.x, _verticalOffset, gridCoords.y ); var cell = _fireGrid.GetGridItem(coords.x, coords.y); cell.SetPayload(flame, 0); cell.SetVariable("intensity", _startIntensity); cell.SetVariable("onfire", true); _activeFlames.Add(cell); _edgeFlames.Add(cell); _fireGrid.UpdateGridItem(cell._gridCoords, cell); } _tick = Time.time; var orgSpreadChange = _spreadChance; _spreadChance = 1f; for (int i = 0; i < _prewarm; i++) { Spread(); Grow(); } _spreadChance = orgSpreadChange; _levelManager.GameMaster.ResetUi(); initialized = true; }
/// <summary> /// /// </summary> private void Spread() { int spreadCount = 0; _edgeFlames = new List <GridItem>(); foreach (var item in _activeFlames) { bool add = false; foreach (var neighbour in item.GetNeighbours(_spreadDistance)) { if (!neighbour.GetVariable <bool>("onfire")) { add = true; } } if (add) { _edgeFlames.Add(item); } //limiting the number of flames we're even gonna look at for speed sake if (_edgeFlames.Count >= _spreadLimit * 2) { break; } } //shuffle those suckers int next = _edgeFlames.Count; while (next > 1) { next--; int k = Random.Range(0, next + 1); GridItem f = _edgeFlames[k]; _edgeFlames[k] = _edgeFlames[next]; _edgeFlames[next] = f; } _edgeFlames.Reverse(); foreach (GridItem edgeItem in _edgeFlames) { if (edgeItem.GetVariable <double>("intensity") < _spreadIntensity) { continue; } List <GridItem> emptyNeighbours = new List <GridItem>(); foreach (GridItem n in edgeItem.GetNeighbours(_spreadDistance)) { if (!n.GetVariable <bool>("onfire") && n.GetVariable <bool>("flammable") && HasLineOfSight(n, edgeItem)) { emptyNeighbours.Add(n); } } foreach (GridItem neighbour in emptyNeighbours) { if (Random.value < 1 - _spreadChance) { continue; } if (spreadCount >= _spreadLimit) { break; } FlameController newFlame = _flamePool.Spawn() as FlameController; if (!newFlame) { // _levelManager.GameMaster.OnDeath( ); return; } ; spreadCount++; newFlame.GetComponent <Collider>().enabled = false; var center = _fireGrid.GetPosition(neighbour._gridCoords); var position = new Vector3( center.x, _verticalOffset, center.y ); // Debug.Log("Setting new flame to " + neighbour._gridCoords); // Debug.Log("To position" + position); newFlame.transform.position = position; newFlame.GetComponent <Collider>().enabled = true; neighbour.SetPayload(newFlame, 0); neighbour.SetVariable("intensity", 1d); neighbour.SetVariable("onfire", true); neighbour.SetVariable("verticalOffset", _verticalOffset); _fireGrid.UpdateGridItem(neighbour._gridCoords, neighbour); //TODO check if neighbour is actually an edge flame _activeFlames.Add(neighbour); } } }