// Update is called once per frame void Update() { for (int i = 0; i < GameManager.Instance.mainTasks.Count;) { Elevator available = GetAvailavleElevator(i); if (available == null) { i++; continue; } else { UDTask temp = GameManager.Instance.mainTasks[i]; AddMoveTask(temp.taskLevel, available); if (temp.dir == Direction.Up) { available.taskStop[0, temp.taskLevel - 1] = true; UpElevators.Add(available); } else { available.taskStop[1, temp.taskLevel - 1] = true; DownElevators.Add(available); } GameManager.Instance.MoveTask(i); } } elevatorNum = GameManager.Instance.number.value; for (int i = 0; i < levels.Length; i++) { levels[i].interactable = !elevators[elevatorNum].buttons[i]; }//按钮显示是否有任务 }
public void TaskRestart(UDTask task) { dispachedTasks.Remove(task); mainTasks.Insert(0, task); if (task.dir == Direction.Up) { buttonInteractable[0, task.taskLevel - 1] = false; } else { buttonInteractable[1, task.taskLevel - 1] = false; } }
public void TaskFinished(UDTask task, Elevator elevator) { dispachedTasks.Remove(task); if (task.dir == Direction.Up) { buttonInteractable[0, task.taskLevel - 1] = true; if (elevator.taskStop.Equals(new bool[2, 20])) { ElevatorButton.Instance.UpElevators.Remove(elevator); } } else { buttonInteractable[1, task.taskLevel - 1] = true; if (elevator.taskStop.Equals(new bool[2, 20])) { ElevatorButton.Instance.DownElevators.Remove(elevator); } } }
private Elevator GetAvailavleElevator(int Index) { UDTask task = GameManager.Instance.mainTasks[Index]; bool[] sameDir = new bool[elevators.Length]; int[] distance = new int[elevators.Length]; for (int i = 0; i < elevators.Length; i++) { distance[i] = Mathf.Abs(elevators[i].level - task.taskLevel); if (elevators[i].order == Order.Free) { if (elevators[i].timer > 0 && distance[i] != 0) { sameDir[i] = false; }//电梯没有其他任务但还开着门,且收到的不是当前层的指令时,暂不处理 else { sameDir[i] = true; }//未被调度的优先级最高 } else { if (task.dir == Direction.Up) { if (DownElevators.Contains(elevators[i])) { sameDir[i] = false;//已被调度且方向不同不可调度 } else if (elevators[i].order == Order.Up) { if (elevators[i].level < task.taskLevel || (elevators[i].level == task.taskLevel && elevators[i].state == Direction.Stop)) { sameDir[i] = true; } else { sameDir[i] = false; } } else { sameDir[i] = false; }//未被调度但方向不同 } else { if (UpElevators.Contains(elevators[i])) { sameDir[i] = false;//已被调度且方向不同不可调度 } else if (elevators[i].order == Order.Down) { if (elevators[i].level > task.taskLevel || (elevators[i].level == task.taskLevel && elevators[i].state == Direction.Stop)) { sameDir[i] = true; } else { sameDir[i] = false; } } else { sameDir[i] = false; } } }//整理其他优先级并更新距离 } int?num = null; for (int i = 0; i < elevators.Length; i++) { if (sameDir[i]) { if (num == null) { num = i; } else if (distance[i] < distance[(int)num]) { num = i; } } }//选可用的 if (num != null) { return(elevators[(int)num]); } else { return(null); } }