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); } }
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"); } } } }