【Unity】 GamePlay开发:通用的检查点/成就/条件触发系统

特别适用于各种解谜关卡 , 成就系统,任务系统 ,的 通用事件处理

CheckPointHandler.cs随便挂在场景中的某个物体上 (单例模式,场景中只要有一个)


1) How To Use


CheckPoint Events 是一个列表,每个元素是一个组合事件,每个组合事件包含了一个条件列表和相应触发的UnityEvent。
Event Conditions是条件列表,每个元素是一个条件信息,比如上图表示aaa和bbb分别被触发3次以上和4次以上时触发该unity event: 关闭Book和TestCheckPoint

每个CheckPoint有一个id,并且有一个值记录该checkpoint被触发了多少次,

多个CheckPoint可以共用同一个id,上面介绍的组合事件中 条件的触发次数为所有相同id的checkpoint的触发次数之和。

可以选择能否由碰撞或者点击触发,Target为碰撞触发的tag条件(必须该tag的物体碰撞到才会触发)

超过最大触发次数之后,该checkpoint将不会再触发。(并不是id的触发次数上限,而是单个checkpoint的)


2) Code

CheckPoint.cs:

csharp 复制代码
using UnityEngine;

[RequireComponent(typeof(Collider2D))]
public class CheckPoint : MonoBehaviour
{
    public string id;
    public int triggerCount;  //触发了多少次
    public bool isCollisionTrigger; //由碰撞事件触发
    public bool isClickTrigger; //由点击事件触发
    public string targetTag = "Player";    //能触发此checkpoint的tag

    public int maxTriggerCount = 1;	 //最大触发次数

    public string Trigger()
    {
        if(triggerCount >= maxTriggerCount) return "";
        triggerCount++;
        CheckPointHandler.Instance.UpdateTrigger(id, triggerCount);
        return id;
    }
    
    private void OnMouseDown() {
        if(isClickTrigger)
            Trigger();
    }
    private void OnTriggerEnter2D(Collider2D other) {
        if(isCollisionTrigger && other.tag == targetTag)
            Trigger();
    }
}

CheckPointHandler.cs

csharp 复制代码
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

[Serializable]
public class EventCondition
{
    public string id;
    public int count;
}

[Serializable]
public class CheckPointEvent{
    public List<EventCondition> eventConditions;
    public UnityEvent unityEvent;
}

public class CheckPointHandler : MonoSingleton<CheckPointHandler>
{
    public List<CheckPointEvent> checkPointEvents;  //组合事件
    
    public static Dictionary<string, int> triggerHistory = new Dictionary<string, int>();


    public void UpdateTrigger(string id, int Count)
    {
        triggerHistory[id] = Count;
        Debug.Log( ($"[{0}]= {1}",id, Count));
        CheckEvent();
    }
    public void CheckEvent()
    {
        foreach(var e in checkPointEvents)
        {
            bool flag = true;
            foreach(var condition in e.eventConditions)
            {
                if(!triggerHistory.ContainsKey(condition.id) || triggerHistory[condition.id] < condition.count) //如果没触发够指定次数,不构成条件
                {
                    flag = false;
                    break;
                }
            }
            if(flag)
                e.unityEvent.Invoke();
        }
    }
}
相关推荐
松树戈8 小时前
godot项目【宝石捕手】04~添加音效、记分
游戏引擎·godot
LONGZETECH11 小时前
无人机实训高成本痛点解法:虚拟仿真实现 70% 耗材损耗下降
大数据·算法·unity·架构·无人机
五仁烧饼1 天前
Unity Addressables 静默资源策略
游戏·unity·addressables
ue星空1 天前
【Godot】更换编辑器外观主题
编辑器·游戏引擎·godot
fanfan_hongyun1 天前
unity 与cad 坐标系映射
unity·游戏引擎
神码编程1 天前
【Unity】 HTFramework框架(七十)MultiChoiceDropdown可多选的下拉菜单
unity·游戏引擎·ugui·dropdown·下拉菜单
ue星空2 天前
Godot 2D像素游戏移动抖动、模糊问题解决方案
游戏·游戏引擎·godot
淡海水2 天前
15-07-YooAsset面试篇-Unity性能优化与内存管理
java·unity·面试·性能优化·c#·游戏引擎
ue星空2 天前
【Godot】AudioStreamPlayer2D音频播放
游戏引擎·音视频·godot
zhchyun20083 天前
# 【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(03)
unity