diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-03-01 09:36:29 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-03-01 09:36:29 +0800 |
| commit | c2b26c0491886b99f422e830cd9ec1637a4ddc2e (patch) | |
| tree | ec5a2b8aaf2e4568bd7ad59aa812864915bc6bdc /Assets/Scripts/Camera | |
firstmaster
Diffstat (limited to 'Assets/Scripts/Camera')
| -rw-r--r-- | Assets/Scripts/Camera/BindCameraHeightToShader.cs | 53 | ||||
| -rw-r--r-- | Assets/Scripts/Camera/BindCameraHeightToShader.cs.meta | 2 | ||||
| -rw-r--r-- | Assets/Scripts/Camera/CameraFollow.cs | 121 | ||||
| -rw-r--r-- | Assets/Scripts/Camera/CameraFollow.cs.meta | 2 | ||||
| -rw-r--r-- | Assets/Scripts/Camera/WCGame.Camera.asmdef | 3 | ||||
| -rw-r--r-- | Assets/Scripts/Camera/WCGame.Camera.asmdef.meta | 7 |
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: |
