Example #1
0
    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);
        }
    }