Unity代理模式

在游戏开发中,技能系统几乎是绕不开的核心模块

一开始我们可能只关心技能能不能放出来,但随着功能增加,问题也会接踵而至:

冷却时间、耗蓝、公共CD、网络校验、AI复用......

如果把这些逻辑全部堆在技能本体或者玩家脚本里,代码很快就会变得又长又乱,后期几乎无法维护。

本篇文章将通过一个简单但非常实用的 Unity 示例,演示如何使用**代理模式(Proxy Pattern)**来解耦技能本体与技能规则,让玩家只关心"释放技能",而不必关心技能背后复杂的限制逻辑。

1.技能接口定义

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public interface ISkill
{
    void Cast();
}

2.具体的技能

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 火球技能
public class FireBallSkill : ISkill
{
    public void Cast()
    {
        Debug.Log("释放火球术!");
    }
}

// 分身术技能
public class CloneSkill : ISkill
{
    public void Cast()
    {
        Debug.Log("释放分身术!");
    }
}

// 治疗技能
public class HealSkill : ISkill
{
    public void Cast()
    {
        Debug.Log("释放治疗术!");
    }
}

3.技能释放代理

玩家只需要调用代理中提供的Cast()方法,其他的玩家都不用关心。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SkillCooldownProxy : ISkill
{
    private ISkill realSkill;

    private float cooldownTime = 3f;   // 冷却时长
    private float lastCastTime = -999f;//防止刚进入游戏无法释放技能

    public SkillCooldownProxy(ISkill skill)
    {
        realSkill = skill;
    }

    public void Cast()
    {
        if (Time.time - lastCastTime < cooldownTime)
        {
            Debug.Log("技能冷却中...");
            return;
        }

        lastCastTime = Time.time;

        realSkill.Cast();

        Debug.Log("技能释放");
    }
}

4.玩家调用

玩家只知道要释放技能,释放技能的冷却或者耗蓝这些他都不用关心,比如后面要制作AI或者敌人的时候就可以直接将代理进行组合排列。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerInput : MonoBehaviour
{
    private ISkill fireBall;
    private ISkill FenshenShu;

    void Start()
    {
        // 注意这里:玩家拿到的是"代理"
        fireBall = new SkillCooldownProxy(new FireBallSkill());
        FenshenShu = new SkillCooldownProxy(new CloneSkill());
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            fireBall.Cast();
        }
        if (Input.GetKeyDown(KeyCode.E))
        {
            FenshenShu.Cast();
        }
    }
}

5.运行结果

将PlayerInput加到场景中的一个空对象上,然后运行游戏按下Q键,发现成功打印了火球释放,连续按下会提示技能正在冷却。

6.总结

技能本体只负责"技能做什么",

代理类负责"技能能不能做"。

当后期需求增加时,比如:

  • 技能耗蓝

  • 公共 CD

  • 网络校验

  • AI 自动释放限制

我们只需要新增对应的代理,而无需修改原有技能代码,甚至可以像搭积木一样对代理进行组合。

相关推荐
折哥的程序人生 · 物流技术专研17 小时前
Java 23 种设计模式:从踩坑到精通 | 番外:代理 vs 装饰器 —— Spring AOP 到底用了哪个?
java·代理模式·装饰器模式·java面试·java设计模式·springaop·从踩坑到精通
玖玥拾2 天前
C# 语言进阶(十四)Unity UI界面开发 + 网络消息联动
服务器·开发语言·网络·ui·unity·c#·游戏引擎
野区捕龙为宠2 天前
Unity 持久化数据
unity·游戏引擎·lucene
初学者,亦行者2 天前
算法设计与分析3:贪心法 - 求解最短路径问题(TSP)
算法·代理模式
郝学胜-神的一滴2 天前
[简化版 GAMES 101] 计算机图形学 17:纹理技术从基础原理到多场景实战应用
c++·unity·游戏引擎·图形渲染·three.js·opengl·unreal
_ZHOURUI_H_2 天前
MyFramework: 同样是 Unity 游戏开发框架,和 HTFramework 的设计取向有什么不同?(下)
unity·游戏引擎·游戏开发·游戏ui·手游开发
小贺儿开发4 天前
Unity 知识库智能问答系统(RAG)
人工智能·unity·ai·大模型·智能问答·知识库·互动
丁小未4 天前
基于MVVM框架的XUUI 扩展的UI管理系统教程
unity·mvvm·ui框架·xuui·ui管理器
丁小未5 天前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
丁小未5 天前
基于MVVM框架的XUUI MoreComplex案例
unity·c#