首页 > 解决方案 > 为什么 Unity 会调整我的 C# 列表的大小每 17 秒变为 0?

问题描述

我有一个 C# 列表:

List<UniqueBlip> blips;

每次检测到对象时都会添加一个新的 blip。如果检测到最新的 blip 是其他 blip 所独有的,它将统一创建一个游戏对象,表示雷达上的 blip,但是在我的情况下,Unity 每 17 秒报告一次列表的大小为 0,导致 C# 的 List.Contains()方法返回 false,在我的统一游戏中添加一个额外的游戏对象。这是调试输出:

blip size is 869
UnityEngine.MonoBehaviour:print(Object)
SonarMonitor:add_blip(Single, Single, Int32) (at Assets/scripts/MonitorScripts/SonarMonitor.cs:45)
SonarController:OnTriggerStay(Collider) (at Assets/scripts/SonarController.cs:33)
blip size is 0
UnityEngine.MonoBehaviour:print(Object)
SonarMonitor:add_blip(Single, Single, Int32) (at Assets/scripts/MonitorScripts/SonarMonitor.cs:45)
SonarController:OnTriggerStay(Collider) (at Assets/scripts/SonarController.cs:33)

这是关联的Debug.Log()

print("blip size is " + blips.Count);

这些 blips 是在add_blip()被调用时添加的,这实际上是每个循环。我通过以下方式添加一个 blip 对象:

blips.Add(blip);

这是整个add_blip()方法:

public void add_blip(float strength, float angle, int id){
    //only add if blip is unique to list
    // Debug.Log("add blip called");
    UniqueBlip blip = new UniqueBlip(id, angle, strength);

    Debug.Log("Called because Contains returned "+UniqueBlip.objCount+" " + blips.Contains(blip) + " test" + blips.Contains(blip)+ " with id " + id + blip.id + " index is " + blips.IndexOf(blip) + blips + " " + blip);
    print("blip size is " + blips.Count); [RELEVANT LINE - added in SO editor]
    if(blips.Contains(blip)){
        // blips[blips.IndexOf(blip)].angle = angle;
        // blips[blips.IndexOf(blip)].distance = strength;

    }else{

        for(int i = 0; i < blips.Count; i++){
            Debug.Log(blips[i].id);
        }
        Debug.Log("blip obj count " +"blip size is " + blips.Count+"Called because Contains returned " + blips.Contains(blip) + " test" + blips.Contains(blip)+ " with id " + id + blip.id + " index is " + blips.IndexOf(blip) + blips + " " + blip);
        blips.Add(blip);
        GameObject go = new GameObject("blip " + blips[blips.Count-1].id);
        go.transform.parent = this.transform;
        go.transform.localPosition = new Vector3(0.1810069f,
            .17f*(float)Math.Sin((Math.PI/180)*blips[blips.Count-1].angle),
            .17f*(float)Math.Cos((Math.PI/180)*blips[blips.Count-1].angle));
        go.transform.localRotation = Quaternion.Euler(0,90f,0);
        go.transform.localScale = new Vector3(0.022f,0.022f,0.022f);

        SpriteRenderer renderer = go.AddComponent<SpriteRenderer>();
        renderer.sprite = blip_spr;

    }
    blips.Add(blip);

}

一些可能相关的信息是,在UniqueBlip类中,我有一个静态对象计数整数,当列表执行时不会重置为 0。

标签: c#listunity3d

解决方案


解决方案是在我的脚本方法中,我在一定数量的循环后update()调用。list.Clear()我把我的add_blip()方法当作我的update()循环,缩小我的搜索范围。感谢@GlennvanAcker 的建议。


推荐阅读