Files
P2SinNext/Assets/Code/ControlsController.cs
2025-10-19 19:04:50 +05:00

161 lines
4.6 KiB
C#

using UnityEngine;
using System.Collections.Generic;
public class ControlsController : MonoBehaviour
{
public static ControlsController Instance { get; private set; }
private GameObject _controlledObject; // Îáúåêò ïîä óïðàâëåíèåì (îáû÷íî id=1)
private CharacterController _characterController;
[Header("Movement Settings")]
public float moveSpeed = 300f;
public float rotationSpeed = 90f;
[Header("Camera Settings")]
public float cameraRotationAngle = 45f;
public float cameraChangeSpeed = 5f;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
public void SetControlledObject(GameObject obj)
{
_controlledObject = obj;
_characterController = obj?.GetComponent<CharacterController>();
cameraRotationAngle = App.CameraController.currentCameraRotation;
if (_controlledObject != null)
{
Debug.Log($"Controlled object set: {_controlledObject.name}");
UpdateCameraPosition();
}
}
private void Update()
{
if (_controlledObject == null || App.GameState.IsPlayerControlLocked)
return;
HandleMovement();
HandleCameraRotation();
HandleInteraction();
}
private void HandleMovement()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
if (horizontal != 0 || vertical != 0)
{
Vector3 movement = new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
// Ïðåîáðàçóåì äâèæåíèå îòíîñèòåëüíî êàìåðû
Vector3 cameraForward = App.CameraController.transform.forward;
cameraForward.y = 0;
cameraForward.Normalize();
Vector3 cameraRight = App.CameraController.transform.right;
cameraRight.y = 0;
cameraRight.Normalize();
Vector3 moveDirection = (cameraForward * vertical + cameraRight * horizontal).normalized;
_controlledObject.transform.position += moveDirection * moveSpeed * Time.deltaTime;
// Ïîâîðà÷èâàåì ïåðñîíàæà â íàïðàâëåíèè äâèæåíèÿ
if (moveDirection != Vector3.zero)
{
Quaternion targetRotation = Quaternion.LookRotation(moveDirection);
_controlledObject.transform.rotation = Quaternion.Slerp(
_controlledObject.transform.rotation,
targetRotation,
rotationSpeed * Time.deltaTime
);
}
// Îáíîâëÿåì êàìåðó
UpdateCameraPosition();
}
}
private void HandleCameraRotation()
{
if (Input.GetKeyDown(KeyCode.Q))
{
RotateCamera(-1);
}
else if (Input.GetKeyDown(KeyCode.E))
{
RotateCamera(1);
}
}
private void RotateCamera(float angle)
{
int newRotation = App.CameraController.currentCameraRotation + (int)angle;
cameraRotationAngle = newRotation;
//int newRotation = (currentRotation + (int)(angle / 45f)) % 8;
//if (newRotation < 0) newRotation += 8;
App.CameraController.RotateCameraSmoothly(newRotation);
}
private void HandleInteraction()
{
if (Input.GetButtonDown("Submit"))
{
CheckNearbyInteractions();
}
}
private void CheckNearbyInteractions()
{
Collider[] hitColliders = Physics.OverlapSphere(_controlledObject.transform.position, 100f);
foreach (var hitCollider in hitColliders)
{
CharacterController otherController = hitCollider.GetComponent<CharacterController>();
if (otherController != null && otherController != _characterController)
{
if (otherController.blockSubroutine != 0)
{
StartSubroutine((ushort)otherController.blockSubroutine);
break;
}
}
}
}
public void UpdateCameraPosition()
{
if (_controlledObject != null)
{
Vector3 position = _controlledObject.transform.position;
App.CameraController.SetCamTargetXY(
(uint)App.CameraController.currentCameraRotation,
(uint)position.x,
(uint)position.y,
(uint)position.z
);
}
}
private void StartSubroutine(ushort subId)
{
if (App.VM != null)
{
App.VM.StartSubroutine(subId);
}
}
}