Perekyp/Assets/Scripts/Car/VehicleInteraction.cs

93 lines
2.9 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 UnityEngine;
[RequireComponent(typeof(CarController))]
public class VehicleInteraction : MonoBehaviour, IInteractable
{
[Header("Cameras & Setup")]
[SerializeField] private GameObject carCamera; // Камера от 3-го лица для авто
[SerializeField] private Transform exitPoint; // Точка, где спавнится игрок при выходе (возле левой двери)
private CarController carController;
private GameObject playerInstance;
private bool isPlayerInside = false;
private void Awake()
{
carController = GetComponent<CarController>();
carCamera.SetActive(false); // Выключаем камеру авто на старте
}
// Реализация интерфейса IInteractable
public void Interact(GameObject interactor)
{
if (!isPlayerInside)
{
EnterVehicle(interactor);
}
}
public string GetPrompt()
{
return "Сесть в машину (E)";
}
private void EnterVehicle(GameObject player)
{
isPlayerInside = true;
playerInstance = player;
// Отключаем игрока (тело, скрипты, его камеру)
playerInstance.SetActive(false);
// Включаем камеру машины
carCamera.SetActive(true);
}
private void ExitVehicle()
{
isPlayerInside = false;
// Останавливаем машину при выходе
carController.ProcessInput(0f, 0f, true);
// Включаем камеру игрока и отключаем камеру машины
carCamera.SetActive(false);
CharacterController charController = playerInstance.GetComponent<CharacterController>();
if (charController != null)
{
charController.enabled = false;
}
// 2. Перемещаем игрока
playerInstance.transform.position = exitPoint.position;
// 3. Включаем CharacterController обратно
if (charController != null)
{
charController.enabled = true;
}
playerInstance.SetActive(true);
playerInstance = null;
}
private void Update()
{
if (!isPlayerInside) return;
// Если игрок в машине, читаем ввод
float vertical = Input.GetAxis("Vertical");
float horizontal = Input.GetAxis("Horizontal");
bool isBraking = Input.GetKey(KeyCode.Space);
// Передаем управление в физику машины
carController.ProcessInput(vertical, horizontal, isBraking);
// Обработка выхода из машины
if (Input.GetKeyDown(KeyCode.E))
{
ExitVehicle();
}
}
}