/* * \brief Called once per frame */ public override void FixedUpdate() { m_lastPlayerPositionAlpha = m_playerPositionAlpha; m_physics.OnFixedUpdate(ref m_playerState); m_playerPositionAlpha -= m_physics.Velocity; m_playerPositionAlpha += m_physics.PlatformVelocity; // * 1500; // reset platformVelocity m_physics.PlatformVelocity = 0.0f; float additionalY = 0.0f; if (m_playerState == PlayerState.LedgeClimbComplete) { m_playerPositionAlpha -= m_physics.MovingDirection * 4; m_lastPlayerPositionAlpha = m_playerPositionAlpha; additionalY += 0.65f; rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ; m_playerState = PlayerState.Standing; m_physics.CurrentCollisionState = CollisionState.OnFloor; CapsuleCollider capCollider = this.GetComponentInChildren <CapsuleCollider>(); capCollider.enabled = true; } if (m_physics.LadderClimb.State != LadderState.None) { additionalY += m_physics.LadderClimb.Offset; } if (m_playerState == PlayerState.FallingFromTower) { m_additionalRadius += (0.025f * m_physics.Invert); m_additionalRadius = Mathf.Clamp(m_additionalRadius, -3.0f, 3.0f); m_playerPositionAlpha = m_lastPlayerPositionAlpha; } float yPosition = transform.position.y + additionalY; if (m_dead.didDie) { yPosition = m_lastCheckpoint.transform.position.y; m_dead.didDie = false; } m_position = new Vector3( Mathf.Sin(m_playerPositionAlpha * Mathf.Deg2Rad) * (PlayerPathRadius + m_additionalRadius), yPosition, Mathf.Cos(m_playerPositionAlpha * Mathf.Deg2Rad) * (PlayerPathRadius + m_additionalRadius) ); // Camera Positioning { //m_cameraClass.TendToMaxOffset(m_physics.Direction); Vector3 camPostion = Vector3.zero; float timeStoodStill = (Time.time * 1000.0f) - m_standingStillTime; if ((m_playerState == PlayerState.Standing && (timeStoodStill > m_cameraClass.CameraZoomTimerMs)) && m_physics.IsOnPlatform() == false) { m_cameraClass.DistanceFromPlayer -= 0.01f; } else { m_cameraClass.DistanceFromPlayer += 0.1f; } m_cameraClass.DistanceFromPlayer = Mathf.Clamp(m_cameraClass.DistanceFromPlayer, m_cameraClass.MinimumCameraDistance, m_cameraClass.MaximumCameraDistance); float cameraDistance = m_cameraClass.DistanceFromPlayer * m_physics.Invert; if (m_playerState == PlayerState.UpALadder && m_physics.CollisionType == CollisionState.None) { camPostion = new Vector3( 0, 0, cameraDistance ); } else { float movingDirection = Physics.MovingDirection; if (movingDirection == 0) { // this is bad movingDirection = 1; if (m_characterMesh.rotation.eulerAngles.y > 180.0f) { movingDirection = -1; } } if (m_playerState == PlayerState.Turning) { movingDirection *= -1.0f; } camPostion = new Vector3( (movingDirection == -1) ? -cameraDistance : cameraDistance, 0, 0 ); } if (m_playerState == PlayerState.FallingFromTower) { camPostion.y = m_dead.y; } Vector3 lookatOffset = transform.FindChild("Player_Mesh/Bip001/Bip001 Pelvis").position; m_cameraClass.SetPosition(camPostion); m_cameraClass.SetLookAt(lookatOffset); } // Animate and position the player model mesh { if (m_playerState == PlayerState.UpALadder) { m_characterMesh.rotation = Quaternion.Euler(new Vector3(0, this.transform.rotation.eulerAngles.y - 180, 0)); } else if (m_playerState == PlayerState.Turning) { } else { if (m_physics.Direction > 0) { m_characterMesh.rotation = Quaternion.Euler(new Vector3(0, this.transform.rotation.eulerAngles.y + 90, 0)); //m_ledgeGrabBox.localPosition = new Vector3(0.18f, m_ledgeGrabBox.localPosition.y, m_ledgeGrabBox.localPosition.z); } else if (m_physics.Direction < 0) { m_characterMesh.rotation = Quaternion.Euler(new Vector3(0, this.transform.rotation.eulerAngles.y - 90, 0)); //m_ledgeGrabBox.localPosition = new Vector3(-0.18f, m_ledgeGrabBox.localPosition.y, m_ledgeGrabBox.localPosition.z); } else if (m_physics.MovingDirection > 0) { m_characterMesh.rotation = Quaternion.Euler(new Vector3(0, this.transform.rotation.eulerAngles.y + 90, 0)); //m_ledgeGrabBox.localPosition = new Vector3(0.18f, m_ledgeGrabBox.localPosition.y, m_ledgeGrabBox.localPosition.z); } else if (m_physics.MovingDirection < 0) { m_characterMesh.rotation = Quaternion.Euler(new Vector3(0, this.transform.rotation.eulerAngles.y - 90, 0)); //m_ledgeGrabBox.localPosition = new Vector3(-0.18f, m_ledgeGrabBox.localPosition.y, m_ledgeGrabBox.localPosition.z); } } m_animation.OnFixedUpdate(ref m_playerState, m_physics.LadderClimb.State, m_physics.GetFootMaterial()); } if (m_playerState == PlayerState.FallingFromTower && (Time.time * 1000.0f) - m_dead.time > 3000) { OnDeath(); } //Not very nice - reenables collider if no longer ledge hanging/climbing if ( m_playerState != PlayerState.LedgeHang && m_playerState != PlayerState.LedgeClimb && m_playerState != PlayerState.LedgeClimbComplete ) { CapsuleCollider capCollider = this.GetComponentInChildren <CapsuleCollider>(); capCollider.enabled = true; } base.FixedUpdate(); }