Unity 命令模式(实例详解)

文章目录

      • 示例1:基础命令类结构
      • 示例2:旋转对象命令
      • 示例3:增加道具命令
      • 示例4:切换场景命令
      • 示例5:播放音效命令

在Unity中使用命令模式(Command Pattern)是一种常见的设计模式,用于实现对游戏或应用中一系列动作的记录、撤销和重做操作。下面通过五个简化的C#代码示例来详细说明命令模式在Unity中的应用:

示例1:基础命令类结构

// 基础命令接口
public interface ICommand
{void Execute();void Undo();
}// 具体命令类 - 例如移动角色命令
public class MoveCharacterCommand : ICommand
{private readonly Transform _character;private Vector3 _previousPosition;public MoveCharacterCommand(Transform character, Vector3 newPosition){_character = character;_previousPosition = character.position;}public void Execute(){_character.position = newPosition; // 假设newPosition是目标位置}public void Undo(){_character.position = _previousPosition;}
}// 命令管理器类,负责执行和回滚命令
public class CommandManager
{private List<ICommand> _commandHistory = new List<ICommand>();public void ExecuteCommand(ICommand command){command.Execute();_commandHistory.Add(command);}public void UndoLastCommand(){if (_commandHistory.Count > 0){var lastCommand = _commandHistory[_commandHistory.Count - 1];lastCommand.Undo();_commandHistory.RemoveAt(_commandHistory.Count - 1);}}
}

示例2:旋转对象命令

public class RotateObjectCommand : ICommand
{private readonly Transform _target;private Quaternion _originalRotation;public RotateObjectCommand(Transform target, Quaternion newRotation){_target = target;_originalRotation = target.rotation;}public void Execute(){_target.rotation = newRotation;}public void Undo(){_target.rotation = _originalRotation;}
}// 使用:
var rotateCmd = new RotateObjectCommand(someGameObject.transform, Quaternion.Euler(0, 90, 0));
commandManager.ExecuteCommand(rotateCmd);

示例3:增加道具命令

public class AddInventoryItemCommand : ICommand
{private readonly PlayerInventory _inventory;private readonly Item _itemToAdd;private bool _wasAdded;public AddInventoryItemCommand(PlayerInventory inventory, Item item){_inventory = inventory;_itemToAdd = item;}public void Execute(){_wasAdded = _inventory.AddItem(_itemToAdd);}public void Undo(){if (_wasAdded){_inventory.RemoveItem(_itemToAdd);}}
}// 使用:
var addItemCmd = new AddInventoryItemCommand(player.Inventory, newItem);
commandManager.ExecuteCommand(addItemCmd);

示例4:切换场景命令

public class ChangeSceneCommand : ICommand
{private readonly string _sceneName;private readonly Scene _previousScene;public ChangeSceneCommand(Scene currentScene, string newSceneName){_sceneName = newSceneName;_previousScene = currentScene;}public void Execute(){SceneManager.LoadScene(_sceneName);}public void Undo(){SceneManager.LoadScene(_previousScene.name);}
}// 使用(假设有一个SceneManager实例提供加载场景的方法)
var changeSceneCmd = new ChangeSceneCommand(SceneManager.GetActiveScene(), "NextScene");
commandManager.ExecuteCommand(changeSceneCmd);

示例5:播放音效命令

public class PlaySoundCommand : ICommand
{private readonly AudioSource _audioSource;private AudioClip _previousClip;private float _previousTime;public PlaySoundCommand(AudioSource audioSource, AudioClip clipToPlay){_audioSource = audioSource;if (_audioSource.isPlaying){_previousClip = _audioSource.clip;_previousTime = _audioSource.time;}}public void Execute(){_audioSource.clip = clipToPlay;_audioSource.Play();}public void Undo(){if (_previousClip != null){_audioSource.clip = _previousClip;_audioSource.time = _previousTime;if (_audioSource.isPlaying){_audioSource.Pause();}}}
}// 使用:
var playSoundCmd = new PlaySoundCommand(someAudioSource, newSoundClip);
commandManager.ExecuteCommand(playSoundCmd);

这些示例展示了如何定义不同的命令,并且每个命令都实现了ICommand接口以确保它们都能执行和撤销操作。在实际项目中,命令管理器会存储这些命令并根据需要执行撤销/重做功能。

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Python中的集合是什么

目录 创建集合 集合的特性 集合的基本操作 集合的运算 集合的遍历和判断元素是否存在 总结 在Python中&#xff0c;集合&#xff08;Set&#xff09;是一个内置的数据类型&#xff0c;用于存储不重复的元素集合。集合的特点是元素是无序的&#xff0c;且每个元素是唯一的…

C语言-算法-背包

[USACO07DEC] Charm Bracelet S&#xff08;01背包&#xff09; 题目描述 Bessie has gone to the mall’s jewelry store and spies a charm bracelet. Of course, she’d like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charms. E…

apt-mark详解

文章目录 1、简介2、apt-mark auto packagename3、apt-mark manual4、apt-mark hold5、apt-mark unhold6、apt-mark showauto7、apt-mark showmanual8、apt-mark showhold 1、简介 apt-mark常用于标记一个包是否是自动安装的。 2、apt-mark auto packagename 标记一个包为自…

ssh异常报错:Did not receive identification string from

一、问题描述 某次外出在异地工作场所xshell炼乳远程服务器时&#xff0c;报错&#xff1a;Connection closed by foreign host. D&#xff0c;服务器查看secure日志或sshd服务状态会显示&#xff1a;id not receive identification string from client_ip; 二、分析处理 1&a…

多表查询,

1&#xff0c;多表查询 实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系&#xff0c;接下来我们将在单表的基础上&#xff0c;一起学习多表…

如何在前端项目里接入Sentry监控系统并通过企业微信通知

能不能让用户录个屏过来呀&#xff1f; 用户使用的是什么机型的手机&#xff1f; 用户使用的什么浏览器呀&#xff1f; 用户的网络是什么情况&#xff1f; … … 线上出现问题时&#xff0c;技术部和业务部同学之间的对话诸如此类…业务同学也很栓Q呀&#xff0c;硬着头皮去问客…

element-UI上传文件后valid提示不消失

问题描述&#xff1a;上传文件完成后&#xff0c;必填信息提示不消失 解决方法&#xff1a;在<el-form-item>标签添加show-message属性&#xff0c;字段为空时才显示提示信息 <el-form-item :prop"fileList" :show-message"!form.fileList || !form.f…

OPEN NT 4.5 编译方法和源代码下载

OPEN NT 4.5&#xff08;源代码编译方法&#xff09; 编译Windows NT 4.0到操作系统的详细方法 OPEN 4.5 ​​​​​​下载 &#xff1a;https://download.csdn.net/download/MYMOTOE6/88786570 ISO https://download.csdn.net/download/MYMOTOE6/88786572 OPEN NT 4.5&#…

LeetCode:1701. 平均等待时间(Java 模拟)

目录 1701. 平均等待时间 题目描述&#xff1a; 实现代码与解析&#xff1a; 简单模拟 原理思路&#xff1a; 1701. 平均等待时间 题目描述&#xff1a; 有一个餐厅&#xff0c;只有一位厨师。你有一个顾客数组 customers &#xff0c;其中 customers[i] [arrivali, time…

为什么网页打开慢?是服务器的问题吗?

当我们遇到网页加载缓慢时&#xff0c;首先想到的可能是服务器的问题。的确&#xff0c;服务器是影响网页加载速度的一个重要因素。然而&#xff0c;这并非是唯一的原因。实际上&#xff0c;网页加载速度受多种因素影响&#xff0c;包括但不限于服务器、网络带宽、DNS解析时间、…

c# cad2016选择封闭多段线获取多段线面积

在C#中&#xff0c;如果你想要通过AutoCAD .NET API来选择封闭多段线内部的其他闭合多段线并计算它们各自的面积&#xff0c;可以遵循以下基本步骤&#xff1a; 1、加载AutoCAD库&#xff1a; 确保你的C#项目引用了Autodesk.AutoCAD.Interop和Autodesk.AutoCAD.Interop.Common…

短视频批量抽帧怎么做

随着短视频的流行&#xff0c;越来越多的创作者需要处理大量的视频素材。其中&#xff0c;批量抽帧是一项常见的需求&#xff0c;它可以帮助我们快速提取视频中的关键帧&#xff0c;以便进行后续的处理或分析。那么&#xff0c;如何高效地进行短视频批量抽帧呢&#xff1f;接下…

微信开发者工具 git 拉取 failed invalid authentication scheme

微信开发者工具 git 拉取 failed invalid authentication scheme 拉取代码时报错,无效身份认证 解决方案: 1.检查git地址是否正常 2.检查git用户名密码是否正确

什么工具能将视频转成gif?分享一个在线制作gif网站

Gif动图看起来效果非常的炫酷&#xff0c;也很复杂。这种gif动图制作起来是不是也很麻烦呢&#xff1f;其实制作gif动画的方法非常的简单&#xff0c;不用下载软件&#xff0c;小白也能操作。只需要使用在线制作gif&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&…

代码随想录算法训练营第十六天 |104.二叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数(待补充)

104.二叉树的最大深度 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长…

《30天自制操作系统》 第一周(D1-D7) 笔记

前言&#xff1a;这是我2023年5月份做的一个小项目&#xff0c;最终是完成了整个OS。笔记的话&#xff0c;只记录了第一周。想完善&#xff0c;却扔在草稿箱里许久。最终决定&#xff0c;还是发出来存个档吧。 一、汇编语言 基础指令 MOV: move赋值&#xff0c;数据传送指令…

【传记】-综述

写在前面 “我就是想告诉你们&#xff0c; 别废了自己在部队的日子&#xff0c;做人要有目标感。” “别混日子了&#xff0c;小心日子把你们给混了。”—— 老马 影视来源于生活&#xff0c;借用《士兵突击》中老马的话开篇&#xff0c;回到现实&#xff0c;我们也确实需要时时…

C语言常见面试题:什么是内存管理,C语言中如何进行内存管理?

内存管理是计算机科学中的一个重要概念&#xff0c;它涉及到如何有效地分配、使用和释放计算机内存。内存管理是操作系统和编程语言实现中的一项关键任务&#xff0c;它确保了程序能够安全、有效地运行。 在C语言中&#xff0c;内存管理主要通过以下方式进行&#xff1a; 静态…

提升养殖场效益,从饲料粉碎机开始

为了提高养殖效益&#xff0c;养殖户可以从很多方面着手&#xff0c;其中饲料成本是一个重要的因素。为了降低饲料成本&#xff0c;养殖户可以考虑从饲料粉碎环节入手。通过购买和采用高效、低成本的饲料粉碎机&#xff0c;养殖户可以更好地控制饲料成本&#xff0c;提高饲料的…

互动直播项目 梳理 自定义视频帧控件 BitmapControl

目录 一、自定义控件 lib静态库引用 1、控件源文件位置 2、ui_kit 静态lib库项目