Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- public class CameraFollow : MonoBehaviour {
- public Controller2D target;
- public float verticalOffset;
- public float lookAheadDstX;
- public float lookSmoothTimeX;
- public float verticalSmoothTime;
- public Vector2 focusAreaSize;
- FocusArea focusArea;
- float currentLookAheadX;
- float targetLookAheadX;
- float lookAheadDirX;
- float smoothLookVelocityX;
- float smoothVelocityY;
- bool lookAheadStopped;
- void Start() {
- focusArea = new FocusArea (target.collider.bounds, focusAreaSize);
- }
- void LateUpdate() {
- focusArea.Update (target.collider.bounds);
- Vector2 focusPosition = focusArea.centre + 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.centre, focusAreaSize);
- }
- struct FocusArea {
- public Vector2 centre;
- public Vector2 velocity;
- float left,right;
- float top,bottom;
- 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;
- centre = new Vector2((left+right)/2,(top +bottom)/2);
- }
- public void Update(Bounds targetBounds) {
- float shiftX = 0;
- if (targetBounds.min.x < left) {
- shiftX = targetBounds.min.x - left;
- } else if (targetBounds.max.x > right) {
- shiftX = targetBounds.max.x - right;
- }
- left += shiftX;
- right += shiftX;
- float shiftY = 0;
- if (targetBounds.min.y < bottom) {
- shiftY = targetBounds.min.y - bottom;
- } else if (targetBounds.max.y > top) {
- shiftY = targetBounds.max.y - top;
- }
- top += shiftY;
- bottom += shiftY;
- centre = new Vector2((left+right)/2,(top +bottom)/2);
- velocity = new Vector2 (shiftX, shiftY);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement