![](images/chestnut/misc/left.gif) |
Unity Мультиплатформенный инструмент для разработки игр |
17.01.2017, 11:30
|
#1
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Как рендерить в Editor скриптах
Генерация 2д иконок.
Сделать в Coustom menu кнопку при нажатии которой будет генерироваться набор Png "скриношотов" 3д моделей.
Вопрос как рендерить в Editor скриптах? Нужно создавать временную с цену с камерой, потом renderToTexture и удалить сцену.
|
(Offline)
|
|
17.01.2017, 11:52
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Вполне нормальное решение...
Можно наверное не делать новые сцены, а взять например не используемый слой (например 31) и запихнуть в него объект, а камере выставить cullingMask на этот слой.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.01.2017, 13:19
|
#3
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Думаю использовать Application.CaptureScreenshot.
Как можно изменить разрешение окна Game?
Ничего не нашел.
public class Generate2DIcons : ScriptableObject
{
[MenuItem ("Custom/Generate2DIcons")]
static void Generate()
{
//Texture2D tex;
EditorApplication.NewScene();
UnityEditor.SceneView.currentDrawingSceneView.maxSize = new Vector2(64f, 64f);
Application.CaptureScreenshot("icon.png");
}
}
|
(Offline)
|
|
17.01.2017, 13:41
|
#4
|
ТЫ ЧООО?
Регистрация: 26.02.2007
Сообщений: 3,369
Написано 2,020 полезных сообщений (для 7,192 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Тута ручками можно
![](http://f5.s.qip.ru/YcnurD68.png)
|
(Offline)
|
|
17.01.2017, 13:52
|
#5
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Сообщение от Evgen
Думаю использовать Application.CaptureScreenshot.
Как можно изменить разрешение окна Game?
Ничего не нашел.
public class Generate2DIcons : ScriptableObject
{
[MenuItem ("Custom/Generate2DIcons")]
static void Generate()
{
//Texture2D tex;
EditorApplication.NewScene();
UnityEditor.SceneView.currentDrawingSceneView.maxSize = new Vector2(64f, 64f);
Application.CaptureScreenshot("icon.png");
}
}
|
1) Скриншот медленнее чем renderToTexture.
2) Зачем морока с обрезанием текстуры? Используй как написали выше отдельную камеру. Сразу отрендеришь в текстуру нужного разрешения.
Еще может быть поможет инфа, что у отдельной камеры можно поставить ортографическую проекцию и изменить размер (size).
|
(Offline)
|
|
17.01.2017, 14:24
|
#6
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Сообщение от ARA
Тута ручками можно
|
У нас тут 21 век, автоматизация понимаешь! ![:)](images/smilies/smile.gif)
Последний раз редактировалось Evgen, 17.01.2017 в 15:46.
|
(Offline)
|
|
17.01.2017, 14:53
|
#7
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Сообщение от Nex
1) Скриншот медленнее чем renderToTexture.
|
Откуда инфа на счет скорости?
Код вырос и какой-то треш, в картинку попадает область вне рендера.
public class Generate2DIcons : ScriptableObject
{
[MenuItem ("Custom/Generate2DIcons")]
static void Generate()
{
int sqr = 256;
RenderTexture rtex = new RenderTexture(sqr,sqr,24);
EditorApplication.NewScene();
Camera.main.aspect = 1.0f;
Camera.main.targetTexture = rtex;
Camera.main.Render();
RenderTexture.active = rtex;
Texture2D tex = new Texture2D(sqr,sqr,TextureFormat.RGB24, false);
tex.ReadPixels(new Rect(0, 0, sqr, sqr), 0, 0);
tex.Apply();
RenderTexture.active = null;
Camera.main.targetTexture = null;
byte[] bytes = tex.EncodeToPNG ();
System.IO.File.WriteAllBytes(Application.dataPath + "/"+"icon.png",bytes);
//Application.CaptureScreenshot("icon.png");
}
}
|
(Offline)
|
|
17.01.2017, 16:15
|
#8
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Сообщение от Evgen
Откуда инфа на счет скорости?
|
Делал запись видео из юнити в файл. При рендере в текстуру в цикле можно играть в игру, а при использовании скриншотов в игру уже проблемно поиграть.
Создаешь новый слой и назначаешь тем объектам, которые нужно рендерить. Слой это справа от "Tag".
Создаешь новую камеру для рендера. Ставишь clearFlags: SolidColor; Culling Mask: имя слоя, который ты создал и назначил объектам; Projection: подойдет вроде любой, но лучше поставить ортографический; Size: такой что бы все объекты попали в камеру, но при этом что бы меньше было пустоты по бокам (короч 1.2 подойдет). Еще у камеры можно в Background задать черный или яркозеленый цвет что бы потом обрезать фон (как сделать прозрачный фон хз).
Создаешь в редакторе (можно и в коде, но зачем?) RenderTexture и назначаешь её в TargerTexture у камеры, которая будет рендерить.
Вешаешь скрипт на рендер камеру, который ниже (можно и свой через элементы меню и прочее, но это уже сам переделывай).
?? Вроде всё ??
Запускаешь игру@смотришь картинку в папке.
using UnityEngine;
public class qwer : MonoBehaviour {
void Start() {
int sqr = 256;
Camera camera = GetComponent<Camera>();
RenderTexture renderTexture = camera.targetTexture;
camera.Render();
RenderTexture.active = renderTexture;
Texture2D tex = new Texture2D(sqr, sqr, TextureFormat.RGB24, false);
tex.ReadPixels(new Rect(0, 0, sqr, sqr), 0, 0);
tex.Apply();
byte[] bytes = tex.EncodeToPNG();
System.IO.File.WriteAllBytes(Application.dataPath + "/" + "icon.png", bytes);
}
}
|
(Offline)
|
|
17.01.2017, 16:24
|
#9
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Сообщение от Nex
?? Вроде всё ??
Запускаешь игру@смотришь картинку в папке.
|
Не.. не.. не.. Давайте без костылей. Когда было мало опыта я тоже их применял. Мне нужна специальная кнопочка в редакторе - нажал и рисунки обновились. Очень удобно.
Собственно внизу код, результат вроде, как надо. Результат не зависит от размера Game окна. Что я собственно не мог побороть в начале.
public class Generate2DIcons : ScriptableObject
{
[MenuItem ("Custom/Generate2DIcons")]
static void Generate(){
EditorWindow.focusedWindow.maxSize = new Vector2 (10, 10);
// Создаем сцену
EditorApplication.NewScene();
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = new Vector3(0, 1, -7);
cube.transform.rotation = Quaternion.Euler(45,45,0);
SaveScreenshoot("cube.png");
DestroyImmediate(cube);
Debug.Log("Ok");
}
static void SaveScreenshoot(string name){
// Делаем скриншот
int sqr = 256;
RenderTexture rtex = new RenderTexture(sqr,sqr,24);
Camera.main.targetTexture = rtex;
Camera.main.Render();
RenderTexture.active = rtex;
Texture2D tex = new Texture2D(sqr,sqr,TextureFormat.RGB24, false);
tex.ReadPixels(new Rect(0, 0, sqr, sqr), 0, 0);
tex.Apply();
RenderTexture.active = null;
Camera.main.targetTexture = null;
byte[] bytes = tex.EncodeToPNG ();
System.IO.File.WriteAllBytes(Application.dataPath + "/"+name,bytes);
}
}
Не знаю для чего здесь нужно вот это:
EditorWindow.focusedWindow.maxSize = new Vector2 (10, 10);
но вроде нужно.
|
(Offline)
|
|
17.01.2017, 16:31
|
#10
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Ты как раз костылей наделал.
Что будет если окно не в фокусе?
Для чего новая сцена???
Кнопочка в редакторе дело вкуса, принцип не меняется.
Фикс:
Что бы был прозрачный фон нужно:
Поставить у камеры, которая рендерит ClearFlags: DepthOnly и заменить строку в коде:
Texture2D tex = new Texture2D(sqr, sqr, TextureFormat.RGB24, false);
|
на
Texture2D tex = new Texture2D(sqr, sqr, TextureFormat.ARGB32, false);
|
Еще хотел возразить насчет того, что твой код гуглиться по первой ссылке при запросе "unity3d render texture to file".
Так собственно зачем спрашивать совета на форуме когда ты в конечном итоге взял готовый стремный код из гугла и доволен?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.01.2017, 17:22
|
#11
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Как рендерить в Editor скриптах
Сообщение от Nex
Ты как раз костылей наделал.
Что будет если окно не в фокусе?
|
Пока не сталкивался. Все работает. Как можно этот "баг" симулировать?
Сообщение от Nex
Для чего новая сцена???
|
Чтобы не разрушать текущую открытую сцену, создается временная новая.
Сообщение от Nex
Кнопочка в редакторе дело вкуса, принцип не меняется.
|
Нет задумывалось именно средствами редактора. Делаешь проект, добавил новые 3D элементы. Нажал кнопку в редакторе обновил общий атлас иконок. Далее запустил проект проверил как отрисовалось GUI.
Сообщение от Nex
Фикс:
Что бы был прозрачный фон нужно:
Поставить у камеры, которая рендерит ClearFlags: DepthOnly и заменить строку в коде:...
|
Не уверен, что это так просто реализуемо... Кстати RenderTexture вроде не поддерживает альфа канал.
Сообщение от Nex
Еще хотел возразить насчет того, что твой код гуглиться по первой ссылке при запросе "unity3d render texture to file".
Так собственно зачем спрашивать совета на форуме когда ты в конечном итоге взял готовый стремный код из гугла и доволен?
|
Похожий код из гугла != готовый != рабочий. Код составлен из разных фрагментов. Если нет ответа, приходится гуглить и это нормально. Код вполне красивый, но нужно еще немного доработать.
Последний раз редактировалось Evgen, 18.01.2017 в 16:25.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:48.
|