Unity 责任链模式(实例详解)


责任链模式(Chain of Responsibility)在Unity中可用于处理一系列可能的请求,通过创建一个对象链来传递这些请求,每个对象都有机会处理它。下面给出5个基于Unity环境下的责任链模式的代码示例:

示例1:游戏事件处理系统

// 基础事件处理器接口
public interface IGameEventHandler
{
    void HandleEvent(GameEvent gameEvent);
    IGameEventHandler NextHandler { get; set; }
}

// 具体事件处理器类
public class PlayerMoveEventHandler : IGameEventHandler
{
    public IGameEventHandler NextHandler { get; set; }

    public void HandleEvent(GameEvent gameEvent)
    {
        if (gameEvent is MoveEvent moveEvent && moveEvent.Target is Player)
        {
            // 处理玩家移动事件
            Debug.Log("Player moved.");
            if (NextHandler != null) NextHandler.HandleEvent(gameEvent); // 如果有下一个处理器则继续传递
        }
    }
}

public class EnemyMoveEventHandler : IGameEventHandler
{
    public IGameEventHandler NextHandler { get; set; }

    public void HandleEvent(GameEvent gameEvent)
    {
        if (gameEvent is MoveEvent moveEvent && moveEvent.Target is Enemy)
        {
            // 处理敌人移动事件
            Debug.Log("Enemy moved.");
            if (NextHandler != null) NextHandler.HandleEvent(gameEvent); // 如果有下一个处理器则继续传递
        }
    }
}

// 构建和使用链
public class GameEventManager
{
    private IGameEventHandler _headHandler;

    public GameEventManager()
    {
        var playerMoveHandler = new PlayerMoveEventHandler();
        var enemyMoveHandler = new EnemyMoveEventHandler();
        playerMoveHandler.NextHandler = enemyMoveHandler;
        _headHandler = playerMoveHandler;
    }

    public void DispatchEvent(GameEvent gameEvent)
    {
        _headHandler.HandleEvent(gameEvent);
    }
}

// 游戏事件定义
public abstract class GameEvent { }
public class MoveEvent : GameEvent
{
    public GameObject Target { get; set; }
    // 其他相关属性...
}

// 使用示例
var manager = new GameEventManager();
var moveEvent = new MoveEvent() { Target = /* 某个游戏对象 */ };
manager.DispatchEvent(moveEvent);

示例2:UI消息处理链

// UI消息处理器接口
public interface IMessageHandler
{
    bool CanHandleMessage(UIEvent message);
    void HandleMessage(UIEvent message);
    IMessageHandler NextHandler { get; set; }
}

// 具体消息处理器类
public class ButtonClickHandler : IMessageHandler
{
    public IMessageHandler NextHandler { get; set; }

    public bool CanHandleMessage(UIEvent message)
    {
        return message is ButtonClickEvent;
    }

    public void HandleMessage(UIEvent message)
    {
        if (message is ButtonClickEvent clickEvent)
        {
            Debug.Log($"Button clicked: {clickEvent.ButtonName}");
            if (NextHandler != null && !NextHandler.CanHandleMessage(message))
            {
                NextHandler.HandleMessage(message);
            }
        }
    }
}

public class TextInputHandler : IMessageHandler
{
    // 同样的结构,处理文本输入事件
    // ...
}

// 构建和使用链
public class UIManager
{
    private IMessageHandler _headHandler;

    public UIManager()
    {
        var buttonHandler = new ButtonClickHandler();
        var textInputHandler = new TextInputHandler();
        buttonHandler.NextHandler = textInputHandler;
        _headHandler = buttonHandler;
    }

    public void SendMessage(UIEvent message)
    {
        if (_headHandler.CanHandleMessage(message))
        {
            _headHandler.HandleMessage(message);
        }
        else
        {
            Debug.LogWarning("No handler for this message.");
        }
    }
}

// UI事件定义
public abstract class UIEvent {}
public class ButtonClickEvent : UIEvent
{
    public string ButtonName { get; set; }
}
public class TextInputEvent : UIEvent
{
    public string Text { get; set; }
    // ...
}

// 使用示例
var uiManager = new UIManager();
var clickEvent = new ButtonClickEvent() { ButtonName = "Start" };
uiManager.SendMessage(clickEvent);

示例3:游戏内物理碰撞响应链

// 碰撞处理器接口
public interface ICollisionHandler
{
    bool ShouldHandleCollision(Collision collision);
    void OnCollisionEnter(Collision collision);
    ICollisionHandler NextHandler { get; set; }
}

// 具体碰撞处理器类
public class HealthPickupCollisionHandler : ICollisionHandler
{
    public ICollisionHandler NextHandler { get; set; }

    public bool ShouldHandleCollision(Collision collision)
    {
        return collision.gameObject.CompareTag("Player") && collision.gameObject.TryGetComponent(out HealthComponent health);
    }

    public void OnCollisionEnter(Collision collision)
    {
        if (ShouldHandleCollision(collision))
        {
            var health = collision.gameObject.GetComponent<HealthComponent>();
            health.Restore(10); // 恢复生命值
            if (NextHandler != null)
            {
                NextHandler.OnCollisionEnter(collision);
            }
        }
    }
}

public class ScorePickupCollisionHandler : ICollisionHandler
{
    // 类似地处理得分拾取事件
    // ...
}

// 构建和使用链
public class CollisionManager : MonoBehaviour
{
    public ICollisionHandler HeadHandler;

    void OnCollisionEnter(Collision collision)
    {
        HeadHandler?.OnCollisionEnter(collision);
    }
}

// 使用示例
public class GameManager : MonoBehaviour
{
    void Start()
    {
        var healthPickupHandler = new HealthPickupCollisionHandler();
        var scorePickupHandler = new ScorePickupCollisionHandler();
        healthPickupHandler.NextHandler = scorePickupHandler;
        
        GetComponent<CollisionManager>().HeadHandler = healthPickupHandler;
    }
}

示例4:AI决策链

// AI决策器接口
public interface IAIDecisionMaker
{
    bool Decide(GameObject agent, List<WorldState> worldStates);
    IAIDecisionMaker NextDecisionMaker { get; set; }
}

// 具体决策器类
public class FleeFromDangerDecisionMaker : IAIDecisionMaker
{
    public IAIDecisionMaker NextDecisionMaker { get; set; }

    public bool Decide(GameObject agent, List<WorldState> worldStates)
    {
        var inDanger = worldStates.Any(s => s.IsDangerNearby);
        if (inDanger)
        {
            // 逃离危险逻辑
            Debug.Log($"{agent.name} flees from danger.");
            return true; // 已作出决定,不需后续决策器处理
        }
        else if (NextDecisionMaker != null)
        {
            return NextDecisionMaker.Decide(agent, worldStates);
        }
        return false;
    }
}

public class FindResourceDecisionMaker : IAIDecisionMaker
{
    // 寻找资源的逻辑
    // ...
}

// 构建和使用链
public class AIThinkingManager
{
    public IAIDecisionMaker DecisionChain;

    public void MakeDecision(GameObject agent, List<WorldState> worldStates)
    {
        if (DecisionChain.Decide(agent, worldStates))
        {
            // 执行相应的动作
        }
    }
}

// 使用示例
public class AIController : MonoBehaviour
{
    void Start()
    {
        var fleeDecisionMaker = new FleeFromDangerDecisionMaker();
        var findResourceDecisionMaker = new FindResourceDecisionMaker();
        fleeDecisionMaker.NextDecisionMaker = findResourceDecisionMaker;
        
        var aiThinkingManager = new AIThinkingManager();
        aiThinkingManager.DecisionChain = fleeDecisionMaker;
    }
}

// 世界状态定义
public class WorldState { ... }

示例5:场景切换责任链

// 场景切换处理器接口
public interface ISceneTransitionHandler
{
    bool CanTransitionTo(Scene scene);
    void TransitionTo(Scene scene);
    ISceneTransitionHandler NextHandler { get; set; }
}

// 具体场景切换处理器类
public class LoadMainMenuTransitionHandler : ISceneTransitionHandler
{
    public ISceneTransitionHandler NextHandler { get; set; }

    public bool CanTransitionTo(Scene scene)
    {
        return scene.name == "MainMenu";
    }

    public void TransitionTo(Scene scene)
    {
        SceneManager.LoadScene(scene.name);
        if (NextHandler != null && !NextHandler.CanTransitionTo(scene))
        {
            NextHandler.TransitionTo(scene);
        }
    }
}

public class QuitApplicationTransitionHandler : ISceneTransitionHandler
{
    // 处理退出应用的逻辑
    // ...
}

// 构建和使用链
public class SceneTransitionManager
{
    private ISceneTransitionHandler _headHandler;

    public SceneTransitionManager(ISceneTransitionHandler firstHandler)
    {
        _headHandler = firstHandler;
    }

    public void TryTransitionTo(Scene scene)
    {
        _headHandler.TransitionTo(scene);
    }
}

// 使用示例
public class GameManager : MonoBehaviour
{
    void Start()
    {
        var mainMenuHandler = new LoadMainMenuTransitionHandler();
        var quitHandler = new QuitApplicationTransitionHandler();
        mainMenuHandler.NextHandler = quitHandler;

        var transitionManager = new SceneTransitionManager(mainMenuHandler);
        // 当需要切换到特定场景时调用
public void OnMainMenuButtonClicked()
{
    var mainMenuScene = SceneManager.GetSceneByName("MainMenu");
    transitionManager.TryTransitionTo(mainMenuScene);
}

public void OnQuitButtonClicked()
{
    var quitScene = new Scene { name = "Quit" }; // 假设有一个表示退出的场景
    transitionManager.TryTransitionTo(quitScene);
}

TryTransitionTo 方法

```csharp
public void OnMainMenuButtonClicked()
{
    var mainMenuScene = SceneManager.GetSceneByName("MainMenu");
    transitionManager.TryTransitionTo(mainMenuScene);
}

public void OnQuitButtonClicked()
{
    var quitScene = new Scene { name = "Quit" }; // 假设有一个表示退出的场景
    transitionManager.TryTransitionTo(quitScene);
}

示例6:输入命令处理链

// 输入命令处理器接口
public interface ICommandHandler
{
    bool CanHandleCommand(string command);
    void HandleCommand(string command);
    ICommandHandler NextHandler { get; set; }
}

// 具体命令处理器类
public class MovePlayerCommandHandler : ICommandHandler
{
    public ICommandHandler NextHandler { get; set; }

    public bool CanHandleCommand(string command)
    {
        return command.StartsWith("move player ");
    }

    public void HandleCommand(string command)
    {
        var direction = command.Substring("move player ".Length);
        // 根据direction移动玩家
        Debug.Log($"Player moved to {direction}.");
        if (NextHandler != null && !NextHandler.CanHandleCommand(command))
        {
            NextHandler.HandleCommand(command);
        }
    }
}

public class OpenDoorCommandHandler : ICommandHandler
{
    // 处理打开门的命令逻辑
    // ...
}

// 构建和使用链
public class CommandDispatcher
{
    private ICommandHandler _headHandler;

    public CommandDispatcher(ICommandHandler firstHandler)
    {
        _headHandler = firstHandler;
    }

    public void DispatchCommand(string command)
    {
        _headHandler.HandleCommand(command);
    }
}

// 使用示例
public class GameInputController : MonoBehaviour
{
    private CommandDispatcher _dispatcher;

    void Start()
    {
        var movePlayerHandler = new MovePlayerCommandHandler();
        var openDoorHandler = new OpenDoorCommandHandler();
        movePlayerHandler.NextHandler = openDoorHandler;

        _dispatcher = new CommandDispatcher(movePlayerHandler);
    }

    public void OnUserInput(string command)
    {
        _dispatcher.DispatchCommand(command);
    }
}

// 使用示例
_gameInputController.OnUserInput("move player north"); // 移动玩家到北方
_gameInputController.OnUserInput("open door west"); // 打开西边的门

以上六个示例展示了责任链模式在Unity中的应用,通过构建一系列处理器对象并按照特定条件传递请求或事件,使得每个处理器都有机会执行相应的操作,并且可以根据需要灵活地添加、删除或修改链中的处理器。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《Unity 3D ShaderLab开发实战详解》是一本介绍Unity 3D的ShaderLab开发实战教程的PDF电子书。ShaderLab是Unity中用于创建和编辑着色器的工具,通过编写自定义着色器可以实现各种特效和材质效果,提升游戏的视觉效果。 这本书的目的是帮助读者掌握ShaderLab的基本概念和技巧,并通过实例演示来深入了解如何创建高质量的着色器。书中的内容涵盖了ShaderLab开发的各个方面,从基础的着色器语法开始讲解,逐步介绍如何创建材质、纹理、光照效果、透明效果、反射效果等。书中还详细讲解了Unity的着色器渲染管线和渲染流程,帮助读者理解着色器是如何与场景、摄像机、光源等组件进行交互和渲染的。 在书中,作者通过大量的示例代码和图文说明,帮助读者理解和掌握ShaderLab的使用方法和技巧。同时,书中还提供了一些实用的开发技巧和调试技巧,帮助读者解决在实际开发中可能遇到的问题。 《Unity 3D ShaderLab开发实战详解》适合有一定Unity开发经验的读者阅读,对于对着色器开发感兴趣的游戏开发者来说,这本书是一个很好的学习资源。通过学习这本书,读者可以深入了解Unity的着色器开发技术,掌握创建高质量视觉效果的方法,提升游戏的质量和表现力。 ### 回答2: 《Unity 3D ShaderLab开发实战详解》是一本介绍Unity中ShaderLab开发的实战指南。Shader是用来描述渲染效果的程序,而ShaderLab则是Unity的内建语言,用于编写和调试Shader。 该书包含了ShaderLab开发的基础知识和高级技巧。首先,它涵盖了ShaderLab语言的基本语法和结构,包括材质和渲染管线的理解,以及Shader中常用的算法和函数。读者可以通过逐步学习这些内容来掌握ShaderLab的基本编写和调试技巧。 书中还介绍了一些常见的渲染效果,如水面、光照、阴影等。读者可以通过学习这些案例来了解如何在实际项目中应用ShaderLab开发出高质量的渲染效果,并通过对案例代码的分析和修改来加深对ShaderLab的理解。 此外,该书还介绍了一些高级的ShaderLab开发技术,如使用GPU编程语言HLSL优化Shader性能、通过贴图及纹理坐标实现特定效果等。这些技术可以帮助读者深入理解ShaderLab的内部原理,并运用到实际项目中。 总的来说,《Unity 3D ShaderLab开发实战详解》提供了一个系统和全面的学习ShaderLab开发的平台。通过阅读本书,读者可以逐步掌握ShaderLab语言的基础知识和技巧,并学会如何应用它来实现各种炫酷的渲染效果。无论是初学者还是有一定经验的开发者,都可以从中获得实践和提高的机会。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值