Эх, помню три года назад когда только начинал путь в программирование и разработку игр, увидел демонстрацию такого же шейдера. Он меня привёл в поросячий восторг, и я считал что чтобы сделать его, нужно быть гуру. Но оказалось всё на много проще, сидел, делать нечего, вспомнил про эту штуку, сделал за 10 минут :c
четверг, 26 декабря 2013 г.
понедельник, 23 декабря 2013 г.
Вещи которые вы возможно не знали о Unity3D [Хабра]
О чём телега
Я бы хотел описать возможности, ну и частично особенности которые присутствуют при разработке на данном движке. С Unity3D работаю уже около трёх лет, так что мыслей накопилось достаточно для средненькой такой статьи. Местами буду через чур мудрить, и рассказывать о том что вам вряд ли пригодится, но по большой части рассказ будет о очень простых и часто используемых вещах (если знать о них конечно).Режим редактора для дебага.
Знаете такие моменты, когда у нас есть приватное поле у компонента, и нам нужно посмотреть его значение? Я раньше всегда либо выводил его значение в лог, или по быстрому отмечал нужными атрибутами его или вовсе делал public. Но есть способ на много круче.Для демонстрации я создал простой компонент:
using UnityEngine;
using System.Collections;
public class PrivateFieldTest : MonoBehaviour {
private int Score;
}
Как видно на скриншоте, всё приватное отображается более тёмным цветом. Так же значительно изменился интерфейс, для работы такой режим не годиться, да и жутко не удобно, но для дебага самое оно. Конечно это вряд ли пригодиться если подключить сторонний дебагер, но фича полезная. Так же на сколько я понимаю, при данном режиме не работают всяческие кастомайзеры компонентов. Допустим так выглядит окно с настройками билда при режиме дебага.Start, it's trap
Метод старт может работать как корутин. С Update допустим не прокатит такой ход конём.using UnityEngine;
using System.Collections;
public class StartIsCorutineTest : MonoBehaviour {
IEnumerator Start ()
{
print("I'm wait 5 second!");
yield return new WaitForSeconds(5);
print("I'm done!");
}
}
Это достаточно полезно когда в старте что нибудь может вызывать не которые задержки. Конечно, можно вызывать корутин прямо из старта, но так согласитесь лаконичней.
SendMessage. Или штука которая делает вам приятно.
Я долго думал, стоит ли добавлять описание данной возможности, ибо многие и так об этом знают, но у меня оказалась пара коллег для которых данная штука оказалась открытием. Фишка то в чём. Допустим, у нас есть некий компонент и ему нужно срочно сообщить другому компоненту что-то важное. Какой обычно подход:gameObject.GetComponentОчень увлекательно, слегка массивный синтаксис (но все же мы видели C++ по новым канонам). Но главная проблема кроется в том, что мы должны знать тип компонента на который получаем ссылку. SendMessage помогает избавиться от этого нюанса, и ему нужно только знать имя метода и аргументы.().TakeDamage(60);
gameObject.SendMessage("TakeDamage", 60);
Проблема конечно, что не возвращает то что должен возвращать вызываемый метод. Но мы можешь создать план капкан, и получить свой маленький JS который к слову есть но это на самом деле не JS. Допустим передав в аргументах call back функцию для принятия значений для возврата. Это стильно, модно, молодёжно и не должно порицаться в современном и толерантном обществе. А ещё могут быть проблемы если весит компонент у которого естьметод с таким же названием.
Scale объекта ломает батчинг мешей
Последнее время участились вопросы на эту тему. Частично это так, сюда бы отлично зашла картинка выше. Велик шанс что он сломается, но может и не сломаться. Тут много факторов, обратимся к офф справке: - Для Dynamic Batching как правило, объекты должны иметь одинаковый Scale, исключением является то что если все объекты не равномерно масштабированы то они могут склеиться. Что это значит я сам не до конца понял, по этому просто не масштабирую. Если батчинг сломается, то это приведёт к увеличению Draw Call, что очень плохо.Выбранный объект можно закрепить в инспекторе
Полезно когда у нас очень много объектов в сцене, и нам нужно поместить ссылку на один из них в какой нибудь компонент, который уже на одном из объектов. Как правило, хватает выделения объект с компонентом, и перетаскивание объекта из иерархии. Но может появиться проблема когда оба объекта достаточно далеки друг от друга (в иерархии) из-за чего может начаться нервный тик. Но есть маленький замочек который фиксирует инспектор на определённом объекте.Так же можно открыть много вкладок с инспектором и зажимать нужные на нужных объектах.
WWW Утечка памяти.
У класса WWW есть очень серьёзное проблема, которая даёт о себе знать когда нужно загрузить много текстур. В справке в пример приводится следующий код: IEnumerator Start() {
WWW www = new WWW(url);
yield return www;
renderer.material.mainTexture = www.texture;
}
Проблема в том, что если получать текстуру через поле то создаётся новая текстура, каждый раз, которая ещё и не хочет и из памяти выгружаться.
В итоге я применил такой код, который позволяет от этого избавиться:
//код урезан в дедуктивных целях.
public override void OnWWWFinish(WWW www)
{
Texture2D tex = new Texture2D(4, 4, TextureFormat.RGB24, false, false);
www.LoadImageIntoTexture(tex);
tex.Compress(false);
www.Dispose();
}
Прощальные слова
За один присест вспомнить удалось не много, а описать с ходу и того меньше. Но надеюсь описал действительно интересный вещи, в основном конечно по редактору. Правильно ли сделал что начал с мелочей? Я не знаю. Понравится, напишу ещё, не понравится, всё равно напишу.воскресенье, 3 ноября 2013 г.
Парсинг сайтов на C#.
Для одного из своих приложений мне понадобилось достаточно много информации которой полно на различных wiki но всё это собирать вручную достаточно геморно. По этому я решил вооружится C# и распарсить всё что мне надо. Мы будем использовать хорошую библиотеку Html Agility Pack которая берёт на себя большую часть работы и предоставляет для нас удобное DOM дерево с которым мы можем работать. Она поддерживает XPath запросы, LINQ и много всего вкусного.
воскресенье, 27 октября 2013 г.
Механизм исключений C#.
Не преодолев желания налабать что нибудь в блог, решил написать не
большую статейку об исключениях в C#. Я не буду писать много воды и
перейду сразу к делу. Логически я разделю статью на две части, обработка
и выброс исключений. Собственно больше о них сказать мне не чего.
Отлов исключений
Для отлова исключений в C# предусмотрено три ключевых слова, все они относятся к одной системе и работает на подобии оператора if-else. Это try\catch\finaly. В тело оператора try помещается код, за которым нужно будет так сказать проследить. Catch блок обработки определённого исключения а finaly блок который будет вызван после обработки исключения для того что бы освободить ресурсы. Но по меньше лирики перейдём к коду :
Не много об исключениях
Для начала определимся что такое исключения, и для чего они вообще нам нужны. На сколько мне известно, в достаточно старых языках таких как Си, для контроля за работай программы использовали примитивные способы, на подобие возврата кода ошибки из функции. Удобного в этом мало, да и попросту забыть проконтролировать код ошибки очень просто из-за чего может начаться не контролируемое поведения программы и бессонная ночь отловки бага :) Конечно в Си с помощью макросов и прочего есть не что подобное. Но в более поздних языках это представлено более лаконично. И так, смоделируем ситуацию, допустим у нас есть некий метод который принимает пользовательский объект для последующей работы с ним. А теперь представим что мы в эту функции передали выражение со значением null. Что будет? Если метод попробует начать работу с пустышкой, система выбросит NullReferenceException, но по хорошему метод перед работай проверить правильность всех аргументов и сам выбросить нужные исключения. Выброшенная ошибка будет распространятся вверх по цепочки вызовов пока её не отловят или она не достигнет верхней точки и программа не завершится аварийно. Думаю теперь понятно зачем нужен механизм исключений?Отлов исключений
Для отлова исключений в C# предусмотрено три ключевых слова, все они относятся к одной системе и работает на подобии оператора if-else. Это try\catch\finaly. В тело оператора try помещается код, за которым нужно будет так сказать проследить. Catch блок обработки определённого исключения а finaly блок который будет вызван после обработки исключения для того что бы освободить ресурсы. Но по меньше лирики перейдём к коду :
....try{ SomeObject _so; _so.SomeMethod();}catch(NullReferenceExcepetion e){ //Обработка NullReferenceExeption}catch(Exception e){ //Обработка вообще всех исключений}finaly{ //Блок который вызовется после обработки исключения // (если исчклюения не было блок не вызовется)}.... |
"Выброс" своих исключений
Для инициирования своих исключений в C# предусмотрен оператор throw. Справа от оператора указывается выражения которое имеет тип производный от System.Exception.Проще говоря нужно указать ссылку на класс который пронаследован от System.Exception. Так же в .Net Framework пред усмотрена куча классов для этих дел, но при желание вы можете создать свои. В общем синтаксис примерно такой:
public class ThrowTest2 { static int GetNumber(int index) { int[] nums = { 300, 600, 900 }; if(index > nums.Length) { throw new IndexOutOfRangeException(); } return nums[index]; } static void Main() { int result = GetNumber(3); }} |
Резюмируя
В заключения хочу сказать что можно найти ещё кучу всего интересного об исключениях в C#, я же взялся рассказать базовые возможности. Свои замечания пишите в комментариях, постараюсь поправить статью если что не так :)пятница, 13 сентября 2013 г.
Впечатление от книги "C++ для профессионалов"
Достаточно давно я прочитал "Базовый курс C++" от Шилдта, книга в целом хорошая и я познал базовый синтаксис C++. Но всё не было времени практиковать да и по работе писал на C# так что частично знания C++ пропали а когда я начинал на нём писать и вовсе был некий страх что что-то делаю не так, как будто хожу по охерено тонкому льду а под ним меня ждёт разыменования нулевого указателя. Но вот один мой знакомый предложил мне написать с ним ASCII RPG, от чего я не мог отказаться. И вот я сел за написание движка и опять этот страх. Решил что так жить нельзя и нагуглил "Николас А. Солтер, Скотт Дж. Клепер - C++ для профессионалов". Сказать что книга развеила мои страхи это ни чего не сказать. Она помогла переосмыслить многие вещи в ООП и понять как работает C++ в самых "низах". В общем, всем советую! В начале идёт быстрый прогон по базовому синтаксису C++ так что если вы когда то его знали или не плохо программируете на C подобных языках, то в целом книга поможет вам начать путь к действительно толковому программированию на С++.
Проба пера в создании заставки к видео.
Давича отрубили мне интернет, и я вспомнил что мне не помешала бы заставка для видео туториалов. Ну вот открыл я Adobe After Effects ии.. всё пропало. Точнее из-за кряка всё не захотело нормально работать и я решил склепать что нибудь простенькое в Sony Vegas. В итоге получилось вот что.
Видео
Видео
среда, 11 сентября 2013 г.
RayCast Tutorial
Записал новый туториал, который планировал очень давно но всё не как не было возможности. Но вот я купил новый микрофон, к слову микрофон достаточно не плохой, вокальный все дела, но звуковая карта из мат платы по этому этого почти не заметно :)
Видео
Видео
Подписаться на:
Сообщения (Atom)