我正在基于坐标生成游戏对象(球体),这些对象存储在.csv文件中。我有一个带有单个球体的游戏对象作为原始子对象。根据数据,对象将克隆此球体17次并将其移动。我可以通过访问父对象来移动整个对象,就像我想要的那样,但是在编辑模式下,根球体的位置使使用起来很不方便。
以下代码使之成为可能。
public GameObject parentObj;
public TextAsset csvFile;
[SerializeField]
private float scaleDownFactor = 10;
private int index = 0;
//class Deck : MonoBehaviour
//{
[SerializeField]
private GameObject[] deck;
private GameObject[] instanciatedObjects;
private void Start()
{
Fill();
}
public void Fill()
{
instanciatedObjects = new GameObject[deck.Length];
for (int i = 0; i < deck.Length; i++)
{
instanciatedObjects[i] = Instantiate(deck[i]) as GameObject;
}
}
//}
// Update is called once per frame
void Update()
{
readCSV();
}
void readCSV()
{
string[] frames = csvFile.text.Split('\n');
int[] relevant = {
0
};
string[] coordinates = frames[index].Split(',');
for (int i = 0; i < 17; i++)
{
float x = float.Parse(coordinates[relevant[i] * 3]) / scaleDownFactor;
float y = float.Parse(coordinates[relevant[i] * 3+1]) / scaleDownFactor;
float z = float.Parse(coordinates[relevant[i] * 3+2]) / scaleDownFactor;
//objectTest.transform.Rotate(float.Parse(fields[1]), float.Parse(fields[2]), float.Parse(fields[3]));
//objectTest.transform.Translate(x, y, z);
//parentObj.transform.position = new Vector3(x, y, z);
instanciatedObjects[i].transform.position = new Vector3(parentObj.transform.position.x, parentObj.transform.position.y, parentObj.transform.position.z);
instanciatedObjects[i].transform.eulerAngles = new Vector3(parentObj.transform.eulerAngles.x, parentObj.transform.eulerAngles.y, parentObj.transform.eulerAngles.z);
//instanciatedObjects[i].transform.position = new Vector3(x, y, z);
instanciatedObjects[i].transform.Translate(x, y, z);
}
if (index < frames.Length - 1)
{
index++;
}
if (index >= frames.Length -1)
{
index = 0;
}
}
这是屏幕截图:
所以我的问题是: 如何在不更改克隆对象的位置的情况下将此球的位置设置为移动点之一?既然所有行为都基于BaseSphere?
是否可以在克隆或生成对象时使BaseSphere不可见?
我正在寻找一种解决方案,它使在编辑器中移动数据生成的对象变得更加容易。
我将不胜感激。
答案 0 :(得分:0)
制作Empty Gameobject
的所有Spheres子级(例如Sphere_root
)并将其用于移动Sphere。
还要检查Scriptable Objects
。这是在Unity中管理数据的简单快捷的方法。
@编辑
public void Fill()
{
instanciatedObjects = new GameObject[deck.Length];
for (int i = 0; i < deck.Length; i++)
{
instanciatedObjects[i] = Instantiate(deck[i]) as GameObject;
instanciatedObjects[i].transform.parent = Baumer; // or Sphere Root or somehing else.
}
}