/// <summary> /// Custom Raycast using NearClipPlanesPoints /// </summary> /// <param name="_to"></param> /// <param name="from"></param> /// <param name="hitInfo"></param> /// <param name="distance"></param> /// <param name="cullingLayer"></param> /// <returns></returns> bool CullingRayCast(Vector3 from, ExtensionMethods.ClipPlanePoints _to, out RaycastHit hitInfo, float distance, LayerMask cullingLayer, Color color) { bool value = false; if (Physics.Raycast(from, _to.LowerLeft - from, out hitInfo, distance, cullingLayer)) { value = true; cullingDistance = hitInfo.distance; } if (Physics.Raycast(from, _to.LowerRight - from, out hitInfo, distance, cullingLayer)) { value = true; if (cullingDistance > hitInfo.distance) { cullingDistance = hitInfo.distance; } } if (Physics.Raycast(from, _to.UpperLeft - from, out hitInfo, distance, cullingLayer)) { value = true; if (cullingDistance > hitInfo.distance) { cullingDistance = hitInfo.distance; } } if (Physics.Raycast(from, _to.UpperRight - from, out hitInfo, distance, cullingLayer)) { value = true; if (cullingDistance > hitInfo.distance) { cullingDistance = hitInfo.distance; } } return(value); }
/// <summary> /// Camera behaviour /// </summary> void CameraMovement() { if (currentTarget == null) { return; } distance = Mathf.Lerp(distance, defaultDistance, smoothFollow * Time.deltaTime); //_camera.fieldOfView = fov; cullingDistance = Mathf.Lerp(cullingDistance, distance, Time.deltaTime); var camDir = (forward * targetLookAt.forward) + (rightOffset * targetLookAt.right); camDir = camDir.normalized; var targetPos = new Vector3(currentTarget.position.x, currentTarget.position.y + offSetPlayerPivot, currentTarget.position.z); currentTargetPos = targetPos; desired_cPos = targetPos + new Vector3(0, height, 0); current_cPos = currentTargetPos + new Vector3(0, currentHeight, 0); RaycastHit hitInfo; ExtensionMethods.ClipPlanePoints planePoints = _camera.NearClipPlanePoints(current_cPos + (camDir * (distance)), clipPlaneMargin); ExtensionMethods.ClipPlanePoints oldPoints = _camera.NearClipPlanePoints(desired_cPos + (camDir * distance), clipPlaneMargin); //Check if Height is not blocked if (Physics.SphereCast(targetPos, checkHeightRadius, Vector3.up, out hitInfo, cullingHeight + 0.2f, cullingLayer)) { var t = hitInfo.distance - 0.2f; t -= height; t /= (cullingHeight - height); cullingHeight = Mathf.Lerp(height, cullingHeight, Mathf.Clamp(t, 0.0f, 1.0f)); } //Check if desired target position is not blocked if (CullingRayCast(desired_cPos, oldPoints, out hitInfo, distance + 0.2f, cullingLayer, Color.blue)) { distance = hitInfo.distance - 0.2f; if (distance < defaultDistance) { var t = hitInfo.distance; t -= cullingMinDist; t /= cullingMinDist; currentHeight = Mathf.Lerp(cullingHeight, height, Mathf.Clamp(t, 0.0f, 1.0f)); current_cPos = currentTargetPos + new Vector3(0, currentHeight, 0); } } else { currentHeight = height; } //Check if target position with culling height applied is not blocked if (CullingRayCast(current_cPos, planePoints, out hitInfo, distance, cullingLayer, Color.cyan)) { distance = Mathf.Clamp(cullingDistance, 0.0f, defaultDistance); } var lookPoint = current_cPos + targetLookAt.forward * 2f; lookPoint += (targetLookAt.right * Vector3.Dot(camDir * (distance), targetLookAt.right)); targetLookAt.position = current_cPos; Quaternion newRot = Quaternion.Euler(mouseY, mouseX, 0); targetLookAt.rotation = Quaternion.Slerp(targetLookAt.rotation, newRot, smoothCameraRotation * Time.deltaTime); transform.position = current_cPos + (camDir * (distance)); var rotation = Quaternion.LookRotation((lookPoint) - transform.position); //lookTargetOffSet = Vector3.Lerp(lookTargetOffSet, Vector3.zero, 1 * Time.fixedDeltaTime); //rotation.eulerAngles += rotationOffSet + lookTargetOffSet; transform.rotation = rotation; movementSpeed = Vector2.zero; }