Promiseymx 2019-01-11 08:12 采纳率: 100%
浏览 926
已采纳

Unity3D通过指令控制角色

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

  • 写回答

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);
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥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系统的硬盘