Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Unity3D:如何在数组列表中返回或前进_Arrays_Unity3d - Fatal编程技术网

Arrays Unity3D:如何在数组列表中返回或前进

Arrays Unity3D:如何在数组列表中返回或前进,arrays,unity3d,Arrays,Unity3d,我有一个ID为的游戏对象,游戏对象是通过给初始ID:1生成的,然后任何在生成后的都是+1,所以下一个是ID:2 我有两个按钮来检查当前游戏对象ID,BackOneButton(-1)和PlusOneButton(+1) 目前,它可以工作,但仅当游戏对象数组的ID顺序类似于[gameObject ID:1]、[gameObject ID:2]、[gameObject ID:3]时才起作用 但由于你可以自毁某个游戏对象,这里是错误所在---> 现在数组不按顺序排列,例如[gameObject ID:

我有一个ID为的游戏对象,游戏对象是通过给初始ID:1生成的,然后任何在生成后的都是+1,所以下一个是ID:2

我有两个按钮来检查当前游戏对象ID,BackOneButton(-1)和PlusOneButton(+1)

目前,它可以工作,但仅当游戏对象数组的ID顺序类似于[gameObject ID:1]、[gameObject ID:2]、[gameObject ID:3]时才起作用

但由于你可以自毁某个游戏对象,这里是错误所在--->

现在数组不按顺序排列,例如[gameObject ID:1]、[gameObject ID:3]、[gameObject ID:4]。因此,如果我当前在[gameObject ID:3]中,我使用BackOne按钮查找ID:2,它将找不到它,但有ID:1。这是我的错误,我似乎不知道该怎么处理

基本上,如何处理缺少的增量并跳过缺少的增量

左按钮(MinusOne按钮)

void按钮操作\u leftminssone()
{
//获取所有游戏对象的列表和-1当前要切换的
字符串objName=manager.currentObjectTransform.name;
string[]splitArray=objName.Split('');
字符串idObjNumber=splitArray[1];
开关(idObjNumber)
{
案例“0”:
//不应为ID:0
打破
案例“1”:
//无需返回,这是ID:1
打破
违约:
//当前在(ID:2及以上)第二个对象中
int currentID=int.Parse(idObjNumber);
字符串idBackOne=(currentID-1).ToString();
GameObject[]allObjInFull=GameObject.FindGameObjectsWithTag(“对象”);
如果(allObjInFull.Length>=2)
{
对于(int i=0;i
右按钮(PlusOneButton)

void按钮操作\u RightPlusOne()
{
//获取要切换的所有对象和+1当前值的列表
字符串objName=manager.currentObjectTransform.name;
string[]splitArray=objName.Split('');
字符串idObjNumber=splitArray[1];
开关(idObjNumber)
{
案例“0”:
//不应为ID:0
打破
违约:
//当前在(ID:1及以上)对象中
int currentID=int.Parse(idObjNumber);
字符串idPlusOne=(当前ID+1).ToString();
GameObject[]allObjInFull=GameObject.FindGameObjectsWithTag(“对象”);
如果(allObjInFull.Length>=2)
{
对于(int i=0;i
如果有一个带有
列表的中央管理器类,您只需动态地
添加
删除
项,则效果会更好(尤其是在维护方面),效率也会更高。(既然您在
manager
中似乎已经有了一个,我宁愿扩展这个)

公共静态类ObjectsManager
{
//如果你不关心
//当然,你们也可以把它公之于众
//但我觉得这更干净
私有静态列表对象;
//只读属性
公共静态整数计数
{
得到
{
初始化();
返回对象。计数;
}
}
//初始化列表一次
//我第一次是在醒着的时候
//但现在您可以在多个场景中轻松地使用它
公共静态无效初始化(bool force reinitialize=false)
{
如果(objects!=null&!重新初始化)返回;
objects=FindObjectsWithTag(“Object”).ToList();
}
公共静态无效添加(GameObject新建对象)
{
初始化();
if(objects.Contains)(newObject)返回;
添加(newObject);
}
公共静态无效销毁(游戏对象销毁)
{
初始化();
if(objects.Contains)(toDestroy)
{
对象。移除(toDestroy);
}
对象。销毁(toDestroy);
}
公共静态int IndexOf(gameobjectobj)
{
初始化();
返回objects.IndexOf(obj);
}
公共静态游戏对象GetByIndex(int索引)
{
初始化();
//使用模来环绕索引,以防万一
//+1或-1超出列表末尾
//在你的情况下,你可能不需要它
//但我决定增加它以使其更灵活
var nextIndex=(索引+1)%objects.Count;
返回对象[索引];
}
}
每次实例化新对象时,请确保也调用

ObjectsManager.Add(newObject);
每次你破坏一个物体而不是使用

ObjectsManager.Destroy(objectToDestroy);
因此,它也会首先从列表中删除

这样你就可以很容易地使用

var currentIndex=ObjectsManager.IndexOf(certainObject);
获取对象的当前索引和