Unity如何在预制件中关闭所有灯光

时间:2018-05-24 11:14:02

标签: c# unity3d model light

嘿伙计们,我目前正在关注YouTube上的一系列手机游戏,一切都很顺利,游戏工作得很好,除了我有一个问题。

所以游戏的基本操作是从我的预制件中随机选择一个模型,将它放在某个位置,然后一遍又一遍地做同样的事情,直到你松开。

但我刚刚看到,当我创建这个模型(在搅拌机上)时,我在所有这些模型上创建了一些照明系统。所以现在,当它们被实例化时,场景中的光线太多了。我知道我可以简单地在没有灯光的情况下重新导入它们,但问题是我在搅拌机中使用这些模型创建了很多预制件,所以我必须重新启动几乎所有的东西。

我想知道是否有某些脚本或方法可以这样做,所以当实例化预制件时,所有连接到它们的灯都会被禁用。

我还尝试进入导入模型的文件夹或制作的第一个预制件并取消所有灯光(Hemi)但是当GameObject被实例化时,灯光仍在这里。我想这是因为我应该在场景中进行更改,然后将其保存回文件夹中,但我必须再次进行此操作。

以下是制作预制件的方式:

导入的模型 - >第一个预制 - >件(第二预制件) - >分段(最后预制)

它是实例化的片段(所以其他所有片段都是如此)。 谢谢你的帮助:)

3 个答案:

答案 0 :(得分:1)

首先在场景中为要保留的灯光添加标签。例如" scene_lights"

然后访问场景中Light类型的所有GameObjects并将其强度降低到0,但跳过标记" scene_lights"。

void Start()
{
    LightsGO = FindObjectOfType(typeof(Light)) as GameObject[];
    foreach(GameObject thisLight in LightsGO)
    {
        if(thisLight.tag != "scene_lights")
            thisLight.light.intensity = 0;
    }
}

答案 1 :(得分:1)

如果达到最大值,您可以设置最大产生的灯光量并禁用新的瞬间灯光。创建const整数MAX_LIGHTS_COUNT。设置静态整数" lightsCount"用光计数产生的物体,在产卵时增加它并减少死亡"事件。当您产生预制增加计数器时,检查lightsCount> = MAX_LIGHTS_COUNT,然后禁用Light组件。

const int MAX_LIGHTS_COUNT = 20;
static int lightsCount = 0;
...
void someSpawningMethod (...) {
    GameObject instance = Instantiate (prefab) as GameObject;
    if (++lightsCount >= MAX_LIGHTS_COUNT)
        foreach (Light l in instance.GetComponentsInChildren<Light>())
            l.enabled = false;
 }

此外,您可以在游戏开始时禁用所有预制件并禁用灯光。

GameObject[] prefabs;
void Start () {
    foreach (GameObject go in prefabs) 
        foreach (Light l in go.GetComponentsInChildren<Light>())
            Destroy (l);

}

答案 2 :(得分:0)

如果是预制件,您只需编辑预制件即可。 Setactive false或禁用该预制件中的灯并尝试实例化它。