【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();
        }
    }
}
相关推荐
KhalilRuan2 小时前
Unity性能优化
unity·性能优化·游戏引擎
ellis19703 小时前
u3d IMGUI[二] 编辑器扩展
unity
五仁烧饼14 小时前
Unity性能优化系列内存篇 - 移动端内存优化
unity·性能优化·游戏引擎
WiChP2 天前
【V0.1B15】从零开始的2D游戏引擎开发之路
游戏引擎
zhchyun20083 天前
# 【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(06)
ui·unity·游戏引擎
Behaviour4 天前
Unity游戏HybridCLR 热更新接入实战
游戏·unity·游戏引擎
LONGZETECH4 天前
新能源汽车动力电池实训教学痛点与虚拟仿真技术解决方案
c语言·3d·unity·架构·汽车·汽车教学软件
王维志4 天前
UiSplineRenderer
unity·游戏引擎
k4m7v2pz4 天前
Godot 4 仿 agar.io:相机缩放被 max_zoom 卡死,窗口越大球越小的根因与修复
游戏引擎·godot·相机·缩放·clamp·camera2d
FairGuard手游加固4 天前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c