【问题标题】:How do I access a class that is the parent of a variable which I know?如何访问作为我知道的变量的父类的类?
【发布时间】:2019-11-19 23:53:43
【问题描述】:

我正在尝试列出“图块”。为此,我定义了一个名为“Tile”的类:

 [System.Serializable]
    class Tile
    {
        [SerializeField]
        GameObject platform;

        [SerializeField]
        List<string> connectionNorth, 
                     connectionSouth, 
                     connectionWest, 
                     connectionEast;
    }
    [SerializeField]
    List<Tile> tiles = new List<Tile>();

现在...如果我找到存储在字段platform 中的游戏对象(不管我如何找到它,通过光线投射、碰撞、触发器...等)我如何访问它的父类(在运行时存储此特定游戏对象的类的实例)?。通过这样做,我想将connectionNorth 列表与我拥有的其他列表进行比较。

【问题讨论】:

  • 对象不存储在其他对象中。它们存储在堆上。一个对象可以包含对另一个对象的 reference,但任何数量的其他对象或局部变量等也可以。因此,您的问题背后的前提本质上是有缺陷的。如果您需要在给定另一个对象的情况下找到一个对象,您唯一的选择是在该对象中定义和设置一个指向它的引用。因此,例如,孩子可能有一个指向父母的字段。这是您必须自己添加到课程中的内容。

标签: c# unity3d


【解决方案1】:

您所说的parent 的意思并不完全清楚。

  • 如果您指的是场景层次结构中的父 GameObject,那么您可以简单地访问其 Transform.parent

    Transform parentTransform = platform.transform.parent;
    
  • 如果您想找出您的platform 是在哪个类中引用的......您不能。相同的GameObject 可以在n 不同的其他类中引用,这里没有parent 这样的东西。你需要一个不同的数据结构,比如两个Dictionarys,以便能够在GameObjectTile之间来回切换,例如

    public class WhereYouUseIt : MonoBehaviour
    {
        public Dictionary<Tile, GameObject> GetGameObject = new Dictionary<Tile, GameObject>();
        public Dictionary<GameObject, Tile> GetTile = new Dictionary<GameObject, Tile>();
    
        public void AddTileGameObjectPair(Tile tile, GameObject obj)
        {
            // Ofcourse you probably would want some checks 
            // e.g. if one of the references is already used as Key somewhere
            GetTile.Add(tile, obj);
            GetGameObject.Add(obj, tile);
        }
    }
    

在你的描述中你说你想比较你的列表。

你不能简单地做一些类似的事情

if(connectionNorth.Contains(XYZ)) ...

注意

顺便说一句,Unity 序列化仅适用于某个嵌套级别 afaik。在 Tile 类中引用 List&lt;Tile&gt; 可能会遇到问题。

【讨论】:

    【解决方案2】:

    你必须在游戏对象和他的父母之间建立一个关系。

    或者 GameObject 具有“父”属性或字段,或者您以其他方式存储关系。

    【讨论】:

      【解决方案3】:

      您的 Tile 对象必须在 MonoBehaviour 组件上进行实例化,因此您将拥有类似的东西:

      public class Platform : MonoBehaviour
      {
           public Tile tile;
      }
      

      那么您可以在平台引用上使用platform.GetComponent&lt;Platform&gt;().tile 并访问Tile 成员。

      您可以比较图块,很可能使用静态方法:

      public static bool CompareNorth(Tile a, Tile b)
      {
           return a.connectionNorth == b.connectionNorth;
      }
      

      您的连接似乎是列表。我认为瓷砖只有上、下、左、右,所以不需要列表。如果它仍然是一个列表:

      public static bool CompareNorth(Tile a, Tile b)
      {
           var firstNotSecond = a.connectionNorth.Except(b.connectionNorth).ToList();
           var secondNotFirst = b.connectionNorth.Except(a.connectionNorth).ToList();
           return !firstNotSecond.Any() && !secondNotFirst.Any();
      }
      

      Quickest way to compare two generic lists for differences

      【讨论】:

        猜你喜欢
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多