Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity

Unity Мультиплатформенный инструмент для разработки игр

Ответ
 
Опции темы
Старый 17.01.2017, 11:30   #1
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Как рендерить в Editor скриптах

Генерация 2д иконок.
Сделать в Coustom menu кнопку при нажатии которой будет генерироваться набор Png "скриношотов" 3д моделей.
Вопрос как рендерить в Editor скриптах? Нужно создавать временную с цену с камерой, потом renderToTexture и удалить сцену.
(Offline)
 
Ответить с цитированием
Старый 17.01.2017, 11:52   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Как рендерить в Editor скриптах

Вполне нормальное решение...
Можно наверное не делать новые сцены, а взять например не используемый слой (например 31) и запихнуть в него объект, а камере выставить cullingMask на этот слой.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Evgen (17.01.2017)
Старый 17.01.2017, 13:19   #3
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
ARA
ТЫ ЧООО?
 
Аватар для ARA
 
Регистрация: 26.02.2007
Сообщений: 3,369
Написано 2,020 полезных сообщений
(для 7,192 пользователей)
Ответ: Как рендерить в Editor скриптах

Тута ручками можно
(Offline)
 
Ответить с цитированием
Старый 17.01.2017, 13:52   #5
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 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
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Ответ: Как рендерить в Editor скриптах

Сообщение от ARA Посмотреть сообщение
Тута ручками можно
У нас тут 21 век, автоматизация понимаешь!

Последний раз редактировалось Evgen, 17.01.2017 в 15:46.
(Offline)
 
Ответить с цитированием
Старый 17.01.2017, 14:53   #7
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 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
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
RegIon (17.01.2017)
Старый 17.01.2017, 17:22   #11
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 10:26.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com