120 lines
2.6 KiB
C#
120 lines
2.6 KiB
C#
using UnityEngine;
|
|
|
|
#if ALLIN13DSHADER_BIRP && UNITY_POST_PROCESSING_STACK_V2
|
|
using UnityEngine.Rendering.PostProcessing;
|
|
#endif
|
|
|
|
namespace AllIn13DShader
|
|
{
|
|
public class DemoCameraController : MonoBehaviour
|
|
{
|
|
public enum TransitionState
|
|
{
|
|
NONE = 0,
|
|
MOVING = 1,
|
|
}
|
|
|
|
private Vector3 srcPosition;
|
|
private Quaternion srcRotation;
|
|
|
|
private Vector3 dstPosition;
|
|
private Quaternion dstRotation;
|
|
|
|
private AnimationCurve cameraCurve;
|
|
|
|
private TransitionState transitionState;
|
|
private float timer;
|
|
private float transitionDuration;
|
|
|
|
private Vector3 deltaMovement;
|
|
|
|
public Transform target;
|
|
public float lerpSpeed;
|
|
|
|
[Header("Camera")]
|
|
public Camera cam;
|
|
|
|
#if ALLIN13DSHADER_BIRP && UNITY_POST_PROCESSING_STACK_V2
|
|
[Header("Postprocess")]
|
|
public PostProcessLayer postProcessLayer;
|
|
public PostProcessVolume postProcessVolume;
|
|
#endif
|
|
|
|
public void Init(DemoSceneConfiguration demoSceneConfig)
|
|
{
|
|
this.cameraCurve = demoSceneConfig.cameraCurve;
|
|
this.transitionState = TransitionState.NONE;
|
|
this.transitionDuration = demoSceneConfig.cameraTransitionDuration;
|
|
}
|
|
|
|
public void DemoChanged(DemoElement demoElement)
|
|
{
|
|
transitionState = TransitionState.MOVING;
|
|
|
|
srcPosition = target.position;
|
|
srcRotation = target.rotation;
|
|
|
|
dstPosition = demoElement.transform.position;
|
|
dstRotation = Quaternion.identity;
|
|
|
|
#if ALLIN13DSHADER_BIRP && UNITY_POST_PROCESSING_STACK_V2
|
|
if (postProcessLayer != null)
|
|
{
|
|
postProcessLayer.enabled = demoElement.demoElementData.postProcessEnabled;
|
|
}
|
|
|
|
if(postProcessVolume != null)
|
|
{
|
|
postProcessVolume.enabled = demoElement.demoElementData.postProcessEnabled;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
public void GoTo(Transform tr)
|
|
{
|
|
transitionState = TransitionState.MOVING;
|
|
|
|
dstPosition = tr.position;
|
|
dstRotation = tr.rotation;
|
|
|
|
srcPosition = target.position;
|
|
srcRotation = target.rotation;
|
|
}
|
|
|
|
public Vector3 GetDeltaMovement()
|
|
{
|
|
return deltaMovement;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if(transitionState == TransitionState.MOVING)
|
|
{
|
|
Update_Moving();
|
|
}
|
|
else
|
|
{
|
|
deltaMovement = Vector3.zero;
|
|
}
|
|
}
|
|
|
|
private void Update_Moving()
|
|
{
|
|
timer += Time.deltaTime;
|
|
float t = timer / transitionDuration;
|
|
float curveT = cameraCurve.Evaluate(t);
|
|
|
|
Vector3 newPosition = Vector3.LerpUnclamped(srcPosition, dstPosition, curveT);
|
|
deltaMovement = newPosition - target.transform.position;
|
|
|
|
target.transform.position = newPosition;
|
|
target.transform.rotation = Quaternion.SlerpUnclamped(srcRotation, dstRotation, curveT);
|
|
|
|
if(t >= 1f)
|
|
{
|
|
transitionState = TransitionState.NONE;
|
|
timer = 0f;
|
|
}
|
|
}
|
|
}
|
|
} |