Files
TheAuction-GS/Assets/Player/InteractionBehaviour.cs

94 lines
2.8 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
[RequireComponent(typeof(MovementBehaviour))]
public class InteractionBehaviour : MonoBehaviour, IObjectParentHolder {
// Start is called before the first frame update
private MovementBehaviour _movementBehaviour;
[SerializeField] private float _interactionDistance = 2.0f;
[SerializeField] private LayerMask _interactionLayer;
private GameObject _lastInteractedObject = null;
public event EventHandler<OnSelectedCounterArgs> OnSelectedCounter;
[SerializeField] private Transform _holdItemTransform;
private Object _heldObject;
public class OnSelectedCounterArgs : EventArgs {
public GameObject selectedCounter;
}
void Start() {
}
void Awake() {
_movementBehaviour = GetComponent<MovementBehaviour>();
}
// Update is called once per frame
void Update() {
}
public void HandleInteraction() {
Vector2 inputVector = _movementBehaviour.desiredMovementDirection.normalized;
Vector3 moveDirection = new Vector3(inputVector.x, 0, inputVector.y);
Vector3 origin = transform.position;
origin.y += 0.5f; //slight offset so we dont go under the counters
RaycastHit hit;
Debug.DrawRay(origin, transform.forward * _interactionDistance, Color.red);
if (Physics.Raycast(origin, transform.forward, out hit, _interactionDistance, _interactionLayer)) {
GameObject hitObject = hit.transform.gameObject;
//Check if the object has a component that has the IInteractable interface
if (hitObject.TryGetComponent(out IInteractable interactable)) {
if(_lastInteractedObject != hitObject) {
setSelectedObject(hitObject);
}
}
else {
setSelectedObject(null);
}
}
else {
setSelectedObject(null);
}
}
public void Interact() {
if (_lastInteractedObject == null) return;
if (_lastInteractedObject.TryGetComponent(out IInteractable interactable)) {
interactable.Interact(this);
}
}
private void setSelectedObject(GameObject selectedCounter) {
_lastInteractedObject = selectedCounter;
OnSelectedCounter?.Invoke(this, new OnSelectedCounterArgs { selectedCounter = _lastInteractedObject });
}
public Transform GetHolderTransform() {
return _holdItemTransform;
}
public void SetObject(Object obj) {
_heldObject = obj;
}
public Object GetObject() {
return _heldObject;
}
public void ClearObject() {
_heldObject = null;
}
public bool HasObject() {
return _heldObject != null;
}
}