【发布时间】:2022-11-14 09:26:32
【问题描述】:
我在 Unity 中练习 C# 列表,但遇到了问题。 我的测试脚本实例化了 5 个添加到游戏对象列表中的预制件。然后我编写了一个生成随机整数的代码,并从该数字移动使用该索引(indexof)实例化的预制件。一切正常,但移动和删除预制件的方法对场景中的所有游戏对象重复,其索引高于所选的一个。我附上这两个脚本以更好地解释问题。 (我只需要执行一次 unlist 方法。
如何解决此问题并一次从列表中删除一项? (每次按下按钮时,都不是现在这样。谢谢)
脚本:
- NpcController:在每个实例化的预制件中添加
- ListCOntroller:添加到场景中。
public class ListCOntroller : MonoBehaviour
{
public GameObject cubePrefab;
private GameObject cubeInstance;
public static List<GameObject> cubeList = new List<GameObject> ();
public TextMeshProUGUI checkText;
public static event Action chooseNpc;
public static int randNpcValue;
int rand;
private void Start()
{
for(int i =0; i < 5; i++)
{
cubeInstance = Instantiate(cubePrefab, new Vector3(i, -2, 0), Quaternion.identity);
cubeList.Add(cubeInstance);
}
}
public void CheckListText()
{
checkText.text = "Npc in list: " + cubeList.Count.ToString();
}
public static void SelectRandomCube()
{
randNpcValue = Random.Range(0, cubeList.Count);
chooseNpc?.Invoke();
}
}
公共类 NpcController : MonoBehaviour {
void Start()
{
ListCOntroller.chooseNpc += NpcEvent;
}
private void NpcEvent()
{
if (ListCOntroller.cubeList.IndexOf(gameObject) == ListCOntroller.randNpcValue)
{
transform.localPosition = new Vector3(transform.position.x, 2, 0);
DeleteFromList();
}
}
private void DeleteFromList()
{
ListCOntroller.cubeList.RemoveAt(ListCOntroller.randNpcValue);
Debug.Log($"Delete from list: {ListCOntroller.randNpcValue}");
}
}
附图中生成的 int 随机数为:2
【问题讨论】:
-
首先,一个格式很好的问题,做得很好。关于这个问题,你的代码对我来说看起来不错,我真的无法发现一个问题,我担心......日志消息是否也打印了多次?可能是按钮调用了 chooseNpc 函数。不知何故多次?
-
这段代码有很多问题。 1)
ListCOntroller可以被多次实例化 2)ListCOntroller应该是一个单例,但是它的编写方式不是 Unity-singleton 安全的 3) 使用static和引用类型 4) 使用static和预制件等 Unity 引用类型可能导致您的代码引用已被 Unity 销毁的对象 -
在 Unity 中使用
static时要小心 - thar be dragons。团结是一个CLR 主机它可以而且将扎普出主应用程序域连同你所有的物品包括单身人士不仅在运行时,而且在使用编辑.也可以看看Details of disabling Domain and Scene Reload. -
@MickyD 实际上,我在销毁使用静态方法和变量的实例化对象时遇到了麻烦。我怎样才能解决这个问题? (不幸的是,除了使用静态事件和方法之外,我不知道管理实例化对象事件的任何其他解决方案)。我是团结的新手,我为琐碎的问题道歉
-
@sommmen 谢谢,我尽我所能使它易于阅读和理解我的问题:) 我在按下按钮时输入了一条调试消息,它被调用一次,问题似乎是每个调用的事件对象,所以 indexof 总是更新的。