销毁克隆预制件

时间:2021-05-27 07:45:30

标签: c# unity3d

我有问题。在一个场景中,我有一个列表,当我点击它时,我会看到一些克隆预制数据库的内容。关键是一旦生成,无论我从列表中选择了多少另一个项目,预制件都不会更新我并显示第一个选择的内容。我试图摧毁他们。但我设法做的最多的事情就是破坏原来的预制件,不要再相信我了。我该如何解决这个问题?

public Transform contentParent;
public List<TablePlayerTransctData> playersTransct;
public GameObject playerTransactItemPrefab;
private Models.Club _club;
public TextMeshProUGUI memberUuid;


public void Start()
{
    GetTablePlayerTransactRequest();
}


private void GetTablePlayerTransactRequest()
{
    _club = TablesManager.Instance.club;

    new LogEventRequest().SetEventKey("Transactions")
        .SetEventAttribute("clubId", _club.id)
        .SetEventAttribute("playerId", memberUuid.text)
        .Send(GetTablePlayerTransactResponse);
}


private void HandleResults()
{
    var cont = 0f;

    Vector3 posicion = new Vector3();

    foreach (TablePlayerTransctData data in playersTransct)
    {
        GameObject item = Instantiate(playerTransactItemPrefab, contentParent);
        PlayerTransact playerTableTransact = item.GetComponent<PlayerTransact>();

        if (cont == 0)
        {
            posicion = playerTableTransact.transform.position;
        }
        else
        {
            posicion.Set(posicion.x, (posicion.y) - 0.5f, posicion.z);
            playerTableTransact.transform.position = posicion;
        }

        playerTableTransact.Setup(data);

        cont++;
    }
}

private void GetTablePlayerTransactResponse(LogEventResponse response)
{
    if (response.HasErrors)
    {
        return;
    }

    GSData scriptData = response.ScriptData;
    var list = scriptData.GetGSDataList("list");
    playersTransct = new List<TablePlayerTransctData>();

    foreach (GSData entry in list)
    {
        TablePlayerTransctData data = new TablePlayerTransctData()
        {
            chips = GSUtil.GetInt(entry, "chips"),
            date = GSUtil.GetDouble(entry, "date"),
        };

        playersTransct.Add(data);
    }

    HandleResults();
}

public class TablePlayerTransctData
{
    public int chips;
    public double date;
}

我认为这些预制件应该在重新创建之前重置或删除。但我不知道该怎么做,或者可能有另一种更正确的方法来做到这一点。

编辑: 我将“开始”更改为“更新”,并且几乎按其应有的方式神奇地工作。我不明白这是什么奇迹。因为每次进入时都要开始,所以你应该自己冷静下来。现在剩下的就是移除剩余的预制件,这是我没有正确完成的事情。

1 个答案:

答案 0 :(得分:1)

在实例化新项目之前,您可以将它们全部销毁,例如

// General hint: Make this of the correct type
// - Makes sure that the referenced prefab actually HAS that component
// - Gets rid of some GetComponent calls later since Instantiate already
//   returns the same type as the given prefab has
public PlayerTransact playerTransactItemPrefab;

foreach(Transform child in contentParent)
{
    Destroy(child.gameObject);
}

foreach (var data in playersTransct)
{
    PlayerTransact item = Instantiate(playerTransactItemPrefab, contentParent);
    ...
}

或者,您当然可以只创建所需数量的对象并销毁其他对象,而不是销毁和重新创建所有对象重用那些已经存在的对象,例如

// cache the counts
var childCount = contentParent.childCount;
var dataCount = playersTransct.Count;
// we want to iterate the count that is greater
var count = Mathf.Max(childCount, dataCount);

for (var i = 0; i < count; i++)
{
    if (i < dataCount)
    {
        // there is data for this index
        var data = playersTransct[i];

        // so we need a child for it
        PlayerTransact playerTableTransact;

        if (i < childCount)
        {
            // We are still in the range of existing childs -> Re-use a child that already exists   
            playerTableTransact = contentParent.GetChild(i).GetComponent<PlayerTransact>();
            posicion = playerTableTransact.transform.position;
        }
        else // i < dataCount && i >= childCount
        {
            // There is still data but no childs left -> create a new one now
            playerTableTransact = Instantiate(playerTransactItemPrefab, contentParent);

            if (i == 0)
            {
                posicion = playerTableTransact.transform.position;
            }
            else
            {
                posicion -= Vector3.up * 0.5f;
                playerTableTransact.transform.position = posicion;
            }
        }

        playerTableTransact.Setup(data);
    }
    else // i < childCount && i >= dataCount
    {
        // There are more childs than data -> destroy the unneeded childs
        Destroy(contentParent.GetChild(i).gameObject);
    }
}