【问题标题】:Does anyone know how to model this relationship?有谁知道如何模拟这种关系?
【发布时间】:2021-09-18 11:37:22
【问题描述】:

我有可以从事某些工作的 AI 玩家。所以我必须找到最好的方法来模拟这种关系。餐厅工作人员从餐厅库存中获取食物并将其带到餐桌上。在这项工作中,餐厅库存是“FoodStore”,桌子是交货点。我对肉类供应商有相同的工作概念,但是他的“食品店”是配送工厂,而他的交货点是餐厅库存。这三个对象都必须通过我尚未决定的抽象类或接口“成为”目标对象。

主要问题是我无法检查对象的“FoodAvailable”属性,因为我将它们作为其父类“目标”进行迭代以保持事物抽象,以便肉类供应商和餐厅工作人员都可以实现相同的“工作”班级。我需要能够迭代需要食物的潜在交付点,同时检查它们的资源价值,因此我需要交付点对象同时满足这两个属性,同时还要以某种方式抽象。

更复杂的是,我还有其他 AI 会来吃桌子。我似乎做得很好。建模这种特殊的关系让我很难过。我不认为代码在这种情况下是相关的,因为我只需要一个关于如何表示它的高级想法。如果有帮助,我可以提供代码。

【问题讨论】:

  • 这听起来很像黑板架构。这种结构将使观察不同物体变得更加容易,并增加物体可以去的方向(将食物送回厨房......)

标签: c# unity3d architecture game-development


【解决方案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;
    }
    

    可以看到反射和属性

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多