Ejemplo n.º 1
0
        private void FixedUpdate()
        {
            if (_isClone)
            {
                return;
            }

            //if (m_Rigidbody.IsSleeping()) {
            //    m_Rigidbody.WakeUp();
            //}
            foreach (KeyValuePair <Portal, PortalContext> kvp in _contextByPortal)
            {
                Portal        portal = kvp.Key;
                PortalContext ctx    = kvp.Value;

                Teleportable clone = ctx.clone;

                // Lock clone to master
                clone._rigidbody.position        = portal.TeleportPoint(_rigidbody.position);
                clone._rigidbody.rotation        = portal.TeleportRotation(_rigidbody.rotation);
                clone._rigidbody.velocity        = portal.TeleportVector(_rigidbody.velocity);
                clone._rigidbody.angularVelocity = portal.TeleportVector(_rigidbody.angularVelocity);

                // Save clone's modified state
                clone.SaveRigidbodyInfo();
            }

            // Save master unmodified state
            SaveRigidbodyInfo();
        }
Ejemplo n.º 2
0
        private void LateUpdate()
        {
            if (_isClone)
            {
                return;
            }

            if (!ShouldUseFixedUpdate())
            {
                TeleportCheck();
            }

            foreach (KeyValuePair <Portal, PortalContext> kvp in _contextByPortal)
            {
                Portal        portal  = kvp.Key;
                PortalContext context = kvp.Value;
                Teleportable  clone   = context.clone;

                // Lock clone to master
                clone.transform.position   = portal.TeleportPoint(transform.position);
                clone.transform.rotation   = portal.TeleportRotation(transform.rotation);
                clone.transform.localScale = portal.TeleportScale(transform.localScale);

                clone.CopyAnimations(this);
            }

            if (_camera)
            {
                _cameraPositionLastFrame = _camera.transform.position;
            }
        }
Ejemplo n.º 3
0
        private void DoClonePhysicsStep()
        {
            foreach (KeyValuePair <Portal, PortalContext> kvp in _contextByPortal)
            {
                Portal        portal = kvp.Key;
                PortalContext ctx    = kvp.Value;
                Teleportable  clone  = ctx.clone;

                // Apply velocity restrictions to master
                Vector3 slaveDeltaVelocity  = clone._rigidbody.velocity - clone._rigidbodyLastTick.velocity;
                Vector3 masterDeltaVelocity = _rigidbody.velocity - _rigidbodyLastTick.velocity;

                Vector3 slaveDeltaPosition  = clone._rigidbody.position - clone._rigidbodyLastTick.position;
                Vector3 masterDeltaPosition = _rigidbody.position - _rigidbodyLastTick.position;

                Vector3 slaveDeltaAngularVelocity  = clone._rigidbody.angularVelocity - clone._rigidbodyLastTick.angularVelocity;
                Vector3 masterDeltaAngularVelocity = _rigidbody.angularVelocity - _rigidbodyLastTick.angularVelocity;

                //// Quaternion slaveDeltaRotation = clone.m_Rigidbody.rotation * Quaternion.Inverse(clone.m_RigidbodyLastTick.rotation);
                //// Quaternion masterDeltaRotation = m_Rigidbody.rotation * Quaternion.Inverse(m_RigidbodyLastTick.rotation);

                Vector3 velocityTransfer        = CalculateImpulseTransfer(portal.ExitPortal.TeleportVector(slaveDeltaVelocity), masterDeltaVelocity);
                Vector3 positionTransfer        = CalculateImpulseTransfer(portal.ExitPortal.TeleportVector(slaveDeltaPosition), masterDeltaPosition);
                Vector3 angularVelocityTransfer = CalculateImpulseTransfer(portal.ExitPortal.TeleportVector(slaveDeltaAngularVelocity), masterDeltaAngularVelocity);
                //// Quaternion rotationTransfer = portal.ExitPortal.TeleportRotation(slaveDeltaRotation) * Quaternion.Inverse(masterDeltaRotation);

                _rigidbody.velocity        += velocityTransfer;
                _rigidbody.position        += positionTransfer;
                _rigidbody.angularVelocity += angularVelocityTransfer;
                //// _rigidbody.rotation *= rotationTransfer;
            }
        }
Ejemplo n.º 4
0
 private void OnDestroy()
 {
     if (!_isClone)
     {
         for (int i = 0; i < _cloneObjectPool.Count; i++)
         {
             Teleportable clone = _cloneObjectPool.Take();
             if (clone)
             {
                 Destroy(clone.gameObject);
             }
         }
     }
 }