Inheritance: MonoBehaviour
Beispiel #1
0
    private void StopTK()
    {
        if (m_tkTarget != null)
        {
            m_reorienting = false;
            m_throwing = false;
            m_tkTarget.Rigidbody.maxAngularVelocity = m_originalMaxAngVel;
            m_tkTarget.IsGrabbed = false;
            m_tkTarget.CollisionNotifier.OnCollision -= OnTargetCollision;

            m_tkTarget = null;
            m_magic.IsUsingMagic = false;
        }
    }
Beispiel #2
0
    private void FixedUpdate()
    {
        if (Controls.JustDown(GameButton.TK) && (m_magic.IsUsingMagic != (m_tkTarget == null)))
        {
            TKObject newTarget = (m_tkTarget == null) ? FindTKTarget() : null;
            if (newTarget != null)
            {
                m_tkTarget = newTarget;

                m_tkTarget.IsGrabbed = true;
                m_tkTarget.SetColor(m_magic.MagicColor);
                m_tkTarget.CollisionNotifier.OnCollision += OnTargetCollision;
                m_originalMaxAngVel = m_tkTarget.Rigidbody.maxAngularVelocity;
                m_tkTarget.Rigidbody.maxAngularVelocity = 40;
                m_distance = Mathf.Max(Vector3.Distance(newTarget.transform.position, transform.position), m_minDistance);

                m_magic.IsUsingMagic = true;
            }
            else
            {
                StopTK();
            }
        }

        if (m_tkTarget != null && (Vector3.Distance(transform.position, m_tkTarget.transform.position) > m_loseRange || !m_magic.CanUseMagic))
        {
            StopTK();
        }

        if (m_tkTarget != null)
        {
            m_distance = Mathf.Clamp(m_distance + (m_distanceSensitivity * Controls.AverageValue(GameAxis.TKDistance)), m_minDistance, m_maxGrabRange);

            if (Controls.JustDown(GameButton.Primary))
            {
                m_throwing = true;
            }

            if (Controls.JustDown(GameButton.Secondary))
            {
                if (m_reorienting)
                {
                    m_reorienting = false;
                }
                else if (Time.time - m_lastOrientTime < m_reorientTapTime)
                {
                    m_reorienting = true;
                }
                else
                {
                    m_lastOrientTime = Time.time;
                }
            }

            if (!m_reorienting && Controls.IsDown(GameButton.Secondary))
            {
                float rotateX = Controls.AverageValue(GameAxis.TKRotateX);
                float rotateY = Controls.AverageValue(GameAxis.TKRotateY);
                m_tkTarget.Rigidbody.angularVelocity = Camera.main.transform.rotation * (m_rotateSpeed * Vector3.ClampMagnitude(new Vector3(rotateY, -rotateX, 0), 1) / GetMassFactor());
            }
            else if (m_reorienting)
            {
                Quaternion camRotReverse = Camera.main.transform.rotation * Quaternion.Euler(0, 180, 0);
                if (Quaternion.Angle(camRotReverse, m_tkTarget.Rigidbody.transform.rotation) > 2)
                {
                    Quaternion difference = camRotReverse * Quaternion.Inverse(m_tkTarget.Rigidbody.transform.rotation);
                    float angle;
                    Vector3 axis;
                    difference.ToAngleAxis(out angle, out axis);
                    angle = Utils.TransformAngle(angle);
                    float maxMagnitude = m_rotateSpeed / GetMassFactor();
                    m_tkTarget.Rigidbody.angularVelocity = Mathf.Clamp(angle, -maxMagnitude, maxMagnitude) * axis;
                }
                else
                {
                    m_tkTarget.Rigidbody.angularVelocity = Vector3.zero;
                    m_reorienting = false;
                }
            }
            else
            {
                m_tkTarget.Rigidbody.angularVelocity = (1 - m_angVelocityDamp) * m_tkTarget.Rigidbody.angularVelocity;
            }
        }

        if (m_tkTarget != null)
        {
            Transform cam = Camera.main.transform;
            Vector3 targetVelocity;
            if (!m_throwing)
            {
                float camToPlayerDistance = Vector3.Dot(cam.forward, (transform.position - cam.position));
                Vector3 targetPos = cam.position + (camToPlayerDistance + m_distance) * cam.forward;
                Vector3 spherePos = m_distance * (targetPos - transform.position).normalized + transform.position;
                Vector3 velocity = m_velocityScale * (spherePos - m_tkTarget.transform.position);
                Vector3 bobVelocity = m_bobStrength * Mathf.Sin(Time.time * m_bobFrequency) * Vector3.up;
                targetVelocity = Vector3.ClampMagnitude(velocity + bobVelocity, m_maxVelocity / GetMassFactor());
            }
            else
            {
                Vector3 dir = cam.forward;
                if (GameController.CameraRig.LockTarget != null)
                {
                    dir = (GameController.CameraRig.LockTarget.position - m_tkTarget.transform.position).normalized;
                }
                targetVelocity = dir * m_maxVelocity / GetMassFactor();
            }
            targetVelocity += ((m_gravityOffset / m_velocitySmoothing) * -Physics.gravity);
            m_tkTarget.Rigidbody.velocity = Vector3.Lerp(m_tkTarget.Rigidbody.velocity, targetVelocity, m_velocitySmoothing * Time.deltaTime);
        }
    }