文章目录
- 示例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)
————————————————
最后我们放松一下眼睛