private void Release() { // Reset State Variables isGrabbing = false; playerPushState = PushState.None; // Make target subject to physics again target.GetComponent <Rigidbody>().isKinematic = false; // Restore player movement speed RestoreSpeed(); // clear override push/pull parameters overrideParameters = null; // Enable player movement playerMotor.canControl = true; }
private IEnumerator Grab() { // Disable player movement playerMotor.canControl = false; // get push direction playerPushDir = GetPushDirection(); // populate collider bounding points dictionary dicColliderPoints = GetColliderVertexPositions(target); Vector3 startPos = player.position; Vector3 endPos = Vector3.zero; Vector3 temp = Vector3.zero; float zExtents = (dicColliderPoints[ColliderBoundsVertex.LowerForwardLeft] - dicColliderPoints[ColliderBoundsVertex.LowerBackLeft]).magnitude / 2; float xExtents = (dicColliderPoints[ColliderBoundsVertex.LowerBackRight] - dicColliderPoints[ColliderBoundsVertex.LowerBackLeft]).magnitude / 2; if (playerPushDir == PushDirection.TargetForward) { temp = target.position - (target.forward * (zExtents + (playerCtrl.radius / 2) + GrabDistance)); } else if (playerPushDir == PushDirection.TargetBack) { temp = target.position + (target.forward * (zExtents + (playerCtrl.radius / 2) + GrabDistance)); } else if (playerPushDir == PushDirection.TargetRight) { temp = target.position - (target.right * (xExtents + (playerCtrl.radius / 2) + GrabDistance)); } else if (playerPushDir == PushDirection.TargetLeft) { temp = target.position + (target.right * (xExtents + (playerCtrl.radius / 2) + GrabDistance)); } endPos = new Vector3(temp.x, player.position.y, temp.z); // move player float startTime = Time.time; playerPushState = PushState.MovingPlayer; while (Time.time < startTime + GrabMoveTime) { Vector3 lastPos = player.position; Vector3 newPos = Vector3.Lerp(startPos, endPos, (Time.time - startTime) / GrabMoveTime) - lastPos; playerCtrl.Move(newPos); yield return(null); } // set state playerPushState = PushState.None; localGrabPosition = target.position - player.position; targetLastPosition = target.position; targetLastRotation = target.eulerAngles; // smooth movement target.GetComponent <Rigidbody>().isKinematic = true; // set override push/pull parameters PushPullObject ppObj = target.GetComponent <PushPullObject>(); if (ppObj != null) { overrideParameters = ppObj.parameters; } // Slow player movement SlowSpeed(); }