设置类的数组以及如何将其链接到游戏对象

时间:2016-04-16 02:21:46

标签: c# arrays unity3d

我对如何设置我的场景来做这件事感到有些困惑。我想创建一个类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渲染器,这样我就可以重新实例化了。

我让自己非常困惑所以希望能帮助我如何有效地设置它。

1 个答案:

答案 0 :(得分:0)

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

它看起来像这样:

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中,我声明系统列表是静态的,只有在它为null时才实例化它。这意味着它只能在游戏的生命周期中实例化一次,这样无论您访问的回购实例是什么,总是可以获得相同的数据。通常使用数据库来完成这样的事情。