// Update this instance public void Update(InteractionSystem interactionSystem) { if (!initiated) return; // The default position Vector3 direction = spherecastFrom.TransformDirection(raycastDirectionLocal); hit.point = spherecastFrom.position + direction; // Spherecasting bool wallFound = FindWalls(direction); // Starting and ending the interactions if (!inTouch) { if (wallFound && Time.time > nextSwitchTime) { interactionObject.transform.parent = null; interactionSystem.StartInteraction(effectorType, interactionObject, true); nextSwitchTime = Time.time + minSwitchTime / interactionSystem.speed; targetPosition = hit.point; targetRotation = Quaternion.LookRotation(-hit.normal); interactionObject.transform.position = targetPosition; interactionObject.transform.rotation = targetRotation; } } else { if (!wallFound) { // Resume if no wall found StopTouch(interactionSystem); } else { if (!interactionSystem.IsPaused(effectorType) || sliding) { targetPosition = hit.point; targetRotation = Quaternion.LookRotation(-hit.normal); } } if (Vector3.Distance(interactionObject.transform.position, hit.point) > releaseDistance) { if (wallFound) { targetPosition = hit.point; targetRotation = Quaternion.LookRotation(-hit.normal); } else { StopTouch(interactionSystem); } } } float speedFTarget = !inTouch || (interactionSystem.IsPaused(effectorType) && interactionObject.transform.position == targetPosition)? 0f: 1f; speedF = Mathf.Lerp(speedF, speedFTarget, Time.deltaTime * 3f * interactionSystem.speed); // Interpolating the interaction object float s = Time.deltaTime * lerpSpeed * speedF * interactionSystem.speed; interactionObject.transform.position = Vector3.Lerp(interactionObject.transform.position, targetPosition, s); interactionObject.transform.rotation = Quaternion.Slerp(interactionObject.transform.rotation, targetRotation, s); }
// Stop touching the walls private void StopTouch(InteractionSystem interactionSystem) { interactionObject.transform.parent = interactionSystem.transform; nextSwitchTime = Time.time + minSwitchTime / interactionSystem.speed; if (interactionSystem.IsPaused(effectorType)) interactionSystem.ResumeInteraction(effectorType); else { speedF = 0f; targetPosition = hit.point; targetRotation = Quaternion.LookRotation(-hit.normal); } }