本文介绍: 在Unity中使用命令模式(Command Pattern)是一种常见的设计模式,用于实现对游戏或应用中一系列动作的记录、撤销和重做操作。接口以确保它们都能执行和撤销操作。在实际项目中,命令管理器会存储这些命令并根据需要执行撤销/重做功能。这些示例展示了如何定义不同的命令,并且每个命令都实现了。
在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经典脚本(41-50)
————————————————
最后我们放松一下眼睛
原文地址:https://blog.csdn.net/qqrrjj2011/article/details/135884807
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_63939.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。