using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CameraPoint : MonoBehaviour
{
public string targetName;
public Transform[] points;
public float interval = 2.0f;
public float stability = 0.5f;
public float rotationSpeed = 2.0f;
public float minDistance = 0.5f;
public AnimationCurve fovCurve = AnimationCurve.Linear(1, 30, 10, 30);
public bool autoChange = true;
Transform target;
Vector3 followPoint;
void Start()
{
target = GameObject.Find(targetName).transform;
followPoint = target.position;
if (autoChange)
{
StartAutoChange();
}
}
void Update()
{
var param = Mathf.Exp(-rotationSpeed * Time.deltaTime);
followPoint = Vector3.Lerp(target.position, followPoint, param);
transform.LookAt(followPoint);
}
public void ChangePosition(Transform destination, bool forceStable = false)
{
if (!enabled)
{
return;
}
transform.position = destination.position;
if (Random.value < stability || forceStable)
followPoint = target.position;
else
followPoint += Random.insideUnitSphere;
var dist = Vector3.Distance(target.position, transform.position);
GetComponentInChildren<Camera>().fieldOfView = fovCurve.Evaluate(dist);
}
Transform ChooseAnotherPoint(Transform current)
{
while (true)
{
var next = points[Random.Range(0, points.Length)];
var dist = Vector3.Distance(next.position, target.position);
if (next != current && dist > minDistance) return next;
}
}
IEnumerator AutoChange()
{
for (var current = points[0]; true; current = ChooseAnotherPoint(current))
{
ChangePosition(current);
yield return new WaitForSeconds(interval);
}
}
public void StartAutoChange()
{
StartCoroutine("AutoChange");
}
public void StopAutoChange()
{
StopCoroutine("AutoChange");
}
}
unity camera随机点拍摄并能缓动跟随目标
最新推荐文章于 2023-10-17 18:01:19 发布