在Unity中改变场景时从列表中删除元素



我在Unity中有一个包含7个元素的列表。在场景开始时,一个元素被激活3秒,然后被停用。然后用户必须在场景中搜索这个元素,一旦他/她找到它,就按下触发器按钮进入下一个场景。我想要实现的是删除已经被激活的元素,这样用户就不会在接下来的场景中看到它们。因此,如果在第一个场景中元素6被激活,那么在第二个场景中任何元素都可以被激活,但不能被6激活。接下来的场景都是如此。到目前为止,我有下面的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TrialHandler : MonoBehaviour
{
public static TrialHandler instance;
public List<GameObject> objectsList = new List<GameObject>();
private int currentObject;
private float timer;
[HideInInspector] public static int trialNum = 0;
private void Awake()
{
objectsList.RemoveAll(item => item = null);
instance = this;
DontDestroyOnLoad(this.gameObject);
}
void Start()
{
currentObject = Random.Range(0, objectsList.Count);
objectsList[currentObject].SetActive(true);
trialNum += 1;
}
// Update is called once per frame
void Update()
{
timer += Time.deltaTime;
if (timer >= 3.0f)
{
objectsList[currentObject].SetActive(false);
}
}
}

它在大多数情况下工作得很好,除了它重复了用户在浏览场景时已经看到的元素。我已经把这个代码objectsList.RemoveAll(item => item = null);,但它似乎并没有摆脱已经停用的元素,一旦一个新的场景被加载。

任何想法?提前谢谢。

更新:问题似乎是,当场景开始时,所有的元素都被停用(只有一个随机元素被激活)。因此,当下一个场景加载时,列表不会被剩余的元素填充。但是,我不能从一开始就激活所有元素,因为我只想在每个场景中显示一个元素。

根据我的理解,当你进入下一个场景时,你需要从列表中删除游戏对象。当你点击(触发按钮-onclick监听器)下一个场景。不需要移除所有的项目。既然你正在使用DontDestroyOnLoad,你可以使用RemoveAt(index)。

int index = TrialHandler.instance.objectsList
TrialHandler.instance.objectsList.RemoveAt(currentObject) //Currentobject is the index.

由于您的列表包含GameObjects,您可以比较同类。在TrialHandler中添加一个新的void:

public void RemoveObject(Gameobject g)
{
objectsList.Remove(g);
}

当你使用单例模式时,你可以通过脚本在被点击的对象上访问TrialHandler。使用IPointerClickHandler接口来检测点击(或者使用光线投射):

public class ClickedObject: IPointerClickHandler
{
public void OnPointerClick(PointerEventData pointerEventData)
{
TrialHandler.instance.RemoveObject(gameObject);
}
}

最新更新