Files
HauntedBloodlines/Assets/Scripts/Managers/RaycastManager.cs
2025-05-29 22:31:40 +03:00

397 lines
16 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using InfallibleCode;
using UICode;
public class RaycastManager : MonoBehaviour
{
/*[SerializeField] */private Camera _camera; //A reference to the camera of the ray.
public GameObject _currentHitObject; //The object that the ray is currently hitting.
[HideInInspector] public RaycastHit hit;
LayerMask mask = -1;
private static RaycastManager _instance;
public static RaycastManager GetInstance() { return _instance; }
public bool IsLookingAtInteractable;
public bool IsLookingAtGrabbable;
public bool RaycastIsActive = true;
void Awake()
{
if (!_instance)
{
_instance = this;
}
}
private void Start()
{
_camera = PlayerManager.GetInstance().PlayerMainCamera.GetComponent<Camera>();
}
public void RaycastIsActivated()
{
RaycastIsActive = true;
}
public void RaycastIsDisabled()
{
RaycastIsActive = false;
}
void Update()
{
#region UI Raycast
//var interactableForUI = _currentHitObjects.GetComponent<IInteractable>();
//if (interactableForUI == null)
//{
// UIManager.GetInstance().raycastDefault.SetActive(true);
// UIManager.GetInstance().raycastInteractabe.SetActive(false);
// return;
//}
//else
//{
// UIManager.GetInstance().raycastDefault.SetActive(false);
// UIManager.GetInstance().raycastInteractabe.SetActive(true);
//}
if (RaycastIsActive)
{
if (_currentHitObject == null)
{
UIManager.GetInstance().raycastDefault.SetActive(true);
UIManager.GetInstance().raycastInteractabe.SetActive(false);
UIManager.GetInstance().raycastLocked.SetActive(false);
}
#endregion
//RaycastHit hit; //The object that the raycast will hit.
Ray ray = _camera.ScreenPointToRay(Input.mousePosition); //The ray that comes from the camera.
float raydistance = 2.5f; // The distance of the ray.
if (Physics.Raycast(ray, out hit, raydistance, mask.value, QueryTriggerInteraction.Ignore))
{
_currentHitObject = hit.transform.gameObject;
Debug.DrawLine(ray.origin, hit.point, Color.red);
#region Press E Input
if (_currentHitObject == null) return;
if (Input.GetKeyDown(KeyCode.E) || Input.GetKeyDown(KeyCode.JoystickButton0)/*A button*/)
{
if (GameplayController.GetInstance().IsOnState(GameplayController.State.Gameplay))
{
var interactable = _currentHitObject.GetComponents<IInteractable>();
if (interactable == null) return;
foreach (var _interactable in interactable)
{
_interactable.Interact();
}
//interactable.Interact();
}
}
#endregion
#region Draggable Input
if (Input.GetMouseButton(0)) //While you are holding down the left mouse:
{
var draggable = _currentHitObject.GetComponent<IDraggable>();
if (draggable == null) return;
#region Player Camera
//CameraMovement.GetInstance()._cameraSensitivity = 0.5f;
#endregion
draggable.Drag();
}
else if (DraggablesManager.GetInstance().IsDragging)
{
//draggable.Drag
//CameraMovement.GetInstance()._cameraSensitivity = CameraMovement.GetInstance()._mouseSensitivityDefault; //Restores mouse sensitivity back to the deafult value.
DraggablesManager.GetInstance().IsDragging = false;
print("Default mouse sens");
}
#region Discoverable
//if (ExaminableItemData.GetInstance().IsExamining)
//{
//print("Mphka sthn if mwrh");
var discoverable = _currentHitObject.GetComponents<IDiscoverable>();
if (discoverable == null) return;
foreach (var _discoverable in discoverable)
{
_discoverable.Discover();
print("Discoverable item");
}
//}
#endregion
//// Initialize variables to null
//DraggableWindow window = null;
//DoorBehaviour door = null;
#region UI Raycast
var interactableForUI = _currentHitObject.GetComponent<IInteractable>();
var interactableForUI_Doors = _currentHitObject.GetComponent<DoorBehaviour>();
var interactableForUI_Windows = _currentHitObject.GetComponent<DraggableWindow>();
var interactableForUI_Drawers = _currentHitObject.GetComponent<Drawer>();
//var grabbableForUI = _currentHitObjects.GetComponent<IDraggable>();
if (interactableForUI == null)
{
UIManager.GetInstance().raycastDefault.SetActive(true);
UIManager.GetInstance().raycastInteractabe.SetActive(false);
UIManager.GetInstance().raycastLocked.SetActive(false);
interactableForUI_Doors = null;
return;
}
else
{
// Check if it's a DoorBehaviour
if (interactableForUI_Doors != null)
{
if (interactableForUI_Doors.CanOpenDoor)
{
UIManager.GetInstance().raycastDefault.SetActive(false);
UIManager.GetInstance().raycastInteractabe.SetActive(true);
UIManager.GetInstance().raycastLocked.SetActive(false);
}
else // Door is locked
{
UIManager.GetInstance().raycastDefault.SetActive(false);
UIManager.GetInstance().raycastInteractabe.SetActive(false);
UIManager.GetInstance().raycastLocked.SetActive(true);
}
}
else if (interactableForUI_Windows)
{
if (interactableForUI_Windows.CanOpenWindow)
{
UIManager.GetInstance().raycastDefault.SetActive(false);
UIManager.GetInstance().raycastInteractabe.SetActive(true);
UIManager.GetInstance().raycastLocked.SetActive(false);
}
else // window is locked
{
UIManager.GetInstance().raycastDefault.SetActive(false);
UIManager.GetInstance().raycastInteractabe.SetActive(false);
UIManager.GetInstance().raycastLocked.SetActive(true);
}
}
else if (interactableForUI_Drawers)
{
if (interactableForUI_Drawers.CanOpenDrawer)
{
UIManager.GetInstance().raycastDefault.SetActive(false);
UIManager.GetInstance().raycastInteractabe.SetActive(true);
UIManager.GetInstance().raycastLocked.SetActive(false);
}
else // drawer is locked
{
UIManager.GetInstance().raycastDefault.SetActive(false);
UIManager.GetInstance().raycastInteractabe.SetActive(false);
UIManager.GetInstance().raycastLocked.SetActive(true);
}
}
// It's neither DraggableWindow nor DoorBehaviour
else
{
UIManager.GetInstance().raycastDefault.SetActive(false);
UIManager.GetInstance().raycastInteractabe.SetActive(true);
UIManager.GetInstance().raycastLocked.SetActive(false);
}
}
//if (grabbableForUI == null && IsLookingAtInteractable == false)
//{
// //IsLookingAtInteractable = false;
// IsLookingAtGrabbable = false;
// UIManager.GetInstance().raycastDefault.SetActive(true);
// UIManager.GetInstance().raycastInteractabe.SetActive(false);
// return;
//}
//else
//{
// IsLookingAtGrabbable = true;
// if (IsLookingAtInteractable == false)
// {
// UIManager.GetInstance().raycastDefault.SetActive(false);
// UIManager.GetInstance().raycastInteractabe.SetActive(true);
// }
//}
#region Polished WIP Implementation
//var interactableForUI = _currentHitObjects.GetComponent<IInteractable>();
//var grabbableForUI = _currentHitObjects.GetComponent<IDraggable>();
//if (interactableForUI == null && IsLookingAtGrabbable == false)
//{
// IsLookingAtInteractable = false;
// //IsLookingAtGrabbable = false;
// UIManager.GetInstance().raycastDefault.SetActive(true);
// UIManager.GetInstance().raycastInteractabe.SetActive(false);
// return;
//}
//else
//{
// IsLookingAtInteractable = true;
// if (IsLookingAtGrabbable == false)
// {
// UIManager.GetInstance().raycastDefault.SetActive(false);
// UIManager.GetInstance().raycastInteractabe.SetActive(true);
// }
//}
//if(grabbableForUI == null && IsLookingAtInteractable == false)
//{
// //IsLookingAtInteractable = false;
// IsLookingAtGrabbable = false;
// UIManager.GetInstance().raycastDefault.SetActive(true);
// UIManager.GetInstance().raycastInteractabe.SetActive(false);
// return;
//}
//else
//{
// IsLookingAtGrabbable = true;
// if (IsLookingAtInteractable == false)
// {
// UIManager.GetInstance().raycastDefault.SetActive(false);
// UIManager.GetInstance().raycastInteractabe.SetActive(true);
// }
//}
#endregion
#endregion
#region WorldUI Icon
switch (hit.collider.tag)
{
case "Interactable":
//_currentHitObjects = hit.transform.gameObject;
if (!UIManager.GetInstance().updateUI)
{
UIManager.GetInstance().updateUI = true;
var worldUI = _currentHitObject.GetComponent<IUIWorld>();
if (worldUI == null) return;
worldUI.UpdateWorldUI();
print("UI icon is updating");
}
//if (DraggablesManager.GetInstance().IsDragging)
//{
// UIManager.GetInstance().updateUI = true;
// var worldUI = _currentHitObjects.GetComponent<IUIWorld>();
// if (worldUI == null) return;
// worldUI.UpdateWorldUI();
// print("UI icon is updating");
//}
break;
default:
if (UIManager.GetInstance().updateUI)
{
UIManager.GetInstance().DisableWorldUIIcon();
print("UI icon is Disabled");
UIManager.GetInstance().updateUI = false;
}
break;
}
#endregion
#endregion
#region old code
//switch (hit.collider.tag)
//{
// case "Closet":
// _currentHitObjects = hit.transform.gameObject;
// print("Ray hit the closet");
// if (ClosetHideBehaviour.GetInstance().InCloset == false && ClosetHideBehaviour.GetInstance().OutOfCloset)
// {
// ClosetHideBehaviour.GetInstance().HideInCloset();
// }
// break;
// case "LightSwitch":
// _currentHitObjects = hit.transform.gameObject;
// _currentHitObjects.GetComponent<NewLightSwitch>().lightSwitch();
// print("Ray hit the lightSwitch");
// //LightSwitch.GetInstance().lightSwitch();
// LightsManager.GetInstance().CanInteractWithLight = true;
// break;
// case "Battery":
// _currentHitObjects = hit.transform.gameObject;
// print("Ray hit a battery");
// BatteryManager.GetInstance().collectBattery();
// if (BatteryManager.GetInstance().BatteryCollected)
// {
// AudioManager.GetInstance().PickUpItemSoundPlay();
// Destroy(hit.transform.gameObject);
// BatteryManager.GetInstance().BatteryCollected = false;
// }
// break;
// case "Pills":
// _currentHitObjects = hit.transform.gameObject;
// print("Ray hit a pill");
// PlayerHealthManager.GetInstance().collectMedicine();
// if (PlayerHealthManager.GetInstance().PillsCollected) //If you have just collected a medicine:
// {
// AudioManager.GetInstance().PickUpItemSoundPlay();
// Destroy(hit.transform.gameObject);
// PlayerHealthManager.GetInstance().PillsCollected = false; //Defaults the MedicineCollected bool for the next medicine to be picked up.
// }
// break;
// case "Door":
// _currentHitObjects = hit.transform.gameObject;
// print("Ray hit a door");
// DoorBehaviour.GetInstance().OpenDoor();
// break;
// case "ExaminableItem":
// _currentHitObjects = hit.transform.gameObject;
// print("Ray hit an ExaminableItem");
// ExaminableItemData.GetInstance().CanInteractWithInteractableItem = true;
// break;
// default:
// LightsManager.GetInstance().CanInteractWithLight = false;
// ExaminableItemData.GetInstance().CanInteractWithInteractableItem = false;
// break;
//}
#endregion
}
else
{
_currentHitObject = null;
}
}
}
public void CheckForInteractableObject()
{
var interactable = _currentHitObject.GetComponents<IInteractable>();
if (interactable == null) return;
foreach (var _interactable in interactable)
{
_interactable.Interact();
}
}
}