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 自动释放限制

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

相关推荐
爱搞虚幻的阿恺5 天前
Niagara粒子系统-超炫酷的闪电特效(加餐 纸牌螺旋上升效果)
游戏·游戏引擎
_Li.5 天前
Simulink - 6DOF (Euler Angles)
人工智能·算法·机器学习·游戏引擎·cocos2d
weixin_424294675 天前
Unity 调用Steamworks API 的 SteamUserStats.RequestCurrentStats()报错
unity·游戏引擎·steamwork
HoFunGames5 天前
Unity小地图,Easy Minimap System MT-GPS插件
unity·游戏引擎
wy3258643646 天前
Unity 新输入系统InputSystem(基本操作)
unity·c#·游戏引擎
WarPigs6 天前
着色器multi_compile笔记
unity·着色器
ECHO飞跃 0126 天前
Unity2019 本地推理 通义千问0.5-1.5B微调导入
人工智能·深度学习·unity·llama
Unity游戏资源学习屋6 天前
【Unity UI资源包】GUI Pro - Casual Game 专为休闲手游打造的专业级UI资源包
ui·unity
冰凌糕6 天前
Unity3D Shader 顶点法线外扩实现描边效果
unity
星和月6 天前
Untiy使用说明
c#·游戏引擎