first push!
This commit is contained in:
51
Assets/Scripts/Utils/TPPCameraFollow.cs
Normal file
51
Assets/Scripts/Utils/TPPCameraFollow.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class TPPCameraFollow : MonoBehaviour
|
||||
{
|
||||
[Header("Target Tracking")]
|
||||
public Transform target; // Drag your Moving Cube here
|
||||
public Vector3 offset = new Vector3(0f, 3f, -6f); // Behind and slightly above
|
||||
|
||||
[Header("Dynamics")]
|
||||
public float smoothTime = 0.3f;
|
||||
public float dynamicFOVSpeedMultiplier = 0.5f; // How much the FOV stretches based on speed
|
||||
public float baseFOV = 60f;
|
||||
|
||||
private Vector3 _velocity = Vector3.zero;
|
||||
private Camera _cam;
|
||||
private float _currentSpeed;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_cam = GetComponent<Camera>();
|
||||
|
||||
if (RowingInputManager.Instance != null)
|
||||
{
|
||||
RowingInputManager.Instance.OnVelocityChanged += UpdateDynamicFOV;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateDynamicFOV(float speed)
|
||||
{
|
||||
_currentSpeed = speed;
|
||||
}
|
||||
|
||||
private void LateUpdate()
|
||||
{
|
||||
if (target == null) return;
|
||||
|
||||
// 1. Smoothly follow the target's position
|
||||
Vector3 targetPosition = target.position + target.TransformDirection(offset);
|
||||
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref _velocity, smoothTime);
|
||||
|
||||
// 2. Look at the target
|
||||
transform.LookAt(target.position + Vector3.up * 1.5f); // Look slightly above the base of the cube
|
||||
|
||||
// 3. The "Juice": Dynamically widen the FOV as you row faster (Speed Sense)
|
||||
if (_cam != null)
|
||||
{
|
||||
float targetFOV = baseFOV + (_currentSpeed * dynamicFOVSpeedMultiplier);
|
||||
_cam.fieldOfView = Mathf.Lerp(_cam.fieldOfView, targetFOV, Time.deltaTime * 2f);
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/Scripts/Utils/TPPCameraFollow.cs.meta
Normal file
11
Assets/Scripts/Utils/TPPCameraFollow.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 80f384e7a225c4f98850a2f01f2b68ae
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
97
Assets/Scripts/Utils/UnityMainThreadDispatcher.cs
Normal file
97
Assets/Scripts/Utils/UnityMainThreadDispatcher.cs
Normal file
@@ -0,0 +1,97 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
public class UnityMainThreadDispatcher : MonoBehaviour {
|
||||
|
||||
private static readonly Queue<Action> _executionQueue = new Queue<Action>();
|
||||
|
||||
public void Update() {
|
||||
lock(_executionQueue) {
|
||||
while (_executionQueue.Count > 0) {
|
||||
_executionQueue.Dequeue().Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Locks the queue and adds the IEnumerator to the queue
|
||||
/// </summary>
|
||||
/// <param name="action">IEnumerator function that will be executed from the main thread.</param>
|
||||
public void Enqueue(IEnumerator action) {
|
||||
lock (_executionQueue) {
|
||||
_executionQueue.Enqueue (() => {
|
||||
StartCoroutine (action);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Locks the queue and adds the Action to the queue
|
||||
/// </summary>
|
||||
/// <param name="action">function that will be executed from the main thread.</param>
|
||||
public void Enqueue(Action action)
|
||||
{
|
||||
Enqueue(ActionWrapper(action));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Locks the queue and adds the Action to the queue, returning a Task which is completed when the action completes
|
||||
/// </summary>
|
||||
/// <param name="action">function that will be executed from the main thread.</param>
|
||||
/// <returns>A Task that can be awaited until the action completes</returns>
|
||||
public Task EnqueueAsync(Action action)
|
||||
{
|
||||
var tcs = new TaskCompletionSource<bool>();
|
||||
|
||||
void WrappedAction() {
|
||||
try
|
||||
{
|
||||
action();
|
||||
tcs.TrySetResult(true);
|
||||
} catch (Exception ex)
|
||||
{
|
||||
tcs.TrySetException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
Enqueue(ActionWrapper(WrappedAction));
|
||||
return tcs.Task;
|
||||
}
|
||||
|
||||
|
||||
IEnumerator ActionWrapper(Action a)
|
||||
{
|
||||
a();
|
||||
yield return null;
|
||||
}
|
||||
|
||||
|
||||
private static UnityMainThreadDispatcher _instance = null;
|
||||
|
||||
public static bool Exists() {
|
||||
return _instance != null;
|
||||
}
|
||||
|
||||
public static UnityMainThreadDispatcher Instance() {
|
||||
if (!Exists ()) {
|
||||
throw new Exception ("UnityMainThreadDispatcher could not find the UnityMainThreadDispatcher object. Please ensure you have added the MainThreadExecutor Prefab to your scene.");
|
||||
}
|
||||
return _instance;
|
||||
}
|
||||
|
||||
|
||||
void Awake() {
|
||||
if (_instance == null) {
|
||||
_instance = this;
|
||||
DontDestroyOnLoad(this.gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
void OnDestroy() {
|
||||
_instance = null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
11
Assets/Scripts/Utils/UnityMainThreadDispatcher.cs.meta
Normal file
11
Assets/Scripts/Utils/UnityMainThreadDispatcher.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2ed9d3282e8634c038764ee594f764f8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user