Ejemplo n.º 1
0
 // 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];
     }//按钮显示是否有任务
 }
Ejemplo n.º 2
0
 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;
     }
 }
Ejemplo n.º 3
0
 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);
         }
     }
 }
Ejemplo n.º 4
0
    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);
        }
    }