Files
2025TapTapGameJam/Assets/Script/Gameplay/Player/PlayerConnectController.cs

133 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Linq;
using Core;
using UnityEngine;
using Script.Gameplay.Connect;
using Script.Gameplay.Input;
using System;
namespace Script.Gameplay.Player
{
public class PlayerConnectController : MonoBehaviour
{
public bool IsEnableConnecting = true; // 是否启用连接功能
[SerializeField] private FirstPersonRaycaster raycaster; // 第一人称射线检测器
[SerializeField] private float maxConnectDistance = 10f; // 最大连接距离
private IConnectable currentTarget; // 当前注视的可连接对象
private IConnectable previousGazedTarget; // 上一次注视的 IConnectable用于触发进入/离开)
private InputManager inputManager;
private IConnectable outTarget;
private IConnectable inputTarget;
public event Action<IConnectable> OnSetPointA;
public event Action<IConnectable> OnSetPointB;
void Start()
{
inputManager = InputManager.Instance;
inputManager.Input.Player.SetOutput.performed += ctx => SetPointA(currentTarget);
inputManager.Input.Player.SetInput.performed += ctx => SetPointB(currentTarget);
inputManager.Input.Player.Connect.performed += ctx => CreateConnection();
inputManager.Input.Player.CutLine.performed += ctx => CutConnectLine(currentTarget);
if (raycaster == null)
raycaster = GetComponent<FirstPersonRaycaster>() ?? GetComponentInChildren<FirstPersonRaycaster>();
if (raycaster == null)
raycaster = FindObjectOfType<FirstPersonRaycaster>();
if (raycaster == null)
Debug.LogWarning("FirstPersonRaycaster not found! Please assign or add it to the player.");
ControllerLocator.Instance.Register(this);
}
void Update()
{
DetectConnectable();
}
void DetectConnectable()
{
if (raycaster == null) return;
GameObject lookAtObj = raycaster.CurrentLookAtObject;
IConnectable hitConnectable = lookAtObj != null ? lookAtObj.GetComponent<IConnectable>() : null;
// 注视对象变化时触发进入/离开(使用接口方法)
if (hitConnectable != previousGazedTarget)
{
if (previousGazedTarget != null)
{
previousGazedTarget.OnGazeExit();
}
if (hitConnectable != null)
{
hitConnectable.OnGazeEnter();
}
previousGazedTarget = hitConnectable;
}
currentTarget = hitConnectable;
}
public IConnectable GetCurrentTarget()
{
return currentTarget;
}
public void SetPointA(IConnectable target)
{
if (target == null) return;
if(!IsEnableConnecting) return;
outTarget = target;
OnSetPointA?.Invoke(outTarget);
}
public void SetPointB(IConnectable target)
{
if (target == null) return;
if(!IsEnableConnecting) return;
inputTarget = target;
OnSetPointB?.Invoke(inputTarget);
}
public void CutConnectLine(IConnectable target)
{
if (target == null) return;
if(!IsEnableConnecting) return;
ConnectionLineManager.Instance.CutTargetConnectionLines(target);
}
private void CreateConnection()
{
if(!IsEnableConnecting) return;
if (outTarget != null && inputTarget != null && outTarget != inputTarget)
{
//计算距离
float distance = Vector3.Distance(outTarget.GetPosition(), inputTarget.GetPosition());
if (distance > maxConnectDistance)
{
Debug.Log("Cannot create connection: targets are too far apart.");
return;
}
// 创建连接线
ConnectionLine connectionLine = ConnectionLineManager.Instance.GenerateConnectionLine(outTarget, inputTarget);
// 重置信号目标
outTarget = null;
inputTarget = null;
}
else
{
Debug.Log("Cannot create connection: invalid targets.");
}
}
void OnDrawGizmos()
{
// 射线可视化交由 FirstPersonRaycaster 处理
}
}
}