| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class CameraController : MonoBehaviour
- {
- public float offsetX = 5, offsetY = 3, offsetZ = -16;
- public float lerpValue = 3.5f;
- [HideInInspector]
- public Vector3 targetPos;
- [HideInInspector]
- public Vector3 leftTargetPos;
- [HideInInspector]
- public Vector3 rightTargetPos;
- [HideInInspector]
- public Vector3 cameraPos;
- public Camera mainCamera;
- public Camera leftCamera;
- public Camera rightCamera;
- public float maxView = 20;
- [HideInInspector]
- public float view;
- public float minDistance = 20;
- public float splitDistance = 30;
- public float mergeDistance = 16;
- [HideInInspector]
- public float distance;
- [HideInInspector]
- public float ratio;
- public float lineMaxScale = 0.5f;
- public GameObject lineInCamera;
- private void Start()
- {
- //ratio = maxView / (splitDistance - minDistance);
- }
- private void Update()
- {
- //µ÷²ÎÓÃ
- ratio = maxView / (splitDistance - minDistance);
- //
- if (PlayersInput.instance[0] == null)
- {
- targetPos = Vector3.zero + new Vector3(0, offsetY, offsetZ);
- }
- else if (PlayersInput.instance[1] == PlayersInput.instance[0])
- {
- targetPos = CameraTargetMove(PlayersInput.instance[0]);
- }
- else
- {
- Vector3 player0Pos = PlayersInput.instance[0].transform.position;
- Vector3 player1Pos = PlayersInput.instance[1].transform.position;
- distance = Vector3.Distance(player0Pos, player1Pos);
- if (player0Pos.x < player1Pos.x)
- {
- leftTargetPos = CameraTargetMove(PlayersInput.instance[0]);
- rightTargetPos = CameraTargetMove(PlayersInput.instance[1]);
- }
- else
- {
- leftTargetPos = CameraTargetMove(PlayersInput.instance[1]);
- rightTargetPos = CameraTargetMove(PlayersInput.instance[0]);
- }
- view = Mathf.Clamp((distance - minDistance) * ratio, 0, maxView);
- if (distance < mergeDistance)
- {
- mainCamera.enabled = true;
- leftCamera.enabled = false;
- rightCamera.enabled = false;
- lineInCamera.SetActive(false);
- }
- else
- {
- lineInCamera.transform.localScale = new Vector3(Mathf.Clamp(
- (distance - mergeDistance) * 0.01f, 0, lineMaxScale), 10, 1);
- targetPos =
- Vector3.Lerp(leftCamera.transform.position, rightCamera.transform.position, 0.5f);
- }
- if (distance > splitDistance)
- {
- mainCamera.enabled = false;
- leftCamera.enabled = true;
- rightCamera.enabled = true;
- lineInCamera.SetActive(true);
- }
- else
- {
- targetPos =
- Vector3.Lerp(player0Pos, player1Pos, 0.5f) + new Vector3(0, offsetY, offsetZ);
- }
- }
- }
- private void FixedUpdate()
- {
- if (PlayersInput.instance[1] == null)
- {
- mainCamera.transform.position =
- Vector3.Lerp(mainCamera.transform.position, targetPos, lerpValue * Time.deltaTime);
- }
- else
- {
- if (lineInCamera.activeSelf)
- {
- cameraPos = targetPos;
- }
- else
- {
- cameraPos = Vector3.Lerp(mainCamera.transform.position,
- targetPos, lerpValue * Time.deltaTime);
- }
- mainCamera.transform.position = new Vector3(cameraPos.x, cameraPos.y,offsetZ - view);
- leftCamera.transform.position = Vector3.Lerp(leftCamera.transform.position,
- leftTargetPos, lerpValue * Time.deltaTime);
- rightCamera.transform.position = Vector3.Lerp(rightCamera.transform.position,
- rightTargetPos, lerpValue * Time.deltaTime);
- }
- }
- Vector3 CameraTargetMove(PlayerController player)
- {
- Vector3 skewPos;
- if (player.bodyTrans.localScale.x > 0)
- {
- skewPos = player.transform.position + new Vector3(-offsetX, offsetY, offsetZ);
- }
- else
- {
- skewPos = player.transform.position + new Vector3(offsetX, offsetY, offsetZ);
- }
- return skewPos;
- }
- }
|