public IEnumerator JoinTheFlow() { if (CheckClosestWaypoint() != null) { impactCloud.Play(); playerController.anim.SetBool("isSwimming", true); Transform detectedWaypoint = CheckClosestWaypoint(); PlayerController.controlsAble = false; //Get the detected flow & position on the path FlowInstance targetFlow = detectedWaypoint.GetComponentInParent <FlowInstance> (); float targetPercentage = CheckPathPercentage(targetFlow); //Init for lerp Vector3 originPosition = transform.position; //Keep up vector for flow movement //New UP Vector3 upDirection = transform.up; //Resets local rotation of the mesh inside the player StartCoroutine(playerController.ResetMeshRotation()); float vol = soundMan.flowSource.volume; //Lerp towards target point on the path for (float i = 0; i < 1; i += Time.deltaTime * inSpeed) { transform.position = Vector3.Lerp(originPosition, iTween.PointOnPath(targetFlow.waypoints, targetPercentage), joiningCurve.Evaluate(i)); transform.rotation = Quaternion.LookRotation(transform.forward, upDirection); //Lerp in the flow sound if (!soundMan.flowSource.isPlaying) { soundMan.flowSource.Play(); } soundMan.flowSource.volume = Mathf.Lerp(0f, vol, i); yield return(new WaitForFixedUpdate()); } transform.position = iTween.PointOnPath(targetFlow.waypoints, targetPercentage); leftSwimBubbles.Play(); rightSwimBubbles.Play(); //Create flow parent GameObject flowParent = new GameObject("FlowParent"); flowParent.transform.position = transform.position; flowParent.transform.rotation = transform.rotation; flowMovement = flowParent.AddComponent <FlowMovement> (); theFlowParent = flowParent; transform.parent = flowParent.transform; //Initiate flow movement and informations for water control flowMovement.InitFlow(targetFlow, targetPercentage, upDirection); waterControl.InitFlow(targetFlow); currentFlow = targetFlow; //Switch to inFlow mode FlowMode(true); PlayerController.inFlow = true; PlayerController.controlsAble = true; sW.LoseSeaWeeds(); } }