【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();
        }
    }
}
相关推荐
X_StarX5 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生
霸王•吕布9 小时前
游戏引擎中顶点着色&像素着色
游戏引擎·顶点着色器·像素着色器·顶点颜色·顶点uv·顶点法向
Thomas_YXQ12 小时前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
徐子竣19 小时前
[学习记录]Unity-Shader-几何着色器
unity·游戏引擎·着色器
EQ-雪梨蛋花汤1 天前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
与火星的孩子对话1 天前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
幻世界1 天前
【Unity智能模型系列】Unity + MediaPipe + Sentis + ArcFace模型:构建高效人脸识别比对系统
unity·游戏引擎
漫游者Nova2 天前
虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕
ue5·游戏引擎·虚幻·游戏开发完整教程·恐怖游戏开发
死也不注释2 天前
【Unity 编辑器工具开发:GUILayout 与 EditorGUILayout 对比分析】
unity·编辑器·游戏引擎
小赖同学啊2 天前
物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
物联网·unity·游戏引擎