Кто-нибудь знает, как смоделировать эти отношения?

#c# #unity3d #architecture #game-development

Вопрос:

У меня есть игроки в ИИ, которые могут участвовать в определенных работах. Поэтому я должен найти лучший способ смоделировать эти отношения. Работник ресторана получает еду из инвентаря ресторана и приносит ее к столу. В этой работе инвентарь ресторана является «продуктовым складом», а стол-пунктом доставки. У меня такая же концепция работы для поставщика мяса, однако его «Продовольственный магазин» — это Распределительный завод, а его пункт доставки-инвентарь ресторана. Все эти три объекта должны быть «целевым объектом» либо через абстрактный класс, либо через интерфейс, который я еще не решил.

Основная проблема заключается в том, что я не могу проверить свойство «FoodAvailable» объектов, потому что я перебираю их КАК родительский класс «Цель», чтобы сохранить абстрактность, чтобы поставщик мяса и работник ресторана могли реализовать один и тот же класс «Работа». Мне нужно иметь возможность перебирать потенциальные точки доставки, нуждающиеся в продовольствии, а также проверять их ресурсную ценность, поэтому мне нужны объекты точек доставки, которые удовлетворяли бы обоим свойствам, а также были бы каким-то образом абстрактными.

Чтобы еще больше усложнить ситуацию, у меня есть другой ИИ, который будет приходить и есть со столов. Кажется, у меня с этим все в порядке. Моделирование этих конкретных отношений ставит меня в тупик. Я не думаю, что код уместен в данном случае, так как мне просто нужно представление высокого уровня о том, как его представлять. Я могу предоставить код, если это будет полезно.

введите описание изображения здесь

Комментарии:

1. Это очень похоже на архитектуру классной доски. Эта структура значительно облегчит наблюдение за различными объектами и добавит все больше и больше направлений, в которых могут двигаться объекты (отправлять еду обратно на кухню…)

Ответ №1:

Я думаю, я вроде как понимаю, чего ты добиваешься. Есть несколько вариантов, которые приходят на ум…

  1. Используйте интерфейсы или наследование для идентификации объектов, обладающих FoodAvailable свойством. Я предполагаю, что у вас есть коллекция/список объектов для перебора, который охватывает все рассматриваемые объекты.
  2. Вложенные объекты. В задании могут быть дочерние задания, поэтому, когда вы проверяете FoodAvailable объект, он также FoodAvailable проверяет все дочерние объекты, которые у них есть, если таковые имеются.

Вот некоторый псевдокод, показывающий вариант 2. Не уверен, что моя логика верна на 100%, но общая идея должна быть довольно ясной:

 class Job(){

  Job[] DependentJobs { ... }
  Food MyFood { ... }

  // Returns true if all required food is ready.
  bool FoodAvailable {

    get {
      // First check if this object has food in it's own right: 
      if(MyFood != ready)
        return false

      else
      // Second, if the first check passes, check child / dependent jobs: 
        foreach(job in DependentJobs){
          if(job.FoodAvailable == false) return false
        }
        return true
    }

  }

}
 

Ответ №2:

это демонстрационный процесс

 interface ItemInterface<T>
{
    /// <summary>
    /// itemCall
    /// </summary>
    /// <param name="args"></param>
    void SetItemData (T args);
}

public class TempItem<T>:ItemInterface<T>
{
    /// <summary>
    /// itemCall
    /// </summary>
    /// <param name="args"></param>
    void SetItemData (T args)
    {
        if(T is int a)
        {
            int b = a;
        }
    }
}

public void Main()
{
    object obj = createObjItem();
    //"SetItemData" is ItemInterface call Fun name
    MethodInfo method = obj.GetType ().GetMethod ("SetItemData");
    if( method != null )
    {
        int data = 1;
        method.Invoke (obj , new object [1] { data });
    }
}

private object createObjItem()
{
    TempItem<int> item = new TempItem<int>();
    //transform to obj
    object obj = item;
    return obj;
}
 

вы можете видеть видеть отражение и атрибут