lightmaps & lods EditorScript

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

lightmaps & lods EditorScript

Сообщение gnoblin 28 май 2012, 22:03

привет!
подскажите как лучше сделать, или может есть готовое решение где-то )

мне короче надо чтобы на всех лодах кроме самого детального в лодгруппе - отрубались птички лайтмап статик на автомате
и чтобы сетинги лайтмапы после запекания переносились с самого детального лода на все остальные.

как выключить птичку и перенести настройки - я знаю, мне интересно может уже есть какой-то эдитор скрипт на эту тему (в общем доступе или кто-то писал для себя),
и кто что думает про возможные подходы к реализации (по какому принципу вызывать этот код) :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: lightmaps & lods EditorScript

Сообщение gnoblin 29 май 2012, 20:28

up
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: lightmaps & lods EditorScript

Сообщение gnoblin 31 май 2012, 20:24

Второй вариант скрипта - убирает птички lightmap static :), переносит lightmapIndex и tilingOffset.

Пока не получилось изменить Scale in Lightmap (почему-то не применяются изменения) - поэтому если этот параметр сбит в менее детальных лодах, меняем ручками :D.

Обсуждение как получить доступ к лодам

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////бист запекает на каждый лод свой кусочек лайтмапы
////не выгодно по внешнему виду и месту
////и мы хотим запекать лайтмапу только для самого детального объекта, а для всех остальных стадий юзать этот же кусочек
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class LodLMSettingsFixer
{
    //у всех лодов кроме самого детального (нулевого) отключаем птичку lightmap static
    [MenuItem("GameObject/LODFixBeforeBeast")]
    static void LODFixBeforeBeast()
    {
        LODGroup[] lods = Object.FindObjectsOfType(typeof(LODGroup)) as LODGroup[];
        Debug.Log("blabla1 " + lods.Length);

        for (int j = 0; j < lods.Length; j++)
        {
            /////////////////
            LODGroup prefabLodCmp = lods[j];
            SerializedObject obj = new SerializedObject(prefabLodCmp);

            //у всех лодов кроме самого детального (нулевого) отключаем птичку lightmap static
            for (int i = 1; i < prefabLodCmp.lodCount; i++)
            {
                SerializedProperty prop = obj.FindProperty("m_LODs.Array.data[" + i.ToString() + "].renderers");

                for (int k = 0; k < prop.arraySize; k++)
                {
                    SerializedProperty propRenderer = prop.GetArrayElementAtIndex(k).FindPropertyRelative("renderer");

                    string _name = propRenderer.objectReferenceValue.name;
                    Debug.Log(_name);

                    GameObject go = lods[j].transform.Find(_name).gameObject;
                    //отключаем птичку LightmapStatic, если она включена
                    if (GameObjectUtility.AreStaticEditorFlagsSet(go, StaticEditorFlags.LightmapStatic))
                    {
                        GameObjectUtility.SetStaticEditorFlags(go, ~(GameObjectUtility.GetStaticEditorFlags(go) & StaticEditorFlags.LightmapStatic));
                    }
                }
            }
        }

    }

    //переносим настройки лайтмапы с самого детального лода на все остальные
    //!!!!! NOTE: на каждом лод-уровне должно быть одинаковое количество рендереров
    [MenuItem("GameObject/LODFixAfterBeast")]
    static void LODFixAfterBeast()
    {
        LODGroup[] lods = Object.FindObjectsOfType(typeof(LODGroup)) as LODGroup[];
        Debug.Log("blabla2 " + lods.Length);

        ///...цикл по всем объектам на уровне
        for (int j = 0; j < lods.Length; j++)
        {
            LODGroup prefabLodCmp = lods[j];
            SerializedObject obj = new SerializedObject(prefabLodCmp);

            int[] lightmapIndex = null;
            Vector4[] lightmapTilingOffset = null;
            int renderer_count = obj.FindProperty("m_LODs.Array.data[0].renderers").arraySize;

            lightmapIndex = new int[renderer_count];
            lightmapTilingOffset = new Vector4[renderer_count];

            float[] scale_in_lightmap = new float[renderer_count];

            //переносим настройки лайтмапы с самого детального лода на все остальные
            ///...цикл по всем подлодам объекта
            for (int i = 0; i < prefabLodCmp.lodCount; i++)
            {
                SerializedProperty prop = obj.FindProperty("m_LODs.Array.data[" + i.ToString() + "].renderers");

                if (i == 0)
                {
                    ///бекапим настройки лайтмапы с самого детального лода!
                    for (int k = 0; k < prop.arraySize; k++)
                    {
                        SerializedProperty propRenderer = prop.GetArrayElementAtIndex(k).FindPropertyRelative("renderer");
                        string _name = propRenderer.objectReferenceValue.name;
                        Debug.Log(_name);
                        GameObject go = null;

                        if (lods[j].name == _name)
                        {
                            //для случая когда нулевой лод это объект с лодгруппой (криво, я бы так не складывал их в иерархии)
                            go = lods[j].gameObject;
                        }
                        else
                        {
                            go = lods[j].transform.Find(_name).gameObject;
                        }

                        lightmapIndex[k] = go.renderer.lightmapIndex;
                        lightmapTilingOffset[k] = go.renderer.lightmapTilingOffset;

                        SerializedObject so = new SerializedObject(go.renderer);
                        scale_in_lightmap[k] = so.FindProperty("m_ScaleInLightmap").floatValue;
                        Debug.Log(scale_in_lightmap[k]);
                    }
                }
                else
                {
                    ///копируем забекапленые настройки лайтмапы на менее детальные лоды!

                    for (int k = 0; k < renderer_count; k++)
                    {
                        SerializedProperty propRenderer = prop.GetArrayElementAtIndex(k).FindPropertyRelative("renderer");
                        string _name = propRenderer.objectReferenceValue.name;
                        Debug.Log(_name);
                        GameObject go = lods[j].transform.Find(_name).gameObject;

                        go.renderer.lightmapIndex = lightmapIndex[k];
                        go.renderer.lightmapTilingOffset = lightmapTilingOffset[k];

                        //пока не пашет, ставим руками если сбилось))
                        //SerializedObject so = new SerializedObject(go.renderer);
                        //so.FindProperty("m_ScaleInLightmap").floatValue = scale_in_lightmap[k];
                        //so.ApplyModifiedProperties();
                    }
                }
            }

           

        }
    }
}
//lightmapIndex = new int[rends0.Length];
//lightmapTilingOffset = new Vector4[rends0.Length];
//for (k = 0; k < rends0.Length; k++)
//{
//    lightmapIndex[k] = rends0[k].lightmapIndex;
//    lightmapTilingOffset[k] = rends0[k].lightmapTilingOffset;
//}
//rends1[k].lightmapIndex = lightmapIndex[k];
//rends1[k].lightmapTilingOffset = lightmapTilingOffset[k];


//всё ок тока не ставился Scale in Lightmap

//SerializedObject so = new SerializedObject(go.renderer);
//so.FindProperty("m_ScaleInLightmap").floatValue = 0;
//so.ApplyModifiedProperties();
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1