using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraFollow : MonoBehaviour { public Controller target; FocusArea focusArea; public Vector2 focusAreaSize; public float verticalOffset; public float lookAheadDstX; public float lookSmoothTimeX; public float verticalSmoothTime; float currentLookAheadX; float targetLookAheadX; float lookAheadDirX; float smoothLookVelocityX; float smoothVelocityY; bool lookAheadStopped; struct FocusArea { public Vector2 center; float left, right, top, bottom; public Vector2 velocity; public FocusArea(Bounds targetBounds, Vector2 size) { left = targetBounds.center.x - size.x / 2; right = targetBounds.center.x + size.x / 2; bottom = targetBounds.min.y; top = targetBounds.min.y + size.y; velocity = Vector2.zero; center = new Vector2((left + right) / 2, (top + bottom) / 2); } public void Update(Bounds targetBounds) { float shiftX = 0; float shiftY = 0; if (targetBounds.min.x < left) { shiftX = targetBounds.min.x - left; } else if (targetBounds.max.x > right) { shiftX = targetBounds.max.x - right; } if (targetBounds.min.y < bottom) { shiftY = targetBounds.min.y - bottom; } else if (targetBounds.max.y > top) { shiftY = targetBounds.max.y - top; } left += shiftX; right += shiftX; top += shiftY; bottom += shiftY; // Update center center = new Vector2((left + right) / 2, (top + bottom) / 2); velocity = new Vector2 (shiftX, shiftY); } } void Start() { focusArea = new FocusArea (target.collider.bounds, focusAreaSize); } void LateUpdate() { focusArea.Update (target.collider.bounds); Vector2 focusPosition = focusArea.center + Vector2.up * verticalOffset; if (focusArea.velocity.x != 0) { lookAheadDirX = Mathf.Sign (focusArea.velocity.x); if (Mathf.Sign (target.playerInput.x) == Mathf.Sign (focusArea.velocity.x) && target.playerInput.x != 0) { lookAheadStopped = false; targetLookAheadX = lookAheadDirX * lookAheadDstX; } else if (!lookAheadStopped) { lookAheadStopped = true; targetLookAheadX = currentLookAheadX + (lookAheadDirX * lookAheadDstX - currentLookAheadX) / 4f; } } currentLookAheadX = Mathf.SmoothDamp (currentLookAheadX, targetLookAheadX, ref smoothLookVelocityX, lookSmoothTimeX); focusPosition.y = Mathf.SmoothDamp (transform.position.y, focusPosition.y, ref smoothVelocityY, verticalSmoothTime); focusPosition += Vector2.right * currentLookAheadX; transform.position = (Vector3)focusPosition + Vector3.forward * -10; } void OnDrawGizmos() { Gizmos.color = new Color (1, 0, 0, .5f); Gizmos.DrawCube (focusArea.center, focusAreaSize); } }