Files
2026-02-21 16:45:37 +08:00

92 lines
2.4 KiB
C#

using UnityEngine;
namespace ExitGames.Demos.DemoAnimator
{
public class CameraWork : MonoBehaviour
{
[Tooltip("The distance in the local x-z plane to the target")]
public float distance = 7f;
[Tooltip("The height we want the camera to be above the target")]
public float height = 3f;
[Tooltip("The Smooth time lag for the height of the camera.")]
public float heightSmoothLag = 0.3f;
[Tooltip("Allow the camera to be offseted vertically from the target, for example giving more view of the sceneray and less ground.")]
public Vector3 centerOffset = Vector3.zero;
[Tooltip("Set this as false if a component of a prefab being instanciated by Photon Network, and manually call OnStartFollowing() when and if needed.")]
public bool followOnStart;
private Transform cameraTransform;
private bool isFollowing;
private float heightVelocity;
private float targetHeight = 100000f;
private void Start()
{
if (followOnStart)
{
OnStartFollowing();
}
}
private void LateUpdate()
{
if (cameraTransform == null && isFollowing)
{
OnStartFollowing();
}
if (isFollowing)
{
Apply();
}
}
public void OnStartFollowing()
{
cameraTransform = Camera.main.transform;
isFollowing = true;
Cut();
}
private void Apply()
{
Vector3 vector = base.transform.position + centerOffset;
float y = base.transform.eulerAngles.y;
float y2 = cameraTransform.eulerAngles.y;
float num = y;
y2 = num;
targetHeight = vector.y + height;
float y3 = cameraTransform.position.y;
y3 = Mathf.SmoothDamp(y3, targetHeight, ref heightVelocity, heightSmoothLag);
Quaternion quaternion = Quaternion.Euler(0f, y2, 0f);
cameraTransform.position = vector;
cameraTransform.position += quaternion * Vector3.back * distance;
cameraTransform.position = new Vector3(cameraTransform.position.x, y3, cameraTransform.position.z);
SetUpRotation(vector);
}
private void Cut()
{
float num = heightSmoothLag;
heightSmoothLag = 0.001f;
Apply();
heightSmoothLag = num;
}
private void SetUpRotation(Vector3 centerPos)
{
Vector3 position = cameraTransform.position;
Vector3 vector = centerPos - position;
Quaternion quaternion = Quaternion.LookRotation(new Vector3(vector.x, 0f, vector.z));
Vector3 forward = Vector3.forward * distance + Vector3.down * height;
cameraTransform.rotation = quaternion * Quaternion.LookRotation(forward);
}
}
}