/****************************************************
文件:Interact.cs
作者:Edision
日期:2023/05/10
功能:交互系统
*****************************************************/
using UnityEngine;
public class Interact : MonoBehaviour
{
private InteractEvent interact = new InteractEvent();
private Player player;
public InteractEvent GetInteract
{
get
{
if (interact == null) interact = new InteractEvent();
return interact;
}
}
public Player GetPlayer
{
get
{
return player;
}
}
public void CallInteract(Player player)
{
this.player = player;
interact.CallInteractedEvent();
}
}
public class InteractEvent
{
public delegate void InteractHandler();
public event InteractHandler HasInteracted;
public void CallInteractedEvent() => HasInteracted?.Invoke();
}
/****************************************************
文件:Player.cs
作者:Edision
日期:#CreateTime#
功能:交互对象--玩家
*****************************************************/
using UnityEngine;
public class Player : MonoBehaviour
{
/// <summary>
/// 交互层
/// </summary>
private LayerMask interactLayerMask;
public void PlayerInteract()
{
var layerMask0 = 1 << 0;
var layerMask3 = 1 << 3;
interactLayerMask = layerMask0 | layerMask3;
RaycastHit hit;
Ray ray = Camera.main.ViewportPointToRay(new Vector3(.5f,.5f,0f));
if (Physics.Raycast(ray,out hit,10, interactLayerMask))
{
Interact temp_Interact=hit.transform.GetComponent<Interact>();
temp_Interact?.CallInteract(this);
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
PlayerInteract();
}
}
}
/****************************************************
文件:Interact_Cube.cs
作者:Edision
日期:#CreateTime#
功能:交互方块
*****************************************************/
using UnityEngine;
[RequireComponent(typeof(Interact))]
public class Interact_Cube : MonoBehaviour
{
[HideInInspector]
public Interact interactaction;
private void Awake()
{
interactaction = GetComponent<Interact>();
}
private void OnEnable()
{
if (interactaction != null)
{
interactaction.GetInteract.HasInteracted += InteractedEvent;
}
}
private void OnDisable()
{
if (interactaction != null)
{
interactaction.GetInteract.HasInteracted -= InteractedEvent;
}
}
public void InteractedEvent()
{
Debug.Log($"交互事件执行:{gameObject.name}");
}
}
/****************************************************
文件:ItemPickup.cs
作者:Edision
日期:#CreateTime#
功能:捡东西
*****************************************************/
using UnityEngine;
[RequireComponent(typeof(Interact))]
public class ItemPickup : MonoBehaviour
{
public string itemName;
public int amount;
public Interact pickupFromInteract;
private void Awake()
{
pickupFromInteract = GetComponent<Interact>();
}
private void OnEnable()
{
if (pickupFromInteract != null)
{
pickupFromInteract.GetInteract.HasInteracted += InteractPickup;
}
}
private void OnDisable()
{
if (pickupFromInteract != null)
{
pickupFromInteract.GetInteract.HasInteracted -= InteractPickup;
}
}
public void InteractPickup()
{
AddItem(pickupFromInteract.GetPlayer);
}
public void AddItem(Player player)
{
}
}