事件系统记录--用于交互

/****************************************************
    文件: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)
    {

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值