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