0
プログラムで作成したテキストオブジェクトを、XMLリストを更新した後で削除したいと思っています。何らかの理由で削除されません。彼らはまだ階層に表示されます。Unity GameObjectsが破壊された後も階層内に表示されます
XMLは単に名前の属性を持つルート要素とプレーヤー要素を持つファイルです。ここで
コードです:
public GameObject textTemplate;
public InputField nameInput;
// list of player names
private List<GameObject> players = new List<GameObject>();
private const string playersPath = "foo/bar.xml";
// this is a button OnClick callback
public void TryAddNew()
{
// get name from input field
string name = nameInput.text;
if (players.FirstOrDefault(t => t.GetComponent<Text>().text == name) == null)
{
// update XML
XDocument doc = XDocument.Load(playersPath);
XElement root = doc.Element("players");
root.Add(new XElement("player",
new XAttribute("name", name)
));
doc.Save(playersPath);
LoadPlayers();
}
}
private void LoadPlayers()
{
// destroy existing player texts
foreach (GameObject obj in players)
{
// THE PROBLEM IS HERE, this doesn't seem to work
UnityEngine.Object.Destroy(obj.GetComponent<Text>());
UnityEngine.Object.Destroy(obj);
}
players.Clear();
// load players from XML
XDocument users = XDocument.Load(playersPath);
XElement root = users.Element("players");
int i = 0;
foreach (XElement playerEle in root.Elements("player"))
{
CreateNewPlayerText(playerEle.Attribute("name").Value, i);
i++;
}
}
// instantiate new player text
private void CreateNewPlayerText(string name, int index)
{
GameObject newObj = Instantiate(textTemplate) as GameObject;
// insert into parent view
newObj.transform.SetParent(textTemplate.transform.parent);
Text newText = newObj.GetComponent<Text>();
newText.text = name;
newText.rectTransform.anchoredPosition = new Vector2(SCROLL_MARGIN, -SCROLL_MARGIN - index * 15);
// show text
newObj.SetActive(true);
}
あなたはゲームオブジェクトを破壊し、部品やゲームオブジェの両方を破壊する必要はありませんが、あまりにもそれに接続されているすべてのコンポーネントをdestroyes:私はCreateNewPlayerTextメソッドの最後にこれを追加する必要がありました。 –
はい、これは動作させるために試したときに試した1つのことでした – mkkekkonen