如何让Unity 游戏物体立即销毁

2015年01月27日 09:40 0 点赞 0 评论 更新于 2017-05-09 19:07

下面我们将详细阐述实现Unity游戏物体立即销毁的方法和步骤,主要涵盖层级物体的销毁以及对NGUI层级关系和深度的深入理解总结。

层级物体的销毁

单个物体的查找与销毁

若要在层级面板中找到某个物体并将其销毁,可使用以下代码:

GameObject obj = GameObject.Find("所要找的名字");
Destroy(obj);

多个物体的查找与销毁

当需要查找的物体较多时,可以将找到的物体存放在一个数组中。若物体的名字按照顺序或一定规律命名,还能通过for循环统一查找并赋值。例如,物体的名字依次为house1house2,……,house10,可按如下方式处理:

string str;
GameObject[] a = new GameObject[11]; // 数组长度根据实际情况调整
for (int i = 1; i < 11; i++)
{
str = "house";
str = str + i;
a[i] = GameObject.Find(str);
Destroy(a[i]); // 销毁找到的物体
}

通过标签查找物体

还可以使用GameObject.FindWithTag("标签名")方法来查找物体,但前提是要给这些物体添加相应的标签。

NGUI层级关系与非层级关系

NGUI层级关系

NGUI层级关系是创建时默认的层级关系,包含UIRootCameraanchorpanel

非NGUI层级关系

非NGUI层级关系是以Camera为基础,在其中创建控件。不过,Camera需要挂载UIcameraUIpanel脚本。

关于NGUI深度、层次总结(做过很多NGUI界面后理解会更深刻)

同一panel下,同一atlas的不同sprite

在同一个panel下,使用同一个atlas的不同sprite的显示仅受depth控制,这是最常用的方式。此时,不论精灵的z轴如何变化,depth值高的精灵一定显示在前面(相同atlas其实是共用同一个Z轴深度)。

不同panel下,同一atlas的不同sprite

在不同panel下,使用同一个atlas的不同sprite不受depth控制,而是受z轴控制。此时,只需稍微调节其中一个精灵的z轴,例如设置为0.1,就可以控制sprite的显示。

不同panel下,不同atlas的精灵

不同panel下,使用不同atlas的精灵的穿插显示受z轴控制。

同一panel下,不同Atlas的sprite

在同一个panel下,使用不同Atlasspritez轴控制,depth不起作用。

在项目中制作较为复杂的界面时,经常会用到多个图集。以技能界面为例,项目中常用的图片会放到共用图集中,这是一个图集;技能界面本身独有的元素,如跟技能职业相关的背景,算作第二个图集;还有一些技能图标,会单独归类到一个图集中;另外就是字体的图集。基本一个界面如此划分,最多需要4个图集。

NGUI的图集之间的处理,默认是通过调整控件的Z值来区分的,但这种方式存在不足。在调整同一个图集每个控件的Z值时,经常会出现图层相互遮挡的情况,尤其是对于控件较多的界面。当一段时间后再回来修改界面时,会让人感到十分棘手。

我的做法是,在UIPanel中,为每一个Material添加一个layer变量。当处于同一图层时,靠depth来决定前后关系;不同图层则靠layer来决定前后关系。在绘制UIDrawCall时,根据layer对根节点做一定偏移。这样就能摆脱对Z值的依赖。

如果大家在项目中也遇到了图层相关的问题,可以参考这种做法。采用这种方法处理图层关系较为简单,在处理过的大量项目UI中,尚未遇到无法解决的情况。

以上就是关于如何让Unity游戏物体立即销毁的一些理解和总结,供大家参考学习。

作者信息

boke

boke

共发布了 1025 篇文章