作为Unity3D的初学者,在目前学习开发中遇到一个困扰一周的问题。
目前要实现这样一个功能:对物体输入一连串的指令来控制物体移动,物体会按照指令依次执行下去,但是目前想实现一个循环和判断指令,就类似于while和if语句。
没想到一个比较好的处理方法,求指教!
使用命令模式 把命令封成对象 然后不管用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中,判断传递的指令,实现循环接受指令操作