Esempio n. 1
0
    private void LateUpdate()
    {
        if (!playerHasEntered)
        {
            // Rotate Target towards Player
            Vector3 distancetoPlayer = harmonySphere.position - CameraController.ActiveCamera.transform.position;// player.transform.position;
            float   angle            = 180 + Mathf.Atan2(distancetoPlayer.x, distancetoPlayer.z) * Mathf.Rad2Deg;
            Vector3 newRotation      = Vector3.zero;
            ////angle = Mathf.LerpAngle(inner.eulerAngles.y, angle, Time.deltaTime * 10f);

            newRotation.y = angle;
            //transform.localEulerAngles = newRotation;
            outerLeft.localEulerAngles  -= newRotation;
            outerRight.localEulerAngles -= newRotation;

            transform.LookAt(CameraController.ActiveCamera.transform.position);

            // If player is nearby, Pull on them

            if (distancetoPlayer.magnitude < distanceThresholdPulling)
            {
                if (!allomancer.HasPullTarget)
                {
                    allomancer.AddPullTarget(Player.PlayerMagnetic);
                }
                allomancer.IronPulling = true;
            }
        }
        else
        {
            transform.rotation = Quaternion.Slerp(transform.rotation, zeroRotation, Time.deltaTime * lerpConstant);
        }
    }
Esempio n. 2
0
    private void Update()
    {
        if (!PauseMenu.IsPaused)
        {
            //Debug.Log(facingPlayer + " . " + tracingPlayer + " > " + chasingPlayer + " > " + tracingPath + " > " + releasingPlayer);

            // Executes during Rising. Face the Spike towards the player, vertically.
            if (facingPlayer)
            {
                // Rotate Target towards Player
                Vector3 distancetoPlayer = spike.CenterOfMass - Player.PlayerIronSteel.CenterOfMass;
                float   angle            = 180 - Mathf.Atan2(distancetoPlayer.x, distancetoPlayer.z) * Mathf.Rad2Deg;

                //Vector3 newRotation = Quaternion.LookRotation(Player.PlayerIronSteel.CenterOfMass - spikeTarget.position).eulerAngles;
                //Vector3 newRotation = Quaternion.Slerp(spikeTarget.rotation, Quaternion.LookRotation(Player.PlayerIronSteel.CenterOfMass - spikeTarget.position), slerpConstantPlayer * Time.deltaTime).eulerAngles;
                Vector3 newRotation;
                newRotation.z = angle;
                newRotation.x = 90;
                newRotation.y = 0;
                //spikeTarget.eulerAngles = newRotation;
                spike.transform.eulerAngles = Quaternion.Slerp(spike.transform.rotation, Quaternion.Euler(newRotation), slerpConstantPlayer * Time.deltaTime).eulerAngles;
            }

            // Executes after Rising. The spike angles itself with the spike towards the player. Once the angle is somewhat low, it begins Pulling on the player.
            if (tracingPlayer)
            {
                Quaternion newRotation = Quaternion.Slerp(spike.transform.rotation, Quaternion.LookRotation(Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass), slerpConstantPlayer * Time.deltaTime * slerpTime);
                slerpTime = slerpTimeChargeupPlayer * (Mathf.Exp(-Time.time + startTime) + Time.time - startTime + 1);
                spike.transform.rotation = newRotation;
                //spike.transform.position = spikeTarget.transform.position;

                float angle = Quaternion.Angle(Quaternion.LookRotation(Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass), newRotation);
                if (angle < anglePullThreshold && spike.PullTargets.Count == 0)
                {
                    // add player as a pull target
                    spike.AddPullTarget(Player.PlayerMagnetic);
                    spike.IronPulling = true;
                    spike.IronBurnPercentageTarget = .2f;
                    spike.PullTargets.MaxRange     = -1;
                }
                if (angle < angleEqualThreshold)
                {
                    tracingPlayer = false;
                    chasingPlayer = true;
                    slerpTime     = 0;


                    spikeRb.isKinematic            = false;
                    spikeRb.drag                   = dragChasing;
                    spikeRb.velocity               = Vector3.zero;
                    spikeRb.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
                    spike.IronBurnPercentageTarget = .75f;
                }
            }

            // The Spike begins chasing the player as it Pulls on the player.
            if (chasingPlayer)
            {
                Quaternion newRotation = Quaternion.LookRotation(Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass);
                spike.transform.rotation = newRotation;

                if ((Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass).magnitude < distanceThresholdSpiking)
                {
                    chasingPlayer = false;
                    spikingPlayer = true;

                    Player.CanControlPlayer = false;
                    Player.PlayerInstance.GetComponent <Rigidbody>().velocity = spikeRb.velocity;
                }
            }

            // The spike has touched the player. Freeze the player and keep pulling the spike into them.
            if (spikingPlayer)
            {
                //Quaternion newRotation = Quaternion.LookRotation(Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass);
                //spike.transform.rotation = newRotation;

                if ((Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass).magnitude < distanceThresholdEqual)
                {
                    spikingPlayer = false;
                    tracingPath   = true;

                    spikeRb.drag = dragTracing;

                    // Set Player constraint
                    Player.PlayerInstance.GetComponent <Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;

                    // Make Spike Target rotate towards spline velocity
                    spikeTarget.transform.position = spike.transform.position;
                    spike.transform.localPosition  = Vector3.zero;
                    //spikeTarget.transform.rotation = spike.transform.rotation;
                    //spike.transform.localRotation = Quaternion.identity;
                    Player.PlayerInstance.transform.SetParent(spike.transform);
                    Player.PlayerInstance.transform.localPosition = Vector3.zero;

                    splineDragging.SetInitialPoint(transform.InverseTransformPoint(spike.transform.position), spikeRb.velocity.normalized);

                    spike.IronBurnPercentageTarget = 0;
                    spike.IronPulling = false;
                }
            }

            // Follow the Path.
            if (tracingPath)
            {
                progress += Time.deltaTime / animationTime * slerpTime;
                slerpTime = Mathf.Min(1, slerpTime + Time.deltaTime * slerpTimeChargeupPath);
                if (progress < 1f)
                {
                    // Change position of spike and childed player
                    splineDragging.FollowCurve(spikeTarget.transform, progress, false);

                    // If the spike was pulled away from its path, force the spike back towards the path
                    Vector3 distance    = spikeTarget.position - spike.CenterOfMass;
                    float   sqrDistance = distance.sqrMagnitude;
                    spikeRb.AddForce(forceConstantFar * distance.normalized * sqrDistance, ForceMode.Acceleration);

                    // Rotate the spike to follow the path, a few moments in the future
                    float offsetTime = progress + forwardTimeOffset / animationTime;
                    offsetTime = offsetTime > 1 ? 1 : offsetTime;
                    //Debug.Log("Distance: " + distance.magnitude);
                    //if (offsetTime < 1) {
                    //Vector3 velocity = splineDragging.GetVelocity(offsetTime);
                    //Quaternion newRotation = Quaternion.LookRotation(splineDragging.GetPoint(offsetTime) - spikeTarget.position);
                    Quaternion newRotation = Quaternion.Slerp(spike.transform.rotation, Quaternion.LookRotation(splineDragging.GetPoint(offsetTime) - spikeTarget.position), slerpConstantPath * Time.deltaTime * slerpTimeRotation);
                    spike.transform.rotation = newRotation;
                    //}

                    slerpTimeRotation = slerpTimeRotation + Time.deltaTime * slerpTimeChargeupPathRotation;
                }
                else
                {
                    tracingPath       = false;
                    releasingPlayer   = true;
                    slerpTime         = 0;
                    slerpTimeRotation = 0;
                    progress          = 0;

                    Player.CanControlPlayer = true;

                    Player.PlayerInstance.GetComponent <Rigidbody>().constraints = RigidbodyConstraints.None;
                    Player.PlayerInstance.transform.SetParent(GameObject.FindGameObjectWithTag("GameController").transform);

                    Player.PlayerInstance.GetComponent <Rigidbody>().velocity = splineDragging.GetVelocity(1);
                    Player.PlayerInstance.transform.position += splineDragging.GetVelocity(1) * Time.fixedDeltaTime;
                    spikeRb.velocity            = -splineDragging.GetVelocity(1);
                    spikeRb.transform.position -= splineDragging.GetVelocity(1) * Time.fixedDeltaTime;

                    spike.AddPushTarget(Player.PlayerMagnetic);
                    spike.SteelPushing = true;
                    spike.SteelBurnPercentageTarget = .5f;
                    spike.PushTargets.MaxRange      = 3;
                }
            }

            // Pushing the player off of the Spike.
            if (releasingPlayer)
            {
                if ((Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass).sqrMagnitude > .01)
                {
                    Quaternion newRotation = Quaternion.LookRotation(Player.PlayerIronSteel.CenterOfMass - spike.CenterOfMass);
                    //Quaternion newRotation = Quaternion.LookRotation(-spikeRb.velocity);
                    spike.transform.rotation = newRotation;
                }

                if ((spike.CenterOfMass - Player.PlayerIronSteel.CenterOfMass).magnitude > distanceThresholdReturn)
                {
                    releasingPlayer = false;
                    returningHome   = true;

                    spikeRb.collisionDetectionMode = CollisionDetectionMode.Discrete;
                    spikeTarget.transform.position = spike.transform.position;
                    spike.transform.localPosition  = Vector3.zero;
                    splineReturnHome.SetInitialPoint(transform.InverseTransformPoint(spike.transform.position), spikeRb.velocity.normalized);
                }
            }

            if (returningHome)
            {
                progress += Time.deltaTime / animationTime;
                if (progress < 1)
                {
                    splineReturnHome.FollowCurve(spikeTarget.transform, progress, false);

                    // If the spike was pulled away from its path, force the spike back towards the path
                    Vector3 distance    = spikeTarget.position - spike.CenterOfMass;
                    float   sqrDistance = distance.sqrMagnitude;
                    spikeRb.AddForce(forceConstantFar * distance.normalized * sqrDistance, ForceMode.Acceleration);

                    // Rotate the spike to follow the path, a few moments in the future
                    float offsetTime = progress + forwardTimeOffset / animationTime;
                    offsetTime = offsetTime > 1 ? 1 : offsetTime;

                    Vector3    velocity    = splineReturnHome.GetVelocity(offsetTime);
                    Quaternion newRotation = Quaternion.Slerp(spike.transform.rotation, Quaternion.LookRotation(splineReturnHome.GetPoint(offsetTime) - spikeTarget.position), slerpConstantPath * Time.deltaTime * slerpTimeRotation);
                    spike.transform.rotation = newRotation;

                    slerpTimeRotation = slerpTimeRotation + Time.deltaTime * slerpTimeChargeupPathReturn;
                }
                else
                {
                    returningHome = false;
                    anim.enabled  = true;

                    startTime         = 0;
                    slerpTime         = 0;
                    slerpTimeRotation = 0;
                    progress          = 0;

                    spikeRb.isKinematic = true;
                    anim.ResetTrigger("PlayerEntersHome");
                    anim.SetTrigger("Fall");
                }
            }
        }
    }