Files
survival-game/Assets/Mirror/Examples/CouchCoop/Scripts/CameraViewForAll.cs
2025-06-16 13:15:42 +00:00

73 lines
2.9 KiB
C#

using UnityEngine;
namespace Mirror.Examples.CouchCoop
{
public class CameraViewForAll : MonoBehaviour
{
public Transform cameraTransform;
public float camSpeed = 2.0f;
public float orthoSizeSpeed = 2.0f;
public Camera mainCamera;
public float cameraZ = -5;
public float cameraBufferX = 0.1f;
public float cameraBufferY = 0.1f;
public float minOrthographicSize = 0.1f;
public float targetYPosition = 4.5f; // Optional Y position if cameras rotated
private Vector2Int boundsMin;
private Vector2Int boundsMax;
private Vector3 targetCameraPosition;
private float targetOrthographicSize;
private void Update()
{
if (CouchPlayer.playersList.Count > 0)
{
CalculateBounds();
CalculateTargetCameraPosAndSize();
MoveCamera();
}
}
private void CalculateBounds()
{
boundsMin = new Vector2Int(int.MaxValue, int.MaxValue);
boundsMax = new Vector2Int(int.MinValue, int.MinValue);
foreach (GameObject player in CouchPlayer.playersList)
{
Vector3 playerPosition = player.transform.position;
boundsMin.x = Mathf.Min(boundsMin.x, Mathf.FloorToInt(playerPosition.x));
boundsMin.y = Mathf.Min(boundsMin.y, Mathf.FloorToInt(playerPosition.y));
boundsMax.x = Mathf.Max(boundsMax.x, Mathf.CeilToInt(playerPosition.x));
boundsMax.y = Mathf.Max(boundsMax.y, Mathf.CeilToInt(playerPosition.y));
}
boundsMin.x -= Mathf.FloorToInt(cameraBufferX);
boundsMin.y -= Mathf.FloorToInt(cameraBufferY);
boundsMax.x += Mathf.CeilToInt(cameraBufferX);
boundsMax.y += Mathf.CeilToInt(cameraBufferY);
}
private void CalculateTargetCameraPosAndSize()
{
float aspectRatio = (float)Screen.width / Screen.height;
float requiredOrthographicSizeX = Mathf.Max((boundsMax.x - boundsMin.x) / 2 / aspectRatio, minOrthographicSize / aspectRatio);
float requiredOrthographicSizeY = Mathf.Max(boundsMax.y - boundsMin.y / 2, minOrthographicSize);
targetOrthographicSize = Mathf.Max(requiredOrthographicSizeX, requiredOrthographicSizeY);
float cameraX = (boundsMax.x + boundsMin.x) / 2;
float cameraY = targetYPosition != 0.0f ? targetYPosition : (boundsMax.y + boundsMin.y) / 2;
targetCameraPosition = new Vector3(cameraX, cameraY, cameraZ);
}
private void MoveCamera()
{
cameraTransform.position = Vector3.Lerp(cameraTransform.position, targetCameraPosition, camSpeed * Time.deltaTime);
mainCamera.orthographicSize = Mathf.Lerp(mainCamera.orthographicSize, targetOrthographicSize, orthoSizeSpeed * Time.deltaTime);
}
}
}