private void OnBrickDestruction(BrickBehaviour brick) { AudioManager.instance.PlayBrickSound(); if (BrickManager.instance.remainingBricks.Count <= 0) { score += 10 * brick.hits; finalScoreText.text = score.ToString(); if (score > highScore) { AudioManager.instance.PlayHighScoreSound(); PlayerPrefs.SetInt(highScoreKey, score); //PlayerPrefs.Save(); } BallManager.instance.ResetBalls(); winScreen.SetActive(true); } else { score += 10 * brick.scoreMulti; if (score > highScore) { PlayerPrefs.SetInt(highScoreKey, score); PlayerPrefs.Save(); } scoreText.text = score.ToString(); } bricksText.text = BrickManager.instance.remainingBricks.Count.ToString(); }
/// <summary> /// To call when a brick, non falling, is touched by a ball : /// Change its state or set it as falling /// </summary> /// <param name="brickTouched"></param> public void NonFallingBrickTouchedByBall(BrickBehaviour brickTouched) { if (PlayerStatistics.GameEnded) { return; } switch (brickTouched.m_ThisBrickType) { case BrickType.Strong: brickTouched.SetStateThisBrick(BrickType.Normal, this); break; case BrickType.SuperStrong: brickTouched.SetStateThisBrick(BrickType.Strong, this); break; default: PlayerStatistics.PlayerNbPoints += 50; brickTouched.GetComponent <Rigidbody>().isKinematic = false; brickTouched.m_IsBrickFalling = true; brickTouched.gameObject.layer = LayerMask.NameToLayer("FallingBrick"); break; } }
private void OnBrickDestroyed(BrickBehaviour destroyedBrick) { bricksDestroyed--; if (bricksDestroyed < 1) { DestroyCurrentLevel(); //Create new level currentLevel = new Level(1, UnityEngine.Random.Range(3, 5), UnityEngine.Random.Range(1, 4) * 3); CreateNewLevel(currentLevel); } }
private void CreateBrickObjects(Level level) { currentLevelBrickBehaviours = new List <BrickBehaviour>(currentLevelTotalBricks.Count); foreach (var brick in currentLevelTotalBricks) { BrickBehaviour brickBehaviour = GameObject.Instantiate(brickPrefab, Vector3.zero, Quaternion.identity).GetComponent <BrickBehaviour>(); brickBehaviour.BrickModel = brick; brickBehaviour.OnBrickDestroyed += OnBrickDestroyed; currentLevelBrickBehaviours.Add(brickBehaviour); } }
public void GenerateBricks() { ClearRemainingBricks(); this.remainingBricks = new List <BrickBehaviour>(); int[,] currentLevelData = this.level; float currentSpawnX = initialBrickSpawnPositionX; float currentSpawnY = initialBrickSpawnPositionY; float zShift = 0f; for (int row = 0; row < this.rows; row++) { for (int col = 0; col < this.columns; col++) { int brickType = currentLevelData[row, col]; if (brickType > 0) { BrickBehaviour newBrick = Instantiate(brickPrefab, new Vector3(currentSpawnX, currentSpawnY, 0.0f - zShift), Quaternion.identity) as BrickBehaviour; newBrick.Init(bricksContainer.transform, this.sprites[brickType - 1], brickType); this.remainingBricks.Add(newBrick); zShift += 0.0001f; } currentSpawnX += brickWidth + spacing; if (col + 1 == this.columns) { currentSpawnX = initialBrickSpawnPositionX; } } currentSpawnY -= brickHeight + spacing; } this.initialBricksCount = this.remainingBricks.Count; bricksText.text = this.remainingBricks.Count.ToString(); }
/// <summary> /// To call when a falling brick is hitten, apply the rules of the given brick : /// change its state or destroy it, applying its bonus /// </summary> /// <param name="brickTouched"></param> public void OnBrickFallingTouched(BrickBehaviour brickTouched, bool touchedByBall) { if (PlayerStatistics.GameEnded) { return; } switch (brickTouched.m_ThisBrickType) { case BrickType.Normal: brickTouched.DestroyThisBrick(); NbRemainingBricks--; if (touchedByBall) { PlayerStatistics.PlayerNbPoints += 350; } break; case BrickType.PowerUp_Life: brickTouched.DestroyThisBrick(); NbRemainingBricks--; if (touchedByBall) { PlayerStatistics.PlayerNbPoints += 300; PlayerStatistics.PlayerNbLifes += 2; } break; case BrickType.PowerUp_Speed: brickTouched.DestroyThisBrick(); NbRemainingBricks--; if (touchedByBall) { PlayerStatistics.BallsSpeed += 0.25f; PlayerStatistics.PlayerNbPoints += 300; } break; case BrickType.PowerUp_Ball: brickTouched.DestroyThisBrick(); NbRemainingBricks--; if (touchedByBall) { CreateBallAtRacket(); PlayerStatistics.PlayerNbPoints += 300; } break; case BrickType.Strong: if (touchedByBall) { brickTouched.SetStateThisBrick(BrickType.Normal, this); PlayerStatistics.PlayerNbPoints += 500; } else { // destroy it because touched by the ground brickTouched.DestroyThisBrick(); NbRemainingBricks--; } break; case BrickType.SuperStrong: if (touchedByBall) { brickTouched.SetStateThisBrick(BrickType.Strong, this); PlayerStatistics.PlayerNbPoints += 1000; } else { // destroy it because touched by the ground brickTouched.DestroyThisBrick(); NbRemainingBricks--; } break; } if (NbRemainingBricks == 0) { PlayerStatistics.GameEnded = true; PlayerStatistics.PlayerNbPoints += PlayerStatistics.PlayerNbLifes * 1000; // keep the highest score if (PlayerPrefs.HasKey("Highscore")) { if (PlayerPrefs.GetInt("Highscore") < PlayerStatistics.PlayerNbPoints) { PlayerPrefs.SetInt("Highscore", PlayerStatistics.PlayerNbPoints); } } else { PlayerPrefs.SetInt("Highscore", PlayerStatistics.PlayerNbPoints); } EventManager.raise(EventType.PLAYER_WON); } }
void Explode(Vector3 direction) { bool hitObstacle = false; Ray.origin = new Vector3(transform.position.x, 0.5f, transform.position.z); Ray.direction = direction; for (int i = 0; i <= firePower && !hitObstacle; i++) { if (Physics.Raycast(Ray, out RayHit, i, hitLayer)) { Debug.Log("Explosion hit " + RayHit.collider.name); if (RayHit.collider.tag == "HardBrick") { //No matter it pierce or not, it will never pass through hitObstacle = true; } else if (RayHit.collider.tag == "Brick") { //It pass through when it pierce if (!pierceBomb) { hitObstacle = true; } //Debug.Log("Explosion hit " + RayHit.collider.name); BrickBehaviour brick = RayHit.collider.gameObject.GetComponent <BrickBehaviour>(); if (brick) { brick.Destroy(); } } /*else if (RayHit.collider.tag == "Item") * { * //It pass through no matter what * Debug.Log("Explosion hit " + RayHit.collider.name); * RayHit.collider.gameObject.layer = LayerMask.NameToLayer("Default"); * ItemBehaviour item = RayHit.collider.gameObject.GetComponent<ItemBehaviour>(); * if (item) * { * item.DestroySelf(); * } * }*/ if (!pierceBomb) { if (explosionPrefab && !RayHit.collider && !hitObstacle) { //Debug.Log("Did not hit = " + direction + " i = " + i); Instantiate(explosionPrefab, transform.position + direction * i, transform.rotation); } } else { if (pierceExplosionPrefab && !hitObstacle) { Instantiate(pierceExplosionPrefab, transform.position + direction * i, transform.rotation); } } } else { if (!pierceBomb) { if (explosionPrefab) { //Debug.Log("direction = " + direction + " i = " + i); Instantiate(explosionPrefab, transform.position + direction * i, transform.rotation); } } else { if (pierceExplosionPrefab) { Instantiate(pierceExplosionPrefab, transform.position + direction * i, transform.rotation); } } } } }
void OnCollisionEnter(Collision collision) { GameObject otherObject = collision.collider.gameObject; bool isVerticalCollision = Mathf.Abs(transform.position.x - otherObject.transform.position.x) < Mathf.Abs(transform.position.y - otherObject.transform.position.y); if (otherObject.tag != "Bat" || otherObject.transform.position.y < transform.position.y) { if (isVerticalCollision) { if (transform.position.y < otherObject.transform.position.y) { direction = new Vector3(direction.x, Mathf.Abs(direction.y) * -1, direction.z).normalized; } else { direction = new Vector3(direction.x, Mathf.Abs(direction.y), direction.z).normalized; } } else { if (transform.position.x < otherObject.transform.position.x) { direction = new Vector3(Mathf.Abs(direction.x) * -1, direction.y, direction.z).normalized; } else { direction = new Vector3(Mathf.Abs(direction.x), direction.y, direction.z).normalized; } } if (otherObject.tag == "Bat") { direction += (transform.position - otherObject.transform.position).normalized; direction.Normalize(); direction += new Vector3(0, .8f, 0); direction.Normalize(); speed += acceleration; } if (otherObject.tag == "Brick") { BrickBehaviour brick = otherObject.GetComponent <BrickBehaviour> (); if (brick.brickType == '<') { bat.Shrink(); } else if (brick.brickType == '>') { bat.Grow(); } else if (brick.brickType == 'x') { bat.DeleteOtherBat(); } else if (brick.brickType == 'o') { gameInstance.score += gameInstance.optionScore; } else if ("RBGY".IndexOf(brick.brickType.ToString()) > -1) { if (brick.brickType == 'R') { gameInstance.UpdateBonus(BonusPanelBehaviour.ButtonColor.red); } else if (brick.brickType == 'G') { gameInstance.UpdateBonus(BonusPanelBehaviour.ButtonColor.green); } else if (brick.brickType == 'B') { gameInstance.UpdateBonus(BonusPanelBehaviour.ButtonColor.blue); } else if (brick.brickType == 'Y') { gameInstance.UpdateBonus(BonusPanelBehaviour.ButtonColor.yellow); } } gameInstance.score += brick.score; GameObject.Destroy(otherObject); } } }