脚本中的无限对象声明

Posted

技术标签:

【中文标题】脚本中的无限对象声明【英文标题】:Infinite objects declaration in script 【发布时间】:2013-04-25 13:04:16 【问题描述】:

我在 Unity 中有一个脚本,用于在我的赛车游戏中保存检查点。但我不知道赛道上有多少检查站。现在我限制在 5 个:

但是,我想允许地图制作者插入更多检查点。 这不起作用:

public List<GameObject> checkPoints = new List<GameObject>();

那么最好的方法是什么?

【问题讨论】:

你试过什么?您究竟希望地图制作者如何添加新的检查点? 我想做类似矢量的东西。如果地图制作者将检查点添加到场景中,他们将在此脚本中添加检查点 为什么列表不起作用。你能再解释一下吗? 当我使用此代码时,列表不会出现在此窗口中(如屏幕上)。我想创建可以存储地图上所有检查点的脚本。 发布脚本的全部代码。 GameObject 的公共列表将正确显示在检查器中。 【参考方案1】:

定义检查点数组不起作用吗?

public GameObject[] CheckPoints;

我目前无法访问 Unity,但这应该允许您通过检查器将任意(合理)数量的 GameObjects 输入到 CheckPoints 数组中。

Unity Answers 上的这个和这个问题类似:http://answers.unity3d.com/questions/245024/public-array-of-gameobjects.html

在这里大胆猜测一下,你的错误是List1' could not be found 吗?在这种情况下,您必须添加 using System.Collections.Generic; 才能使用 C# 列表。

【讨论】:

这很好,但是 List 也可以。可能 OP 的错误在其他地方。 @Heisenbug 我以为是,但目前我无法对其进行测试。我想他的 List 不起作用的原因是因为他在脚本方面创建它? (public List&lt;GameObject&gt; foo = new List&lt;GameObject&gt;(); 而不是仅仅公开的List&lt;GameObject&gt; foo; 虽然“这不起作用”并不能真正描述他的问题,你是对的,它可能在其他地方。 没有。即使他在脚本中初始化它,它也应该是可检查的。顺便说一句,在脚本内部和通过编辑器初始化它最终可能会导致一些其他错误。 @Heisenbug 这些类型的错误有什么例子吗?我一直发现初始化公共成员是无害的(尽管没用)。据我所见,Unity 的编辑器序列化过程非常擅长处理这类事情。 @Jerdak:如果您从检查器初始化一个数组,统一将正确地序列化它们。如果你再次初始化它(例如在 Awake 中),在检查器中初始化的数组将会丢失。【参考方案2】:

这个:public List&lt;GameObject&gt; checkPoints = new List&lt;GameObject&gt;(); 没有出现,因为它是一个游戏对象列表,而不是一个向量列表。用户不能手动输入游戏对象。您可以这样做:public List&lt;Vector3&gt; checkPoints = new List&lt;Vector3&gt;();,然后简单地遍历此列表并在运行时为每个位置执行 Resource.Load(如果您无法弄清楚,我可以输入一个示例)。

一个更加用户友好的解决方案是允许用户通过在世界中放置一个 GameObject 来添加检查点,而不必手动键入每个向量。例如,创建一个 CheckPoint 对象,并给它一个唯一的标签(例如:“CheckPointTag”),然后简单地运行下面的方法来获取所有的检查点位置:

public List<Vector3> GetCheckPoints()

     GameObject[] objects = GameObject.FindGameObjectsWithTag("CheckPointTag");
     List<Vector3> objectPos = new List<Vector3>();
     foreach(GameObject object in objects)
          objectPos.Add(object.transform.Position;

     return objectPos;

【讨论】:

不得不投反对票,因为它具有误导性。用户不能直接输入 GameObject,不,但这没有相关性,他们可以通过检查器将 GameObject 的实例或要实例化的 prefab 拖放到 GameObject 属性。 你可以,但也许我只是没有正确地表达我的答案。我并不是说他不能以这种方式将 GameObjects 添加到列表中,只是他不能输入它们,这似乎是他说这句话时所追求的:我想做类似矢量的东西.如果地图制作者将检查点添加到场景中,他们将在此脚本中添加检查点

以上是关于脚本中的无限对象声明的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本 - 在退出无限循环之前完成迭代

理解复杂的类型脚本类型声明

Linux shell脚本基础

在脚本中并行运行 2 个无限循环,并在脚本停止时终止

无限滚动脚本无法识别 Jquery 事件

Unity.3D中,两个界面各自脚本中的变量如何调用