sdsandbox-rl-scripts/Scripts/camera/OverHeadCamera.cs

91 lines
2.5 KiB
C#
Executable File

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OverHeadCamera : MonoBehaviour
{
public PathManager pathManager;
public float margin = 5;
public float height = 10;
Camera cam;
float previousHeight = 0;
float previousWidth = 0;
public void Init()
{
if (pathManager == null) { return; }
if (pathManager.carPath == null) { return; }
cam = GetComponent<Camera>();
if (cam == null) { return; }
cam.orthographic = true; // make sure the camera is orthographic
List<Vector3> points = new List<Vector3>();
float xmin = float.MaxValue;
float xmax = float.MinValue;
float zmin = float.MaxValue;
float zmax = float.MinValue;
Vector3 vxmin = new Vector3();
Vector3 vzmin = new Vector3();
foreach (PathNode centerNode in pathManager.carPath.centerNodes)
{
Vector3 pos = centerNode.pos;
points.Add(pos);
if (pos.x < xmin)
{
xmin = pos.x;
vxmin = pos;
}
if (pos.z < zmin)
{
zmin = pos.z;
vzmin = pos;
}
if (pos.x > xmax)
{
xmax = pos.x;
}
if (pos.z > zmax)
{
zmax = pos.z;
}
}
// place the camera in the center of the circuit
Vector3 center = new Vector3((xmin + xmax) / 2.0f, 0, (zmin + zmax) / 2.0f);
transform.position = center + Vector3.up * height;
transform.LookAt(center, Vector3.up);
// try to best fit the camera to the screen
Vector3 vpxmin = cam.WorldToViewportPoint(vxmin);
Vector3 vpzmin = cam.WorldToViewportPoint(vzmin);
float xdistanceToBorder = vpxmin.x;
float zdistanceToBorder = vpzmin.y;
float zoomValue = 1 - Mathf.Min(xdistanceToBorder, zdistanceToBorder) * 2;
cam.orthographicSize = cam.orthographicSize * zoomValue + margin;
}
public void Update()
{
float currentHeight = Display.main.renderingHeight;
float currentWidth = Display.main.renderingWidth;
// if the resolution of the window changed, re-Init the camera
if (currentHeight != previousHeight || currentWidth != previousWidth)
{
previousHeight = currentHeight;
previousWidth = currentWidth;
Init();
}
}
}