先恢复之前的视觉移动方案

This commit is contained in:
2025-01-16 18:24:14 +08:00
parent e376606660
commit c2f792186a
3 changed files with 66 additions and 26 deletions
@@ -467,7 +467,7 @@ colorID: 3
group:视觉检查
position: -2052,-2351
---
<<if visited("End_memoryPaly")==false>>
<<if visited("UF深入检查")==false>>
me:没什么头绪,先看看别的地方
<<Set_MouseMovementLockState EyeManager false>>
<<switch_fix_system_to BodyModule>>
+3
View File
@@ -3887,6 +3887,9 @@ MonoBehaviour:
zoomDuration: 2
sceneBoundsMin: {x: 37.6, y: -6.64}
sceneBoundsMax: {x: 42.2, y: -5.21}
viewCamera: {fileID: 105412842}
parallaxEffectMultiplier: 0.1
maxOffset: {x: 2, y: 2}
--- !u!1001 &188784455
PrefabInstance:
m_ObjectHideFlags: 0
@@ -19,6 +19,14 @@ public class MouseFollowAndZoom : MonoBehaviour
private bool isActive = false;
private bool isLocked = false;
public Camera viewCamera;
public float parallaxEffectMultiplier = 0.1f;
public Vector2 maxOffset = new Vector2(2f, 2f);
private Vector3 initialPosition;
private float viewOffset = 40.3f;
// 读写访问
public void SetIsActive(bool value)
{
@@ -33,6 +41,7 @@ public class MouseFollowAndZoom : MonoBehaviour
void Start()
{
initialPosition = transform.position;
targetIndicator.SetActive(false); // 初始时隐藏目标框
eyemanager = FindObjectOfType<EyeSystem>();
if (eyemanager == null)
@@ -59,6 +68,33 @@ public class MouseFollowAndZoom : MonoBehaviour
void HandleMouseMovement()
{
// 获取鼠标位置
Vector3 mousePosition = Input.mousePosition;
Vector3 worldMousePosition = viewCamera.ScreenToWorldPoint(mousePosition);
worldMousePosition.z = 0; // 确保 z 为 0
// 计算目标偏移量并反向
Vector3 targetOffset = (viewCamera.transform.position - worldMousePosition) * parallaxEffectMultiplier;
targetOffset.x = Mathf.Clamp(targetOffset.x, -maxOffset.x, maxOffset.x);
targetOffset.y = Mathf.Clamp(targetOffset.y, -maxOffset.y, maxOffset.y);
// 平滑处理偏移量
float smoothFactor = 0.01f; // 平滑系数,值越小平滑效果越强,响应越慢
currentOffset = Vector3.Lerp(currentOffset, targetOffset, smoothFactor);
// 计算目标位置
Vector3 targetPosition = initialPosition + currentOffset;
// 限制目标位置在场景边界范围内
targetPosition.x = Mathf.Clamp(targetPosition.x, sceneBoundsMin.x, sceneBoundsMax.x);
targetPosition.y = Mathf.Clamp(targetPosition.y, sceneBoundsMin.y, sceneBoundsMax.y);
// 使用插值(Lerp)平滑更新位置
float followSpeed = 0.1f; // 跟随速度,值越小延迟越大
Vector3 smoothedPosition = Vector3.Lerp(transform.position, targetPosition, followSpeed);
// 应用平滑后的位置
transform.position = smoothedPosition;
}
@@ -66,7 +102,8 @@ public class MouseFollowAndZoom : MonoBehaviour
{
// 获取鼠标位置
Vector3 mousePosition = Input.mousePosition;
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(mousePosition);
mousePosition.x += viewOffset; // 添加偏移量
Vector3 worldPosition = viewCamera.ScreenToWorldPoint(mousePosition);
RaycastHit2D hit = Physics2D.Raycast(worldPosition, Vector2.zero);
// 检查是否有目标
@@ -96,35 +133,35 @@ public class MouseFollowAndZoom : MonoBehaviour
void HandleTargetIndicator()
{
// if (currentTarget == null)
// {
// targetIndicator.SetActive(false); // 隐藏指示器
// return;
// }
if (currentTarget == null)
{
targetIndicator.SetActive(false); // 隐藏指示器
return;
}
// // 获取目标的 BoxCollider2D
// BoxCollider2D boxCollider = currentTarget.GetComponent<BoxCollider2D>();
// if (boxCollider != null)
// {
// Vector3 boxCenter = boxCollider.bounds.center;
// Vector3 boxSize = boxCollider.bounds.size;
// 获取目标的 BoxCollider2D
BoxCollider2D boxCollider = currentTarget.GetComponent<BoxCollider2D>();
if (boxCollider != null)
{
Vector3 boxCenter = boxCollider.bounds.center;
Vector3 boxSize = boxCollider.bounds.size;
// // 转换为屏幕坐标
// Vector3 screenCenter = viewCamera.WorldToScreenPoint(boxCenter);
// Vector2 screenSize = viewCamera.WorldToScreenPoint(boxCenter + boxSize) -
// viewCamera.WorldToScreenPoint(boxCenter);
// 转换为屏幕坐标
Vector3 screenCenter = viewCamera.WorldToScreenPoint(boxCenter);
Vector2 screenSize = viewCamera.WorldToScreenPoint(boxCenter + boxSize) -
viewCamera.WorldToScreenPoint(boxCenter);
// // 设置目标框位置和大小
// RectTransform indicatorRectTransform = targetIndicator.GetComponent<RectTransform>();
// indicatorRectTransform.position = screenCenter;
// indicatorRectTransform.sizeDelta = screenSize;
// 设置目标框位置和大小
RectTransform indicatorRectTransform = targetIndicator.GetComponent<RectTransform>();
indicatorRectTransform.position = screenCenter;
indicatorRectTransform.sizeDelta = screenSize;
// // 设置目标名称
// targetNameText.text = currentTarget.name;
// 设置目标名称
targetNameText.text = currentTarget.name;
// // 显示指示器
// targetIndicator.SetActive(true);
// }
// 显示指示器
targetIndicator.SetActive(true);
}
}
public void SetIndicatorTarget(EyeTarget target)