93 lines
2.9 KiB
C#
93 lines
2.9 KiB
C#
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();
|
||
}
|
||
}
|
||
} |