void BounceBall(BallBehaviour ball) { Ray bumperRay = new Ray(ball.transform.position + Vector3.forward * GameplayConstants.ballRadius * 0.8f, ball.forward); RaycastHit hit; if (Physics.Raycast(bumperRay, out hit, GameplayConstants.tileEdgeSize / 2.1f)) { BumperBehaviour bumper = hit.collider.GetComponent <BumperBehaviour>(); if (bumper) { ball.forward = bumper.GetBounceDirection(ball.forward); if (!bumper.isLockedByRule) { bumper.raiseBehaviour.Lower(); } } } }
// Use this for initialization public void Initialize() { isInitialized = true; if (meshTransform) { meshTransform.localScale = new Vector3(1.0f, 1.0f, 1.0f) * GameplayConstants.tileEdgeSize; } bool gridRotate = false; switch (tileType) { case TileType.Custom: break; case TileType.Clear: break; case TileType.BumpersDefault: bumpers.Add(Instantiate(bumperPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius / 10, Quaternion.identity, transform)); bumpers.Add(Instantiate(bumperPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius / 10, Quaternion.Euler(0.0f, 0.0f, 180.0f), transform)); gridRotate = true; break; case TileType.Vault: Instantiate(vaultPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius, Quaternion.Euler(0.0f, 0.0f, subObjectAngle), transform); break; case TileType.FixedBumper: case TileType.FixedBumperClear: BumperBehaviour fixedBumper = Instantiate(bumperPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius / 10, Quaternion.Euler(0.0f, 0.0f, subObjectAngle), transform); fixedBumper.raiseBehaviour.isRaised = true; fixedBumper.isLockedByRule = true; bumpers.Add(fixedBumper); if (tileType == TileType.FixedBumper) { bumpers.Add(Instantiate(bumperPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius / 10, Quaternion.Euler(0.0f, 0.0f, subObjectAngle + 180.0f), transform)); } gridRotate = true; break; case TileType.BumperSingle: bumpers.Add(Instantiate(bumperPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius / 10, Quaternion.Euler(0.0f, 0.0f, subObjectAngle), transform)); break; case TileType.Block: Instantiate(blockPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius, Quaternion.identity, transform); break; case TileType.LockRed: subObjects.Add(Instantiate(lockRedPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius / 10, Quaternion.identity, transform).transform); break; case TileType.LockBlue: subObjects.Add(Instantiate(lockBluePrefab, transform.position + Vector3.back * GameplayConstants.ballRadius / 10, Quaternion.identity, transform).transform); break; default: Debug.LogError("Unexpected TileType found in TileBehaviour.Start()"); break; } if (gridRotate) { if ((gridPoint.x + gridPoint.y) % 2 == 1) { transform.Rotate(0.0f, 0.0f, 90.0f); } } if (pickupPrefab) { pickup = Instantiate(pickupPrefab, transform.position + Vector3.back * GameplayConstants.ballRadius, Quaternion.identity, transform); } }