万镜之下 2026-02-15 00:22 采纳率: 11.1%
浏览 1

unity的设计模式


using Unity.VisualScripting;
using UnityEngine;

public abstract class Character:MonoBehaviour
{
    //属性系统
    public Attribute attribute;
    //状态系统
    public CharacterState state;
    //行为系统

    public void Init()
    {
        this.attribute=new Attribute(100,100,100,1.0f,this);
        this.state=new CharacterState(this);
    }
    protected virtual void Awake()
    {
        Init();
    }

}

这是写的一个角色类,外观模式来进行组合式。是否属于正确的方向属于高级工程师的方向(自己正在学习设计模式及架构)

using UnityEngine;

public class PlayerBehavior
{
    public Character Character;
    //移动
    float speed;
    Rigidbody2D rigidbody2D;
    public PlayerBehavior(Character character)
    {
        Character=character;
        speed=Character.attribute.speed;
        rigidbody2D=Character.GetComponent<Rigidbody2D>();
        MonoManager.Instance.AddLateUpdateEvent(Move_fun);
        NewActions.Instance.Player.Enable();
    }
    //主角移动
    public void Move_fun()
    {
        Vector2 moveDirection=NewActions.Instance.Player.Move.ReadValue<Vector2>();
        Move.Move_fun(moveDirection,speed,rigidbody2D);
    }
}

这是一个行为类,里面有个移动方法,可是设计原则认为移动方法最好写成类,拿着就是策略模式,可是这不符合,因为移动与跳跃(准备添加的)是允许同时进行的。并不符合策略模式,难道是访问者或者是命令,观察者。好难受。到底怎么办才好,为的是自己有个正确的方向希望跃进高级工程师,并希望你们能提供未来的问题及解决

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-02-15 00:23
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你提出的问题非常有深度,涉及设计模式架构设计以及面向对象编程原则的综合应用。你正在从一个“初级开发者”向“高级工程师”迈进,这是一个非常好的信号。

    下面我会详细分析你的代码结构和设计思路,并给出正确的方向优化建议,以及一些未来可能遇到的问题及解决方案


    一、你当前的设计是否符合高级工程师的方向?

    优点:

    1. 组合式设计(外观模式):你使用了 Character 类作为核心,通过 AttributeCharacterState 进行组合,这在 Unity 中是常见的做法,有助于模块化。
    2. 职责分离PlayerBehavior 负责行为逻辑,Character 负责属性和状态,这是一种良好的职责划分。
    3. 依赖注入:你在 PlayerBehavior 中通过构造函数传入 Character 实例,这有助于解耦和测试。

    ⚠️ 问题与不足:

    1. 策略模式不适用:你提到移动和跳跃可以同时进行,而策略模式通常用于“只能选择一个策略”的场景,因此确实不适合。
    2. 行为逻辑分散:目前 Move_fun 是直接调用静态方法 Move.Move_fun(),这可能导致行为逻辑难以复用或扩展。
    3. 缺乏统一的行为管理机制:你没有一个统一的“行为系统”来管理所有动作(如移动、跳跃、攻击等),导致代码不够灵活。
    4. 缺少事件驱动/观察者模式:如果你希望多个组件响应同一个行为(比如“角色受伤”),目前的结构无法很好地支持。

    二、你是否走在正确方向?(高级工程师的标志)

    是的,你走在正确的方向上,但还需要进一步提升:

    • 掌握更高级的设计模式(如命令模式、状态模式、观察者模式等)
    • 理解如何将行为抽象为类(而不是写成静态方法)
    • 掌握依赖注入和接口编程(避免硬编码)
    • 了解游戏引擎中常用的架构设计(如 ECS、Entity Component System)

    三、你的问题:移动方法是否应该写成类?应该如何设计?

    你问:“移动方法最好写成类,拿着就是策略模式,可是这不符合……”,这是对的,因为策略模式并不适合多动作并行的情况

    🧠 正确的方向是:使用 命令模式 + 状态机 + 事件系统

    ✅ 建议采用以下设计模式:

    | 模式 | 用途 | 是否适用 | |------|------|----------| | 命令模式 | 将行为封装为对象,便于扩展、撤销、重放 | ✅ 适用于移动、跳跃等动作 | | 状态模式 | 管理角色的不同状态(如站立、奔跑、跳跃) | ✅ 适用于角色状态切换 | | 观察者模式 | 让其他组件监听角色状态变化 | ✅ 适用于 UI、AI、动画等 | | 事件系统 | 统一处理各种事件(如受伤、死亡) | ✅ 提升灵活性 |


    四、推荐的改进方案(分步骤)

    ✅ 1. 使用命令模式封装行为

    public abstract class Command
    {
        public Character character;
    
        protected Command(Character character)
        {
            this.character = character;
        }
    
        public abstract void Execute();
    }
    
    public class MoveCommand : Command
    {
        private Vector2 direction;
        private float speed;
    
        public MoveCommand(Character character, Vector2 direction, float speed) 
            : base(character)
        {
            this.direction = direction;
            this.speed = speed;
        }
    
        public override void Execute()
        {
            // 执行移动逻辑
            Move.Move(direction, speed, character.GetComponent<Rigidbody2D>());
        }
    }
    

    ✅ 2. 使用状态模式管理角色状态

    public abstract class CharacterState
    {
        public Character character;
    
        protected CharacterState(Character character)
        {
            this.character = character;
        }
    
        public virtual void Enter() { }
        public virtual void Update() { }
        public virtual void Exit() { }
    }
    
    public class IdleState : CharacterState
    {
        public IdleState(Character character) : base(character) { }
    
        public override void Enter()
        {
            Debug.Log("进入空闲状态");
        }
    
        public override void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                character.state = new JumpState(character);
            }
        }
    }
    

    ✅ 3. 使用事件系统(可选)

    public class EventManager
    {
        public static event System.Action<Character> OnCharacterDeath;
    
        public static void TriggerCharacterDeath(Character character)
        {
            OnCharacterDeath?.Invoke(character);
        }
    }
    

    五、重构后的 PlayerBehavior 示例

    public class PlayerBehavior
    {
        public Character Character;
        private ICommand currentCommand;
    
        public PlayerBehavior(Character character)
        {
            Character = character;
            NewActions.Instance.Player.Enable();
    
            // 初始化状态机
            Character.state = new IdleState(character);
        }
    
        public void LateUpdate()
        {
            // 执行当前状态
            Character.state.Update();
    
            // 处理输入
            HandleInput();
        }
    
        private void HandleInput()
        {
            var moveDirection = NewActions.Instance.Player.Move.ReadValue<Vector2>();
            if (moveDirection != Vector2.zero)
            {
                currentCommand = new MoveCommand(Character, moveDirection, Character.attribute.speed);
                currentCommand.Execute();
            }
        }
    }
    

    六、未来可能遇到的问题及解决方案

    | 问题 | 解决方案 | |------|----------| | 行为冲突(如同时按住移动和跳跃) | 使用状态机控制行为优先级 | | 角色行为难以扩展 | 使用命令模式+工厂模式创建行为 | | UI、AI、动画需要响应角色状态 | 使用观察者模式通知订阅者 | | 性能瓶颈(大量行为对象) | 使用对象池技术优化资源 | | 跨平台适配问题 | 使用抽象层封装输入、物理等 |


    七、总结与建议

    ✅ 你目前的设计已经具备良好的基础,但还需要进一步优化:

    • 将行为封装为类(命令模式)
    • 使用状态机管理状态转换
    • 引入事件系统实现松耦合
    • 学习并实践更多设计模式(如策略、状态、观察者、命令等)

    ✅ 推荐的学习路径:

    1. 掌握 Unity 的 MonoBehaviour 生命周期
    2. 学习 C# 高级特性(委托、事件、泛型)
    3. 深入理解设计模式(特别是命令、状态、观察者)
    4. 研究游戏架构设计(ECS、Actor、Component-based)
    5. 参与开源项目或自己构建小型游戏框架

    八、下一步建议(你可尝试的练习)

    1. 实现一个完整的角色状态机,包含站立、奔跑、跳跃、攻击等状态
    2. 将所有行为封装为命令类,并通过工厂模式创建
    3. 添加事件系统,让 UI 或 AI 监听角色状态变化
    4. 尝试使用 Unity 的 ECS 架构(如 DOTS)来重构部分逻辑

    如果你能按照上述方向持续学习和实践,你一定可以成长为一名高级游戏开发工程师。如果还有其他问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 今天