94 lines
2.8 KiB
C#
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;
|
|
}
|
|
} |