【问题标题】:Setup an array of a class and how to link it to a game object设置类的数组以及如何将其链接到游戏对象
【发布时间】:2016-08-08 03:42:10
【问题描述】:

我对如何设置我的场景来做到这一点有点困惑。我想创建一个我的班级System 的数组。其中包含一个 Vector3 位置,一个对精灵渲染器和游戏对象的引用。我还在我的数组创建中实例化了该位置的游戏对象。

我在游戏世界的一个空游戏对象中设置了这样的数组:

public System[] systemArray;
void Start () {
    systemArray = new System[totalSystems];

    for (int i = 0; i < totalSystems; i++)
    {
        systemArray[i].worldPos = new Vector3(Random.Range(min,max),Random.Range(min,max), Random.Range(minZ,maxZ));
        Instantiate(systemObject,systemArray[i].worldPos,Quaternion.identity);
    }       
}

现在我的系统脚本没有附加到游戏对象,它只是一个脚本,用于存储我刚刚创建的实例化游戏对象的数据。代码如下所示:

public class System : MonoBehaviour {

   public SpriteRenderer  spriteRenderer;
   public GameObject      gameObject;
   public Vector3         worldPos;

}

我的困惑是如何将这一切联系起来。

这里的目标是我希望能够从场景中销毁游戏对象,但我仍然可以从 System 访问它们的 Vector3、GO 和 sprite 渲染器,以便我可以再次重新实例化。

我真的很困惑,所以希望能得到一些帮助,让我知道如何有效地进行设置。

【问题讨论】:

  • 有点混乱,你可能需要用你需要什么以及问题出在哪里来重新表述问题。
  • 总之,我想创建一堆游戏对象来实例化它们并设置它们的位置,并且还有对精灵渲染器的引用,所以当我从游戏世界中销毁时我不会丢失这些信息,因为我可能想在将来的某个时间再次重新实例化。
  • 只是一个正式的说明:不要命名一个类System。那是一个顶级的 .net 命名空间。像GameSystem 这样的东西会更好,而且不容易混淆。
  • @GunnarB。是的,我后来意识到:P 谢谢 :)

标签: c# arrays unity3d


【解决方案1】:

创建一个负责维护系统的单独类。 最佳实践:该类不会直接公开系统集合,而是通过方法来实现用逻辑装饰操作。

看起来像这样:

public class SystemRepository
{
    private static List<System> _systems;

    public List<System> GetAll() { 
        if (_systems == null) {
          _systems = new List<System>()
        }

        // Further logic

        return _systems
    }

    public System GetBy(GameObject v) { ... }

    public void Add(List<System> s) { ... }

    public void DestroyBy(Vector3 v) { ... }

    ...
}

因此,当您需要访问系统以添加/删除/获取它们时,您需要执行以下操作:

using Namespace/Of/SystemRepository

// ...

var systemRepo = new SystemRepository();

systemRepo.Add(totalSystems);

还有其他地方..

var systemRepo = new SystemRepository();

var allSystems = systemRepo.GetAll();
for (int i = 0; i < allSystems.Count(); i++)
{
    allSystems[i].worldPos = new Vector3(Random.Range(min, max), Random.Range(min, max), Random.Range(minZ, maxZ));
    Instantiate(systemObject, allSystems[i].worldPos, Quaternion.identity);
}

注意:在 SystemRepository 中,我将系统列表声明为静态的,并且仅在它为空时才实例化它。这意味着它只能在您的游戏生命周期中实例化一次,因此无论您访问哪个 repo 实例,您始终可以获取相同的数据。这样的事情通常会使用数据库来完成。

【讨论】:

  • 那么我会将我对游戏对象、精灵渲染器和矢量 3 的引用存储在哪里?您添加了 allSystems[i].worldPos 的 sn-p,但我没有看到它存在于类中的什么位置?
  • 它们包含在系统列表中。
  • 为什么选择列表而不是数组?
  • 性能方面,当您想要动态添加/删除数据时,List 更有意义,因为调整普通数组的大小很昂贵。它还提供了更多功能(LINQ 也可以应用于数组,这样就不会太糟糕了)。一般来说,总是使用列表。只有在特殊情况下,数组会是更好的选择(例如参数、位移……)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多