From d08e5a8128025b19c34b07b5e754749a0c3b6844 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sat, 31 Jan 2026 13:05:30 +0800 Subject: 实现相机 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/CameraFOVWithDistance.cs | 29 ++++++++++ Assets/Scripts/CameraFOVWithDistance.cs.meta | 2 + Assets/Scripts/GrabStateMachine.cs | 25 +-------- Assets/Scripts/NewScriptableObjectScript.cs | 7 --- Assets/Scripts/NewScriptableObjectScript.cs.meta | 2 - Assets/Scripts/PlayerColor.cs | 35 +++++++++++++ Assets/Scripts/PlayerColor.cs.meta | 2 + Assets/Scripts/PlayerTracker.cs | 67 ++++++++++++++++++++++++ Assets/Scripts/PlayerTracker.cs.meta | 2 + 9 files changed, 139 insertions(+), 32 deletions(-) create mode 100644 Assets/Scripts/CameraFOVWithDistance.cs create mode 100644 Assets/Scripts/CameraFOVWithDistance.cs.meta delete mode 100644 Assets/Scripts/NewScriptableObjectScript.cs delete mode 100644 Assets/Scripts/NewScriptableObjectScript.cs.meta create mode 100644 Assets/Scripts/PlayerColor.cs create mode 100644 Assets/Scripts/PlayerColor.cs.meta create mode 100644 Assets/Scripts/PlayerTracker.cs create mode 100644 Assets/Scripts/PlayerTracker.cs.meta (limited to 'Assets/Scripts') diff --git a/Assets/Scripts/CameraFOVWithDistance.cs b/Assets/Scripts/CameraFOVWithDistance.cs new file mode 100644 index 0000000..56c3562 --- /dev/null +++ b/Assets/Scripts/CameraFOVWithDistance.cs @@ -0,0 +1,29 @@ +using System; +using UnityEngine; + +public class CameraFOVWithDistance : MonoBehaviour +{ + public PlayerTracker tracker; + public Camera camera; + + public float lerpSpeed = 0.15f; + + private float _targetFOV; + + private float _minDistance = 7.5f; + private float _maxDistance = 16.5f; + + private float _minFOV = 25f; + private float _maxFOV = 45f; + + private void Update() + { + var distancePercent = Mathf.InverseLerp(_minDistance, _maxDistance, Math.Clamp(tracker.Distance, _minDistance, _maxDistance)); + _targetFOV = Mathf.Lerp(_minFOV, _maxFOV, distancePercent); + } + + private void FixedUpdate() + { + camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, _targetFOV, lerpSpeed); + } +} diff --git a/Assets/Scripts/CameraFOVWithDistance.cs.meta b/Assets/Scripts/CameraFOVWithDistance.cs.meta new file mode 100644 index 0000000..a630d0c --- /dev/null +++ b/Assets/Scripts/CameraFOVWithDistance.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 502ec2fb6642346ad863dc45131eab27 \ No newline at end of file diff --git a/Assets/Scripts/GrabStateMachine.cs b/Assets/Scripts/GrabStateMachine.cs index 8242097..4695457 100644 --- a/Assets/Scripts/GrabStateMachine.cs +++ b/Assets/Scripts/GrabStateMachine.cs @@ -2,16 +2,9 @@ using UnityEngine; public class GrabStateMachine : MonoBehaviour { - private bool grabbing = false; - - // 动画组件引用(需要在Inspector面板赋值,或通过代码自动获取) - [Header("动画组件引用")] + public PlayerControl playerControl; [SerializeField] private Animator anim; - // 按键设置(可在Inspector面板修改,无需硬编码) - [Header("控制按键")] - [SerializeField] private KeyCode grabKey = KeyCode.G; - /// /// 初始化 /// @@ -22,26 +15,12 @@ public class GrabStateMachine : MonoBehaviour private void Update() { - DetectGrabKeyInput(); UpdateAnimatorState(); } - private void DetectGrabKeyInput() - { - if (Input.GetKey(grabKey)) - { - grabbing = true; - } - - if (Input.GetKeyUp(grabKey)) - { - grabbing = false; - } - } - private void UpdateAnimatorState() { - anim.SetBool("grabbing", grabbing); + anim.SetBool("grabbing", playerControl.grabbing); } } diff --git a/Assets/Scripts/NewScriptableObjectScript.cs b/Assets/Scripts/NewScriptableObjectScript.cs deleted file mode 100644 index 2445c74..0000000 --- a/Assets/Scripts/NewScriptableObjectScript.cs +++ /dev/null @@ -1,7 +0,0 @@ -using UnityEngine; - -[CreateAssetMenu(fileName = "iteminformation", menuName = "Scriptable Objects/NewScriptableObjectScript")] -public class NewScriptableObjectScript : ScriptableObject -{ - -} diff --git a/Assets/Scripts/NewScriptableObjectScript.cs.meta b/Assets/Scripts/NewScriptableObjectScript.cs.meta deleted file mode 100644 index de7a567..0000000 --- a/Assets/Scripts/NewScriptableObjectScript.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: e3b8854be5b2e694e96b45b9baf9e04a \ No newline at end of file diff --git a/Assets/Scripts/PlayerColor.cs b/Assets/Scripts/PlayerColor.cs new file mode 100644 index 0000000..d8fedbe --- /dev/null +++ b/Assets/Scripts/PlayerColor.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine; + +[RequireComponent(typeof(SkinnedMeshRenderer))] +public class PlayerColor : MonoBehaviour +{ + private SkinnedMeshRenderer _renderer; + private Material _materialInstance; + + private Color _currentColor; + public Color color; + + private void Start() + { + _renderer = GetComponent(); + _materialInstance = new Material(_renderer.material); + _renderer.material = _materialInstance; + } + + private void Update() + { + SetColor(color); + } + + public void SetColor(Color newColor) + { + if (newColor == _currentColor) return; + + _currentColor = newColor; + if (_materialInstance != null) + { + _materialInstance.SetColor("_Color", newColor); + } + } +} diff --git a/Assets/Scripts/PlayerColor.cs.meta b/Assets/Scripts/PlayerColor.cs.meta new file mode 100644 index 0000000..7fbe8fa --- /dev/null +++ b/Assets/Scripts/PlayerColor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 772311eef2b56ff108735f496df4ebb0 \ No newline at end of file diff --git a/Assets/Scripts/PlayerTracker.cs b/Assets/Scripts/PlayerTracker.cs new file mode 100644 index 0000000..b5f95e3 --- /dev/null +++ b/Assets/Scripts/PlayerTracker.cs @@ -0,0 +1,67 @@ +using UnityEngine; +using System.Collections.Generic; + +public class PlayerTracker : MonoBehaviour +{ + public Transform centerPos; + + [Header("玩家追踪设置")] + [SerializeField] private List playerTransforms = new(); + [SerializeField] private float maxDistance; + + public float Distance => maxDistance; + + [Header("距离限制")] + [Tooltip("最远玩家的距离")] + public float MaxDistance = 10f; + + [ContextMenu("收集玩家")] + public void CollectPlayers() + { + playerTransforms.Clear(); + + GameObject[] playerObjects = GameObject.FindGameObjectsWithTag("Player"); + + foreach (GameObject player in playerObjects) + { + Transform playerTransform = player.transform; + if (playerTransform != null && !playerTransforms.Contains(playerTransform)) + { + playerTransforms.Add(playerTransform); + } + } + } + + private void Update() + { + if (playerTransforms.Count == 0) return; + + Vector3 center = Vector3.zero; + foreach (Transform player in playerTransforms) + { + if (player != null) + { + center += player.position; + } + } + center /= playerTransforms.Count; + + centerPos.position = center; + + maxDistance = 0f; + foreach (Transform player in playerTransforms) + { + if (player != null) + { + float distance = Vector3.Distance(center, player.position); + if (distance > maxDistance) + { + maxDistance = distance; + } + } + } + + if (maxDistance > MaxDistance) + maxDistance = MaxDistance; + } +} \ No newline at end of file diff --git a/Assets/Scripts/PlayerTracker.cs.meta b/Assets/Scripts/PlayerTracker.cs.meta new file mode 100644 index 0000000..d5b41eb --- /dev/null +++ b/Assets/Scripts/PlayerTracker.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c25a3df449c3a6ff795ce47e0c770627 \ No newline at end of file -- cgit