summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Camera
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-03-01 09:36:29 +0800
committer魏曹先生 <1992414357@qq.com>2026-03-01 09:36:29 +0800
commitc2b26c0491886b99f422e830cd9ec1637a4ddc2e (patch)
treeec5a2b8aaf2e4568bd7ad59aa812864915bc6bdc /Assets/Scripts/Camera
firstmaster
Diffstat (limited to 'Assets/Scripts/Camera')
-rw-r--r--Assets/Scripts/Camera/BindCameraHeightToShader.cs53
-rw-r--r--Assets/Scripts/Camera/BindCameraHeightToShader.cs.meta2
-rw-r--r--Assets/Scripts/Camera/CameraFollow.cs121
-rw-r--r--Assets/Scripts/Camera/CameraFollow.cs.meta2
-rw-r--r--Assets/Scripts/Camera/WCGame.Camera.asmdef3
-rw-r--r--Assets/Scripts/Camera/WCGame.Camera.asmdef.meta7
6 files changed, 188 insertions, 0 deletions
diff --git a/Assets/Scripts/Camera/BindCameraHeightToShader.cs b/Assets/Scripts/Camera/BindCameraHeightToShader.cs
new file mode 100644
index 0000000..4381e2c
--- /dev/null
+++ b/Assets/Scripts/Camera/BindCameraHeightToShader.cs
@@ -0,0 +1,53 @@
+using UnityEngine;
+
+namespace Camera
+{
+ public class BindCameraHeightToShader : MonoBehaviour
+ {
+ public float layerHeight = 5;
+ private static readonly int PlayerHeight = Shader.PropertyToID("_PlayerHeight");
+ private static readonly int LayerHeight = Shader.PropertyToID("_LayerHeight");
+
+ private float scaleAverage
+ {
+ get
+ {
+ var t = transform;
+ var scale = t.localScale;
+ var average = (scale.x + scale.y + scale.z) / 3;
+ return average;
+ }
+ }
+
+ private void FixedUpdate()
+ {
+ Shader.SetGlobalFloat(PlayerHeight, transform.position.y);
+ Shader.SetGlobalFloat(LayerHeight, layerHeight);
+ }
+
+ private void OnDrawGizmos()
+ {
+ var t = transform;
+ var average = this.scaleAverage;
+
+ Gizmos.color = Color.yellow;
+ Gizmos.DrawWireCube(
+ t.position,
+ new Vector3(2f, 0.2f, 2f) * average
+ );
+ }
+
+ private void OnDrawGizmosSelected()
+ {
+ var t = transform;
+ var average = this.scaleAverage;
+
+ Gizmos.color = Color.green;
+ Gizmos.DrawWireCube(
+ t.position + Vector3.up * (layerHeight / 2),
+ (new Vector3(2.2f, 0f, 2.2f) * average) +
+ Vector3.up * layerHeight
+ );
+ }
+ }
+}
diff --git a/Assets/Scripts/Camera/BindCameraHeightToShader.cs.meta b/Assets/Scripts/Camera/BindCameraHeightToShader.cs.meta
new file mode 100644
index 0000000..f9942ed
--- /dev/null
+++ b/Assets/Scripts/Camera/BindCameraHeightToShader.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 5aa8cf760c4b2a54a994e58169a6ad80 \ No newline at end of file
diff --git a/Assets/Scripts/Camera/CameraFollow.cs b/Assets/Scripts/Camera/CameraFollow.cs
new file mode 100644
index 0000000..47b96f4
--- /dev/null
+++ b/Assets/Scripts/Camera/CameraFollow.cs
@@ -0,0 +1,121 @@
+using System;
+using JetBrains.Annotations;
+using UnityEngine;
+
+namespace Camera
+{
+ public class CameraFollow : MonoBehaviour
+ {
+ [CanBeNull] public static CameraFollow Current;
+ private Transform _followTarget;
+
+ private float _defaultYaw;
+ private bool _enableMove;
+ private float _height;
+
+ [CanBeNull]
+ public Transform followTarget
+ {
+ get => _followTarget;
+ set {
+ if (_followTarget == value) return;
+
+ _followTarget = value;
+
+ if (_followTarget != null)
+ OnFollowTargetChanged(value);
+ else
+ OnFollowTargetLost();
+ }
+ }
+
+ private void Awake()
+ {
+ _defaultYaw = rotationYaw.eulerAngles.y;
+
+ if (Current != null)
+ Debug.LogWarning("Duplicate CameraFollow Found!");
+ Current = this;
+ followTarget = defaultFollowTarget;
+ }
+
+ [Header("Parameters")]
+ [SerializeField] private bool enableYaw;
+ [SerializeField] private Transform defaultFollowTarget;
+ [SerializeField] [Range(0.015f, 1f)] private float yawRotationLerp;
+ [SerializeField] [Range(0.015f, 1f)] private float positionLerp;
+ [SerializeField] [Range(0.015f, 1f)] private float heightLerp;
+ [SerializeField] private LayerMask heightCheckLayerMask;
+
+ [Header("Bindings")]
+ [SerializeField] private Transform rotationYaw;
+ [SerializeField] private Transform rotationPitch;
+ [SerializeField] private Transform positionCamera;
+ [SerializeField] private Transform positionHeight;
+
+ private void OnFollowTargetChanged([CanBeNull] Transform target)
+ {
+ Debug.Log($"Follow target: {target?.name}");
+ _enableMove = target != null;
+ }
+
+ private void OnFollowTargetLost()
+ {
+ Debug.Log("Follow target lost");
+ _enableMove = false;
+ }
+
+ private void FixedUpdate()
+ {
+ FixedUpdateHeight();
+
+ if (_enableMove)
+ {
+ try
+ {
+ FixedUpdateMoveCamera();
+ }
+ catch (NullReferenceException)
+ {
+ OnFollowTargetLost();
+ }
+ }
+ }
+
+ private void FixedUpdateMoveCamera()
+ {
+ var transformYaw = _followTarget.rotation.eulerAngles.y;
+ var transformPosition = _followTarget.position;
+
+ var targetYaw = transformYaw;
+ var targetYawRotation = Quaternion.Euler(0, enableYaw ? targetYaw : _defaultYaw, 0);
+ var targetPosition = new Vector3(transformPosition.x, 0, transformPosition.z);
+
+ transform.position = Vector3.Lerp(transform.position, targetPosition, positionLerp);
+ rotationYaw.rotation = Quaternion.Lerp(rotationYaw.rotation, targetYawRotation, yawRotationLerp);
+ positionHeight.position = new Vector3(
+ transformPosition.x,
+ Mathf.Lerp(positionHeight.position.y, _height, heightLerp),
+ transformPosition.z
+ );
+ }
+
+ private void FixedUpdateHeight()
+ {
+ var transformPosition = transform.position;
+ var start = transformPosition + Vector3.up * 100;
+ var end = transformPosition + Vector3.down * 100;
+ Physics.Linecast(start, end, out RaycastHit hit, heightCheckLayerMask);
+ if (hit.collider == null)
+ _height = transformPosition.y;
+ else
+ _height = hit.point.y;
+ }
+
+ private void OnDestroy()
+ {
+ if (Current == this)
+ Current = null;
+ }
+ }
+}
diff --git a/Assets/Scripts/Camera/CameraFollow.cs.meta b/Assets/Scripts/Camera/CameraFollow.cs.meta
new file mode 100644
index 0000000..35f7072
--- /dev/null
+++ b/Assets/Scripts/Camera/CameraFollow.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 967f7d10ac322f048890a51be69e4081 \ No newline at end of file
diff --git a/Assets/Scripts/Camera/WCGame.Camera.asmdef b/Assets/Scripts/Camera/WCGame.Camera.asmdef
new file mode 100644
index 0000000..a760cc0
--- /dev/null
+++ b/Assets/Scripts/Camera/WCGame.Camera.asmdef
@@ -0,0 +1,3 @@
+{
+ "name": "WCGame.Camera"
+}
diff --git a/Assets/Scripts/Camera/WCGame.Camera.asmdef.meta b/Assets/Scripts/Camera/WCGame.Camera.asmdef.meta
new file mode 100644
index 0000000..fd2222d
--- /dev/null
+++ b/Assets/Scripts/Camera/WCGame.Camera.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b84af68224800a9499b937de477023db
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: