qq_32951017
Promiseymx
采纳率100%
2019-01-11 08:12

Unity3D通过指令控制角色

已采纳

作为Unity3D的初学者,在目前学习开发中遇到一个困扰一周的问题。
目前要实现这样一个功能:对物体输入一连串的指令来控制物体移动,物体会按照指令依次执行下去,但是目前想实现一个循环和判断指令,就类似于while和if语句。
没想到一个比较好的处理方法,求指教!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • qq_36529290 qq_36529290 2年前

    使用命令模式 把命令封成对象 然后不管用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);
            }
        }
    }
    
    
    点赞 评论 复制链接分享
  • weixin_44313514 王璐威 2年前

    可以用swith语句,放到Updata中,判断传递的指令,实现循环接受指令操作

    点赞 1 评论 复制链接分享

相关推荐