private void OnPortalEnter(Portal senderPortal, Collider collider) { Vector3 offset = senderPortal.transform.position - collider.transform.position; switch (collider.tag) { case "Projectile": var projectile = collider.GetComponent <Projectile>(); projectile.CanPickup = false; var rgb = projectile.rgb; rgb.MovePosition(postTeleportPosition.position); Vector3 originalVelocity = projectile.actualVelocity; //Vector3 newVelocity = Vector3.Reflect(originalVelocity, transform.up); //newVelocity.y = 0f; // keep vector in x,z and ignore y Vector3 newVelocity = originalVelocity; // rotate new velocity according to both portals' rotations float rotationDiff = senderPortal.transform.rotation.eulerAngles.y - transform.rotation.eulerAngles.y; Quaternion correctiveRotation = Quaternion.Euler(0f, rotationDiff, 0f); newVelocity = correctiveRotation * newVelocity; // set actual velocity projectile.actualVelocity = newVelocity; // apply force rgb.velocity = Vector3.zero; rgb.AddForce(newVelocity.normalized * portalSettings.PostTeleportForce, ForceMode.Impulse); rgb.angularVelocity = Vector3.zero; OneShotAudioManager.PlayOneShotAudio(portalSettings.teleportationSounds, transform.position, 1f); Debug.DrawRay(opposingPortal.transform.position, originalVelocity, Color.red, 5f); Debug.DrawRay(transform.position, newVelocity, Color.green, 5f); break; case "Player": Debug.Log("Player Teleported"); break; } }
private void OnBeat() { if (!GameManager.Instance.gameInProgress) { return; } // cache Renderer renderer; // disable old dir for (int i = 0; i < oldIterationRenderers.Length; i++) { renderer = oldIterationRenderers[i]; if (renderer == null) { break; } renderer.material = greyedColor; } // enable current dir int startIndex = amtPerDir * (currentIteration = currentIteration > 2 ? 0 : currentIteration + 1); for (int i = 0; i < amtPerDir; i++) { renderer = renderers[startIndex + i]; if (renderer == null) { return; } renderer.material = globalColor; oldIterationRenderers[i] = renderer; } // shoot projectile { var projectile = manager.SpawnObject(projectilePrefab).GetComponent <Projectile>(); projectile.transform.position = launchPositions[currentIteration].position; projectile.rgb.WakeUp(); projectile.rgb.useGravity = true; projectile.ownCollider.enabled = true; // launch projectile in aim direction var forceVec = launchPositions[currentIteration].position - transform.position; forceVec.y = 0f; Vector3 shotVec = forceVec.normalized * settings.ShotStrength; projectile.rgb.AddForce(shotVec, ForceMode.Impulse); projectile.actualVelocity = shotVec; // for portal/wall bounces projectile.InitialShooter = null; projectile.wallHitVol = .4f; OneShotAudioManager.PlayOneShotAudio(settings.ProjectileShotSounds, launchPositions[currentIteration].position, .4f); } if (Time.timeScale < .01f) { StartCoroutine(OnBeatDelayed()); } else { music.RegisterCallOnNextBeat(OnBeat, beatDelay, false); } }