我对如何设置我的场景来做这件事感到有些困惑。我想创建一个类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渲染器,这样我就可以重新实例化了。
我让自己非常困惑所以希望能帮助我如何有效地设置它。
答案 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时才实例化它。这意味着它只能在游戏的生命周期中实例化一次,这样无论您访问的回购实例是什么,总是可以获得相同的数据。通常使用数据库来完成这样的事情。