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(); }
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; } }
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; } }
private void OnDestroy() { if (!_isClone) { for (int i = 0; i < _cloneObjectPool.Count; i++) { Teleportable clone = _cloneObjectPool.Take(); if (clone) { Destroy(clone.gameObject); } } } }