作为Unity3D的初学者,在目前学习开发中遇到一个困扰一周的问题。
目前要实现这样一个功能:对物体输入一连串的指令来控制物体移动,物体会按照指令依次执行下去,但是目前想实现一个循环和判断指令,就类似于while和if语句。
没想到一个比较好的处理方法,求指教!
Unity3D通过指令控制角色
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- qq_36529290 2019-01-25 19:12关注
使用命令模式 把命令封成对象 然后不管用Update还是协程 都行
也可以将行为都做成一个协程下面结构可以参考一下
public class PlayQueuedSystem { static Dictionary<CoroutineQueued, PlayQueuedSystem> coroutineQueueds; /// <summary> /// 协程队列组 /// </summary> public static Dictionary<CoroutineQueued, PlayQueuedSystem> CoroutineQueueds { get { if (coroutineQueueds == null) coroutineQueueds = new Dictionary<CoroutineQueued, PlayQueuedSystem>(); return coroutineQueueds; } } /// <summary> /// 所有者 /// </summary> MonoBehaviour sender; public Queue<PlayQueueItem> PlayQueue { get; private set; } /// <summary> /// 是否正在运行 /// </summary> public bool Runing { get { return runing; } } private bool runing = false; public PlayQueuedSystem(MonoBehaviour sender, CoroutineQueued queued) { PlayQueue = new Queue<PlayQueueItem>(); this.sender = sender; if (!CoroutineQueueds.ContainsKey(queued)) { CoroutineQueueds.Add(queued, this); } else Debug.LogError ("重复的CoroutineQueued"); } public PlayQueuedSystem(MonoBehaviour sender) { PlayQueue = new Queue<PlayQueueItem>(); this.sender = sender; } public void AddQueueItem(PlayQueueItem queueItem) { if (PlayQueue == null) PlayQueue = new Queue<PlayQueueItem>(); PlayQueue.Enqueue(queueItem); } /// <summary> /// 开始运行协程队列 /// </summary> public void StartQueue() { runing = true; IEnumerator queueRuning = QueueRuning(); MonoTools.AddCoroutines(sender, this, sender.StartCoroutine(queueRuning), queueRuning); } /// <summary> /// 停止队列执行,不会影响正在实行的内容 /// </summary> public void StopQueue() { runing = false; } Coroutine nowIEnumerator; IEnumerator QueueRuning() { while (runing) { if (PlayQueue.Count > 0) { nowIEnumerator = sender.StartCoroutine(MonoTools.QueueItem(PlayQueue.Dequeue(), null)); yield return nowIEnumerator; } else yield return new WaitForSeconds(0.5f); } } /// <summary> /// 略过当前执行协程 /// </summary> /// <param name="nowIEnumerator"></param> public void IgnoreNowCoroutine(Coroutine nowIEnumerator) { if(nowIEnumerator!=null) sender.StopCoroutine(nowIEnumerator); } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘