using TMPro;
using UnityEngine;
public class CarEntryController : MonoBehaviour
{
[Header("玩家")]
[SerializeField] private Transform player;
[SerializeField] private Camera playerCamera;
[SerializeField] private CharacterController characterController;
[SerializeField] private MonoBehaviour movementScript;
[Header("汽车")]
[SerializeField] private Transform driverSeatPoint;
[SerializeField] private Transform exitPoint;
[Header("汽车系统")]
[SerializeField] private CarPhysicsController carPhysicsController;
[SerializeField] private CarHeadlightController carHeadlightController;
[Header("交互")]
[SerializeField] private PlayerInputHandler inputHandler;
[SerializeField] private Collider driverDoorCollider;
[SerializeField] private Collider interiorExitCollider;
[SerializeField] private float interactionRange = 10f;
[SerializeField] private LayerMask interactionLayers = ~0;
[Header("交互UI")]
[SerializeField] private GameObject interactionPrompt;
[SerializeField] private TMP_Text interactionPromptText;
public bool IsPlayerInside { get; private set; }
private void Update()
{
if (playerCamera == null || inputHandler == null)
{
Debug.LogWarning("CarEntryController: Player Camera or Input Handler is missing!", this);
return;
}
UpdateInteractionPrompt();
if (inputHandler.InteractPressed)
{
Debug.Log("E按下 - 检查汽车交互.", this);
inputHandler.ConsumeInteract();
if (IsPlayerInside)
{
Debug.Log("玩家在汽车内。检查出口.", this);
if (IsLookingAt(interiorExitCollider))
{
ExitCar();
}
else
{
Debug.Log("射线未击中内部出口碰撞器.");
}
}
else
{
Debug.Log("玩家在外面。检查驾驶门.", this);
if (IsLookingAt(driverDoorCollider))
{
EnterCar();
}
else
{
Debug.Log("射线未击中驾驶门碰撞器.");
}
}
}
}
private void UpdateInteractionPrompt()
{
Collider target = IsPlayerInside ? interiorExitCollider : driverDoorCollider;
bool canInteract = IsLookingAt(target);
if (interactionPrompt != null)
{
interactionPrompt.SetActive(canInteract);
}
if (canInteract && interactionPromptText != null)
{
interactionPromptText.text = IsPlayerInside ? "[E] 退出汽车" : "[E] 进入汽车";
}
}
private bool IsLookingAt(Collider target)
{
if (target == null)
{
return false;
}
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
if (Physics.Raycast(ray, out RaycastHit hit, interactionRange, interactionLayers, QueryTriggerInteraction.Collide))
{
return hit.collider == target || hit.collider.transform.IsChildOf(target.transform);
}
return false;
}
private void EnterCar()
{
if (player == null || driverSeatPoint == null)
{
return;
}
SetMovementEnabled(false);
TeleportPlayer(driverSeatPoint);
IsPlayerInside = true;
//if (carPhysicsController != null)
//{
// carPhysicsController.SetDrivingEnabled(true);
//}
if (carHeadlightController != null)
{
carHeadlightController.SetHeadlights(true);
}
}
private void ExitCar()
{
if (player == null || exitPoint == null)
{
return;
}
TeleportPlayer(exitPoint);
IsPlayerInside = false;
SetMovementEnabled(true);
//if (carPhysicsController != null)
//{
// carPhysicsController.SetDrivingEnabled(false);
//}
if (carHeadlightController != null)
{
carHeadlightController.SetHeadlights(false);
}
}
private void TeleportPlayer(Transform destination)
{
if (characterController != null)
{
characterController.enabled = false;
}
player.SetPositionAndRotation(destination.position, destination.rotation);
if (characterController != null)
{
characterController.enabled = true;
}
}
private void SetMovementEnabled(bool enabledState)
{
if (movementScript != null)
{
movementScript.enabled = enabledState;
}
}
}
评论 (0)