#c# #unity3d #architecture #game-development
Вопрос:
У меня есть игроки в ИИ, которые могут участвовать в определенных работах. Поэтому я должен найти лучший способ смоделировать эти отношения. Работник ресторана получает еду из инвентаря ресторана и приносит ее к столу. В этой работе инвентарь ресторана является «продуктовым складом», а стол-пунктом доставки. У меня такая же концепция работы для поставщика мяса, однако его «Продовольственный магазин» — это Распределительный завод, а его пункт доставки-инвентарь ресторана. Все эти три объекта должны быть «целевым объектом» либо через абстрактный класс, либо через интерфейс, который я еще не решил.
Основная проблема заключается в том, что я не могу проверить свойство «FoodAvailable» объектов, потому что я перебираю их КАК родительский класс «Цель», чтобы сохранить абстрактность, чтобы поставщик мяса и работник ресторана могли реализовать один и тот же класс «Работа». Мне нужно иметь возможность перебирать потенциальные точки доставки, нуждающиеся в продовольствии, а также проверять их ресурсную ценность, поэтому мне нужны объекты точек доставки, которые удовлетворяли бы обоим свойствам, а также были бы каким-то образом абстрактными.
Чтобы еще больше усложнить ситуацию, у меня есть другой ИИ, который будет приходить и есть со столов. Кажется, у меня с этим все в порядке. Моделирование этих конкретных отношений ставит меня в тупик. Я не думаю, что код уместен в данном случае, так как мне просто нужно представление высокого уровня о том, как его представлять. Я могу предоставить код, если это будет полезно.
Комментарии:
1. Это очень похоже на архитектуру классной доски. Эта структура значительно облегчит наблюдение за различными объектами и добавит все больше и больше направлений, в которых могут двигаться объекты (отправлять еду обратно на кухню…)
Ответ №1:
Я думаю, я вроде как понимаю, чего ты добиваешься. Есть несколько вариантов, которые приходят на ум…
- Используйте интерфейсы или наследование для идентификации объектов, обладающих
FoodAvailable
свойством. Я предполагаю, что у вас есть коллекция/список объектов для перебора, который охватывает все рассматриваемые объекты. - Вложенные объекты. В задании могут быть дочерние задания, поэтому, когда вы проверяете
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;
}
вы можете видеть видеть отражение и атрибут