我正在尝试制作一个"瓦片"列表。为此,我定义了一个名为"Tile"的类:
[System.Serializable]
class Tile
{
[SerializeField]
GameObject platform;
[SerializeField]
List<string> connectionNorth,
connectionSouth,
connectionWest,
connectionEast;
}
[SerializeField]
List<Tile> tiles = new List<Tile>();
现在。。。如果我找到了存储在字段platform
中的游戏对象(无论我如何找到它,使用光线投射、碰撞、触发器等(,我如何访问它的父类(运行时存储该特定游戏对象的类的实例(?。通过这样做,我想将connectionNorth
列表与我拥有的其他列表进行比较。
您所说的parent
是什么意思还不完全清楚。
-
如果你指的是场景层次结构中的父
GameObject
,那么你可以简单地访问它的Transform.parent
Transform parentTransform = platform.transform.parent;
-
如果你想知道你的
platform
在哪一类中被引用。。你不能。相同的GameObject
可以在n
中引用不同的其他类,这里没有像parent
这样的东西。为此,您可能需要不同的数据结构,例如两个Dictionary
,以便能够在GameObject
和Tile
之间来回移动,例如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)) ...
注意
Btw-Unity序列化只适用于特定的嵌套级别afaik。在类Tile
中引用List<Tile>
时可能会遇到问题。
您必须在游戏对象和其父对象之间建立关系。
或者GameObject有一个"父"属性或字段,或者您以另一种方式存储关系。
您的Tile对象必须在MonoBehavior组件上实例化,因此您将拥有这样的东西:
public class Platform : MonoBehaviour
{
public Tile tile;
}
则可以在平台引用上使用platform.GetComponent<Platform>().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();
}
比较差异的两个通用列表的最快方法