Unity3D通过指令控制角色

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

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);
        }
    }
}

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐