Что надо сделать для создания. Создание бренда с нуля: опыт маркетологов. Техническая реализация с помощью конструктора или CMS-платформы

Даже средний Unity3D проект очень быстро наполняется большим количеством разнообразных скриптов и возникает вопрос взаимодействия этих скриптов друг с другом.
Данная статья предлагает несколько различных подходов к организации таких взаимодействий от простого до продвинутого и описывает к каким проблемам может привести каждый из подходов, а так же предложит способы решения этих проблем.

Подход 1. Назначение через редактор Unity3D

Пусть у нас в проекте есть два скрипта. Первый скрип отвечает за начисление очков в игре, а второй за пользовательский интерфейс, который, отображает количество набранных очков на экране игры.
Назовем оба скрипта менеджерами: ScoresManager и HUDManager.
Каким же образом менеджеру, отвечающему за меню экрана можно получить текущее количество очков от менеджера, отвечающего за начисление очков?
Предполагается, что в иерархии объектов(Hierarchy) сцены существуют два объекта, на один из которых назначен скрипт ScoresManager, а на другой скрипт HUDManager.
Один из подходов, содержит следующий принцип:
В скрипте UIManager определяем переменную типа ScoresManager:

Public class HUDManager: MonoBehaviour { public ScoresManager ScoresManager; }
Но переменную ScoresManager необходимо еще инициализировать экземпляром класса. Для этого выберем в иерархии объектов объект, на который назначен скрипт HUDManager и в настройках объекта увидим переменную ScoresManager со значением None.

После чего, у нас появляется возможность из кода HUDManager обращаться к скрипту ScoresManager, таким образом:

Public class HUDManager: MonoBehaviour { public ScoresManager ScoresManager; public void Update () { ShowScores(ScoresManager.Scores); } }
Все просто, но игра, не ограничивается одними набранными очками, HUD может отображать текущие жизни игрока, меню доступных действия игрока, информацию о уровне и многое другое. Игра может насчитывать в себе десятки и сотни различных скриптов, которым нужно получать информацию друг от друга.
Чтобы получить в одном скрипте данные из другого скрипта нам каждый раз придется описывать переменную в одном скрипте и назначать (перетаскивать вручную) ее с помощью редактора, что само по себе нудная работа, которую легко можно забыть сделать и потом долго искать какая из переменных не инициализирована.
Если мы захотим что-то отрефакторить, переименовать скрипт, то все старые инициализации в иерархии объектов, связанные с переименованным скриптом, сбросятся и придется их назначать снова.
В то же время, такой механизм не работает для префабов (prefab) - динамического создания объектов из шаблона. Если какому-либо префабу нужно обращаться к менеджеру, расположенному в иерархии объектов, то вы не сможете назначить самому префабу элемент из иерархии, а придется сначала создать объект из префаба и после этого программно присвоить экземпляр менеджера переменной только что созданного объекта. Не нужная работа, не нужный код, дополнительная связанность.
Следующий подход решает все эти проблемы.

Подход 2. «Синглтоны»

Применим упрощенную классификацию возможных скриптов, которые используются при создании игры. Первый тип скриптов: «скрипты-менеджеры», второй: «скрипты-игровые-объекты».
Основное отличие одних от других в том, что «скрипты-менеджеры» всегда имеют единственный экземпляр в игре, в то время как «скрипты-игровые-объекты» могут иметь количество экземпляров больше единицы.

Примеры

Как правило, в единственном экземпляре существуют скрипты, отвечающие за общую логику пользовательского интерфейса, за проигрывание музыки, за отслеживание условий завершения уровня, за управление системой заданий, за отображение спецэффектов и так далее.
В то же время, скрипты игровых объектов существуют в большом количестве экземпляров: каждая птичка из «Angry Birds» управляется экземпляром скрипта птички со своим уникальным состоянием; для любого юнита в стратегии создается экземпляр скрипта юнита, содержащий его текущее количество жизней, позицию на поле и личную цель; поведение пяти разных иконок обеспечивается различными экземплярами одних и тех же скриптов, отвечающих за это поведение.
В примере из предыдущего шага скрипты HUDManager и ScoresManager всегда существуют в единственном экземпляре. Для их взаимодействия друг с другом применим паттерн «синглтон» (Singleton, он же одиночка).
В классе ScoresManager опишем статическое свойство типа ScoresManager, в котором будет храниться единственный экземпляр менеджера очков:

Public class ScoresManager: MonoBehaviour { public static ScoresManager Instance { get; private set; } public int Scores; }
Осталось инициализировать свойство Instance экземпляром класса, который создает среда Unity3D. Так как ScoresManager наследник MonoBehaviour, то он участвует в жизненном цикле всех активных скриптов в сцене и во время инициализации скрипта у него вызывается метод Awake. В этот метод мы и поместить код инициализации свойства Instance:

Public class ScoresManager: MonoBehaviour { public static ScoresManager Instance { get; private set; } public int Scores; public void Awake() { Instance = this; } }
После чего, использовать ScoresManager из других скриптов можно следующим образом:

Public class HUDManager: MonoBehaviour { public void Update () { ShowScores(ScoresManager.Instance.Scores); } }
Теперь нет необходимости в HUDManager описывать поле типа ScoresManager и назначать его в редакторе Unity3D, любой «скрипт-менеджер» может предоставлять доступ к себе через статическое свойство Instance, которое будет инициализировать в функции Awake.

Плюсы

- нет необходимости описывать поле скрипта и назначать его через редактор Unity3D.
- можно смело рефакторить код, если что и отвалится, то компилятор даст знать.
- к другим «скриптам-менеджерам» теперь можно обращаться из префабов, через свойство Instance.

Минусы

- подход обеспечивает доступ только к «скриптам-менеджерам», существующим в единственном экземпляре.
- сильная связанность.
На последнем «минусе» остановимся подробнее.
Пусть мы разрабатываем игру, в которой есть персонажи (unit) и эти персонажи могут погибать (die).
Где-то находится участок кода, который проверяет не погиб ли наш персонаж:

Public class Unit: MonoBehaviour { public int LifePoints; public void TakeDamage(int damage) { LifePoints -= damage; if (LifePoints <= 0) Die(); } }
Каким образом игра может отреагировать на смерть персонажа? Множеством разнообразных реакций! Приведу несколько вариантов:
- надо удалить персонажа из сцены игры, чтобы он больше не отображался на ней.
- в игре начисляются очки за каждого погибшего персонажа, нужно их начислить и обновить значение на экране.
- на специальной панели отображаются все персонажи в игре, где мы можем выбрать конкретного персонажа. При смерти персонажа, нам нужно обновить панель, либо убрать персонажа с нее, либо отобразить что он мертв.
- нужно проиграть звуковой эффект смерти персонажа.
- нужно проиграть визуальный эффект смерти персонажа (взрыв, брызги крови).
- система достижений игры имеет достижение, которое считает общее число убитых персонажей за все время. Нужно добавить к счетчику только что умершего персонажа.
- система аналитики игры отправляет на внешний сервер факт смерти персонажа, нам этот факт важен для отслеживания прогресса игрока.
Учитывая все вышеперечисленное, функция Die может выглядеть следующим образом:

Private void Die() { DeleteFromScene(); ScoresManager.Instance.OnUnitDied(this); LevelConditionManager.Instance.OnUnitDied(this); UnitsPanel.Instance.RemoveUnit(this); SoundsManager.Instance.PlayUnitDieSound(); EffectsManager.Instance.PlaySmallExplosion(); AchivementsManager.Instance.OnUnitDied(this); AnaliticsManager.Instance.SendUnitDiedEvent(this); }
Получается, что персонаж после совей смерти должен разослать всем компонентам, которые в ней заинтересованы этот печальный факт, он должен знать о существовании этих компонентов и должен знать, что они им интересуются. Не слишком ли много знаний, для маленького юнита?
Так как игра, по логике, очень связанная структура, то и события происходящие в других компонентах интересуют третьи, юнит тут ничем не особенный.
Примеры таких событий (далеко не все):
- Условие прохождение уровня зависит от количества набранных очков, набрали 1000 очков – прошли уровень (LevelConditionManager связан с ScoresManager).
- Когда набираем 500 очков, достигаем важную стадию прохождения уровня, нужно проиграть веселую мелодию и визуальный эффект (ScoresManager связан с EffectsManager и SoundsManager).
- Когда персонаж восстанавливает здоровье, нужно проиграть эффект лечения над картинкой персонажа в панели персонажа (UnitsPanel связан с EffectsManager).
- и так далее.
В результате таких связей мы приходим к картине похожей на следующую, где все про всех все знают:

Пример со смертью персонажа немного преувеличен, сообщать о смерти (или другом событии) шести разным компонентам не так часто приходится. Но варианты, когда при каком-то событии в игре, функция, в которой произошло событие, сообщает об этом 2-3 другим компонентам встречается сплошь и рядом по всему коду.
Следующий подход пытается решает эту проблему.

Подход 3. Мировой эфир (Event Aggregator)

Введем специальный компонент «EventAggregator», основная функция которого хранить список событий, происходящих в игре.
Событие в игре - это функционал, предоставляющий любому другому компоненту возможность как подписаться на себя, так и опубликовать факт совершения этого события. Реализация функционала события может быть любой на вкус разработчика, можно использовать стандартные решения языка или написать свою реализацию.
Пример простой реализации события из прошлого примера (о смерти юнита):

Public class UnitDiedEvent { private readonly List> _callbacks = new List>(); public void Subscribe(Action callback) { _callbacks.Add(callback); } public void Publish(Unit unit) { foreach (Action callback in _callbacks) callback(unit); } }
Добавляем это событие в «EventAggregator»:

Public class EventAggregator { public static UnitDiedEvent UnitDied; }
Теперь, функция Die из предыдущего примера с восемью строчками преобразуется в функцию с одной строчкой кода. Нам нет необходимости сообщать о том, что юнит умер всем заинтересованным компонентам и знать о этих заинтересованных. Мы просто публикуем факт свершения события:

Private void Die() { EventAggregator.UnitDied.Publish(this); }
А любой компонент, которому интересно это событие, может отреагировать на него следующим образом (на примере менеджера отвечающего за количество набранных очков):

Public class ScoresManager: MonoBehaviour { public int Scores; public void Awake() { EventAggregator.UnitDied.Subscribe(OnUnitDied); } private void OnUnitDied(Unit unit) { Scores += CalculateScores(unit); } }
В функции Awake менеджер подписывается на событие и передает делегат, отвечающий за обработку этого события. Сам же обработчик события, принимает в качестве параметра экземпляр умершего юнита и добавляет количество очков в зависимости от типа этого юнита.
Таким же образом, все другие компоненты, кому интересно событие смерти юнита, могут подписаться на него и обработать, когда событие произойдет.
В результате, диаграмма связей между компонентами, когда каждая компонента знала друг о друге, превращается в диаграмму, когда компоненты знают только о событиях, которые происходят в игре (только о интересующих их событиях), но им все равно, от куда эти события пришли. Новая диаграмма будет выглядеть следующим образом:

Я же люблю другую интерпретацию: представьте, что прямоугольник «EventAggregator» растянулся во все стороны и захватил внутрь себя все остальные прямоугольники, превратившись в границы мира. В моей голове, на этой диаграмме «EventAggregator» вообще отсутствует. «EventAggregator» это просто мир игры, некий «игровой эфир», куда различные части игры кричат «Эй, народ! Юнит такой-то умер!», и все прослушивают эфир и если какое-то из услышанных событий их заинтересует, они на него отреагируют. Таким образом - связей нет, каждый компонент независим.
Если я компонент и отвечаю за публикацию какого-то события, то я кричу в эфир мол этот умер, этот получил уровень, снаряд врезался в танк. И мне наплевать интересно кому-нибудь об этом. Возможно, никто не слушает это событие сейчас, а может на него подписана сотня других объектов. Меня, как автора события, это ни грамма не волнует, я про них ничего не знаю и знать не хочу.
Такой подход позволяет легко вводить новый функционал без изменения старого. Допустим, в готовую игру мы решили добавить систему достижений. Мы создаем новую компоненту системы достижений и подписываемся на все интересующие нас события. Никакой другой код не меняется. Не надо ходить по другим компонентам и из них вызывать систему достижений и говорить ей мол и мое событие посчитай пожалуйста. К тому же, все кто публикуют события в мире ничего не знают о системе достижений, даже о факте ее существования.

Замечание

Говоря, что никакой другой код не меняется, я конечно немножко лукавлю. Может оказаться так, что систему достижений интересуют события, которые ранее просто не публиковались в игре, потому как ни одну другую систему до этого не интересовали. И в этом случае, нам нужно будет решить какие новые события добавить в игру и кто будет их публиковать. Но в идеальной игре уже все возможные события есть и эфир наполнен ими по полной.

Плюсы

- не связанность компонентов, мне достаточно просто опубликовать событие, а кого оно интересует не имеет значение.
- не связанность компонентов, я просто подписываюсь на нужные мне события.
- можно добавлять отдельные модули без изменения в существующем функционале.

Минусы

- нужно постоянно описывать новые события и добавлять их в мир.
- нарушение функциональной атомарности.

Последний минус рассмотрим более детально

Представим, что у нас есть объект «ObjectA», в котором вызывается метод «MethodA». Метод «MethodA», состоит из трех шагов и вызывает внутри себя три других метода, которые выполняют эти шаги последовательно («MethodA1», «MethodA2» и «MethodA3»). Во втором методе «MethodA2» происходит публикация какого-то события. И тут происходит следующее: все кто подписан на это событие начнут его обрабатывать, выполняя какую-то свою логику. В этой логике тоже может произойти публикация других событий, обработка которых также может привести к публикации новых событий и так далее. Дерево публикаций и реакции в отдельных случаях может очень сильно разрастись. Такие длинные цепочки крайне тяжело отлаживать.
Но самая страшная проблема, которая тут может произойти, это когда одна из веток цепочки приводит обратно в «ObjectA» и начинает обрабатывать событие путем вызова какого-то другого метода «MethodB». Получается, что метод «MethodA» у нас еще не выполнил все шаги, так как был прерван на втором шаге, и содержит сейчас в себе не валидное состояние (в шаге 1 и 2 мы изменили состояние объекта, но последнее изменение из шага 3 еще не сделали) и при этом начинается выполняться «MethodB» в этом же объекте, имея это не валидное состояние. Такие ситуации порождают ошибки, очень сложно отлавливаются, приводят к тому, что надо контролировать порядок вызова методов и публикации событий, когда по логике этого делать нет необходимости и вводят дополнительную сложность, которую хотелось бы избежать.

Решение

Решить описанную проблему не сложно, достаточно добавить функционал отложенной реакции на событие. В качестве простой реализации такого функционала мы можем завести хранилище, в которое будем складывать произошедшие события. Когда событие произошло, мы не выполняем его немедленно, а просто сохраняем где-то у себя. И в момент наступления очереди выполнения функционала какой-то компоненты в игре (в методе Update, например) мы проверяем на наличие произошедших событий и выполняем обработку, если есть такие события.
Таким образом, при выполнении метода «MethodA» не происходит его прерывание, а опубликованное событие все заинтересованные записывают себе в специальное хранилище. И только после того как к заинтересованным подписчикам дойдет очередь, они достанут из хранилища событие и обработают его. В этот момент весь «MethodA» будет завершен и «ObjectA» будет иметь валидное состояние.

Заключение

Компьютерная игра это сложная структура с большим количеством компонентов, которые тесно взаимодействуют друг с другом. Можно придумать множество механизмов организации этого взаимодействия, я же предпочитаю механизм, описанный мною, основанный на событиях и к которому я пришел эволюционным путем прохода по всевозможным граблям. Надеюсь кому-нибудь он тоже понравится и моя статья внесет ясность и будет полезной.

Большое значение при организации взаимодействия 3d-объектов в пространстве имеет обнаружение столкновений (Сollision detection).

Сollision detection – это способ, с помощью которого анализируется 3D-пространство сцены на предмет столкновений между объектами. Присваивая объекту компонент Collider, мы фактически размещаем вокруг него невидимую сетку – так называемый коллайдер, который имитирует форму объекта и информирует о наличии столкновения с другим объектом. Например, в игре-симуляторе боулинга шары будут иметь простую сферическую форму коллайдера (Sphere collider), в то время как у объектов-кеглей коллайдер будет иметь форму цилиндра/капсулы или, для большей реалистичности столкновений, будет использовать меш (mesh), который является не чем иным, как описанием геометрии 3d-модели. Информация о столкновении коллайдеров поступает в физический движок, который сообщает столкнувшимся объектам их дальнейшую реакцию на это столкновение, основанную на направлении и силе удара, скорости и других факторах. Отметим, что использование коллайдеров, повторяющих форму меша модели, с одной стороны, дает более точное определение столкновений, но в то же время приводит к увеличению затрат на их вычисление.

Рассмотрим особенности столкновений объектов как с использованием непосредственного функционала Сollision detection, предоставляемого Unity3d, так и с помощью программирования такого взаимодействия на языке C#.

Для этого добавим в созданную ранее сцену новый кубический объект, выполняющий роль некоторого препятствия для падающего куба, смоделированного ранее (GameObject > Create Other > Cube), и придадим ему форму параллелепипеда.

Для изменения его формы можно воспользоваться свойствами компонента Transform на панели инспектора компонентов, либо с помощью инструмента масштабирования «Scale», предварительно выбрав геометрический объект. При этом в сцене можно увидеть три разноцветных квадратных куба по разным сторонам объекта, выполняющих роль узлов для изменения его размера в направлении, соответствующем осям координат сцены. Центральный куб позволяет изменять размер одно временно по всем осям координат.

Чтобы лучше увидеть картину взаимодействия куба и прямоугольного препятствия, необходимо развернуть исходное положение падающего куба – на ребро. Вращение выбранного объекта (куба) осуществляется в Unity3d c помощью инструмента «Rotate». При активации этого инструмента вокруг объекта появляется своеобразная сфера, определяющая углы его вращения в трехмерном пространстве. Захватывая и перемещая одну из ее сторон, можно вращать объект произвольным образом.

Рис 1. Сцена с объектами на ней

Далее переключившись в режим просмотра Game, можно наблюдать сцену взаимодействующих в ней объектов. Для определения факта столкновения объектов в Unity3d необходимо отличать эти объекты по их названию. Переименовать объект «Plane» (Плоскость) в объект «Ground», а параллелепипед, представляющий стену (препятствие), в объект «Wall», можно непосредственно выбрав объект в окне иерархии и применив к нему команду «Rename» из контекстного меню, после чего задать новое имя объекта. Отметим, что при разработке проектов в Unity3d разрешается ввод русскоязычных символов, однако при работе со скриптами необходимо использовать латиницу.

Для того чтобы заставить взаимодействовать между собой имеющиеся в сцене трехмерные модели, создадим скрипт на языке программирования C# и назовем его «Dialog» (Project > Create > C# Script).

Создание скриптов – один из наиважнейших моментов в разработке. Код, написанный для использования в Unity, опирается на ряд готовых встроенных классов.

Рассмотрим следующий код:

Первые две строки подключают к скрипту используемые пространства имен. Далее необходимо запомнить, что главным классом в Unity3d является MonoBehaviour. Любой пользовательский скрипт (в описанном случае это Dialog) должен быть его наследником, и неспроста – ведь именно этот класс реализует интеграцию всех объектов в основной цикл программы. Именно это наследование позволяет пользовательскому скрипту (классу) исполнять роль компонента и быть привязанным к игровому объекту.

Здесь метод «OnCollisionEnter» определяет столкновение объекта с другими объектами. А статический метод «Log» класса «Debug» пишет сообщение "Hit Something" в консоль Unity.

После сохранения скрипта добавляем его в качестве компонента для падающего куба. Для этого необходимо сначала выбрать соответствующий объект в окне иерархии и перетащить на него вновь созданный скрипт «Dialog». При этом необходимо обратить внимание на то, что добавленный скрипт также отображается внизу в окне «Inspector» в качестве компонента объекта, к которому он привязан

Теперь, перейдя в режим Play, можно наблюдать, что в тот момент, когда созданный объект куб коснется плоской поверхности, в консоли среды Unity3d (Window > Console) появляется соответствующее сообщение.

Заметьте, что такое сообщение будет выдаваться при каждом столкновении объектов. Причем последнее консольное сообщение отображается в статус (внизу окна).

Для выяснения того, с какими именно объектами столкнулся исходный объект, необходимо использовать значение параметра класса «Collision», которое будет принимать метод «OnCollisionEnter».

Открываем редактор скрипта и вставляем в него следующий код:

После открытия консоли (Window > Console) мы увидим, с какими именно объектами в сцене столкнулся куб. Таким образом, Unity3d позволяет нам оценить возможности взаимодействия объектов внутри среды.

Необходимо добавить префаб в проект (Project > Create > Prefab). В результате на панели Project в окне проекта появится префаб с именем «New Prefab». Переименуем его в «UprugostCube».

Префаб (Prefabs) – это конструкция подготовленных объектов и компонентов, предназначенная для их многократного использования в проекте. Экземпляр префаба может быть добавлен в любое количество сцен, а также многократно в одну сцену. Все экземпляры являются ссылками на оригинальный префаб и, фактически, его «клонами»; имеют те же свойства и компоненты, что и оригинальный объект.

Свойства созданного префаба «UprugostCube» описываются на панели инспектора, а его предварительный вид доступен в окне «Preview».

Для создания пары экземпляров префаба на плоскости необходимо просто его перетащить. В результате на плоскости появятся два куба, а в окне «иерархии» добавится объект с именем соответствующего префаба «UprugostCube».

Переключившись в режим просмотра «Game» и запустив сцену, можно увидеть, что добавленный куб ведет себя точно так же, как и оригинальный, обладая одинаковыми физическими свойствами.

Рассмотрим, каким образом можно удалять объекты в Unity3d в скриптах на языке C#. Для этого в окне «Project» создадим новый скрипт с именем «Destroy» и откроем его в редакторе скриптов MonoDevelop.

Как уже говорилось, при создании C# скрипта Unity создает некий каркас, состоящий из подключенных библиотек и основного класса (используемого скриптом) с методами Start() и Update().

В предыдущих случаях нами рассматривался метод Update, который вызывается каждый раз в новом кадре для каждого компонента всех объектов на сцене.

В данном случае мы воспользуемся методом Start(), который выполняется единожды для каждого компонента сразу после нажатия на кнопку «Play» и, соответственно, должен использоваться для инициализации переменных и придания им каких-либо начальных значений. Добавим в тело метода Start() функцию Destroy() и передадим в нее gameObject, указав таким образом, что скрипт должен уничтожить объект, компонентом которого он является:

Добавим этот скрипт к кубическому объекту, который должен удаляться, с помощью меню компонентов. Теперь после запуска сцены можно убедиться, что добавленный куб при запуске программы сразу пропадает.

Теперь попробуем уничтожить другой объект с помощью его поиска в среде. Для этого воспользуемся статическим методом Find() основного класса GameObject:

В случае необходимости уничтожения объекта не сразу, а спустя какое-то время, можно задать значение во второй параметр функции Destroy:

Далее рассмотрим скрипты, описывающие управление персонажем в трехмерной рабочей среде факультета. Наша среда представляет собой трехмерную модель учебного корпуса №2 ВГСПУ, который полностью занят помещениями факультета МИФ. Первое, что обеспечивает интерактивность, - это возможность обзора 3D пространства с помощью мыши.

Подключаем мышь с помощью данного отрезка скрипта. Переменные sensitivityX и sensitivityY отвечают за чувствительность мыши по вертикальной и горизонтальной осям. Переменные minimumX, maximumX, minimumY, maximumY указывают на какой угол может отклониться камера от начального положения. По оси Х эти значения равны -360 и 360, что означает, что игрок может свободно вращать камеру по оси Х. В вертикальной оси, эти значения равны -60 и 60. То есть, пользователь может отклонить камеру на 60 градусов вверх либо вниз. Для стандартных игр от первого лица эти значения равны -90 и 90.

Этот скрипт привязывается к объекту «камера» и вращает его в сторону, которую смещается мышь, в соответствии с чувствительностью. Если значение угла, принимаемое камерой, выходит за рамки, указанные в максимуме и минимуме, то оно будет возвращено до допустимого значения. Вращение осуществляется стандартной функцией transform.rotate, примененной к объекту «камера».

Теперь, рассмотрим скрипт перемещения в другую локацию по клику мышью на двери.

Рис 2. Среда факультета.

Мы перетаскиваем его на объект Door, тем самым, применяя его к данному объекту.

Когда пользователь, находясь в виртуальной среде, кликает мышью по двери аудитории, все объекты текущей его локации уничтожаются и только после этого загружается сцена аудитории. Такой подход позволяет не держать постоянно в памяти все объекты, задействованные в данном проекте, и выгружает их из памяти, когда они не нужны.

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

У многих директоров при осуществлении процесса создания сайтов возникает вопрос, который касается правильного распределения квалифицированных работников, которые временно или всегда будут осуществлять процесс надзора за сайтом, добавлять новый материал, исправлять ошибки и так далее. Но как правильно выбрать исполнителя? И какой специалист занимается, каким вопросом и что решает? Именно в этих вопросах нам предстоит разобраться. После прочтения данной статьи мы сможем дать ответ на данные вопросы и будем знать, какие специалисты крайне необходимы для ведения сайта и чем занимается каждый из них.

Менеджер проекта. Этот человек является специалистом, который будет осуществлять общее управление и руководство в области организации рабочего процесса проекта. В его обязанностями являются задачи формировать и контролировать рабочую группу проекта, составлять график проведения работ, осуществлять контроль над качеством и над соблюдением сроков выполнения работ. Также данный человек, имеющий аттестат, занимается управлением бюджетом проектов и рисками. Этот человек курирует как создание сайтов, так и их последующую работу.

Арт-директор. Этот человек является специалистом, который осуществляет общее руководство и управление именно творческими процессами. Данный специалист разрабатывает вместе с дизайнерами общие концепции дизайна проекта, на нем Документация в области ГО и ЧС . В его обязанности также входит контроль над качеством исполняемой работы, проверка качества работ, которые осуществляют дизайнеры и верстальщики.

Технический директор. Это человек, который является специалистом, отвечающим за программные стороны проекта и осуществляющим общий контроль над осуществлением работы техническими специалистами html-верстальщиками, программистами, техническими дизайнерами, тестировщиками. Такой человек незаменим при создании сайтов.

Специалист по оптимизации и юзабилити. Данный специалист отвечает за разработку удобного и понятного для пользователей структурного построения сайта, а также рекомендует те или иные требования к правильному и соответствующему нормам написанию информационного блока, а именно названий разделов, название и состав заголовков, структура гиперссылок.

Дизайнер. Этот специалист, занимается разработкой креативную концепции дизайнерской оболочки сайта, а также различного рода графических элементов, присутствующих практически на любом сайте, например иллюстрации, иконки, визуальные образы.

Технический дизайнер. Данный человек является специалистом, отвечающим за разработку типового строения страниц сайта на уровне утвержденных концепций сайта.

HTML-верстальщик. Этот человек осуществляет верстку html-страниц на сайте.

Программист. Данный специалист, отвечает за внедрение и интеграцию систем управления, за разработку различного рода скриптов, за проектировку баз данных и за принятие решений по многим другим задачам, связанным с программированием.

Кроме того, если купить диплом Техникума , то при осуществлении и разработки проекта могут принимать участие и другие специалисты, такие как: менеджеры по продажам, тестировщики, flash-дизайнеры и flash-программисты, контент-менеджеры, маркетологи, копирайтеры. В маленьких веб-студиях в роли нескольких специалистов очень часто выступает один человек. Так, например, в роли технических дизайнеров и верстальщиков может выступать один и тот же специалист.

Здравствуй, Дорогой Друг! Непреодолимое желание создать что-то новое, самореализоваться или попробовать себя в роли разработчика сайтов привели тебя на эту страницу. Многие утверждают, что запустить свой сайт – это элементарно и просто. И знаете что? Они правы, но, к сожалению, не в полной мере. Существует знаменитая китайская мудрость, которая гласит, что дорога в 1000 шагов начинается с первого шага. Чем же необходимо обладать и что нужно для создания сайта?

Идея!

Интернет с каждым годом превращается в общемировую площадку для связи, ведения бизнеса, развлечений, обучения, познания. Конечно, наиболее частыми причинами создания интернет ресурсов остаются поиск источника дохода или желание самореализоваться. От того, какие вы преследуете цели, зависит и стратегия воплощения вашей мечты в реальность, будь вы начинающий предприниматель или фанат какой-либо игры, желающий обзавестись друзьями.

Для успешного запуска интернет сайта информация должна быть:

  • Полезной, а значит востребованной.
  • Уникальной, а значит интересной.
  • Структурированной, а значит простой в восприятии.

Не помешает насытить ваши странички графикой, яркими картинками, фото, видеоматериалами, модной сегодня инфографикой или даже Flash-анимацией. Сайт должен обладать функциональностью на таком уровне, чтобы пользователи просто и без заморочек получали информацию, которую искали.

Без цели, детального плана и четких требований к будущему продукту у вас вряд ли получится популярный у людей сервис. Помните, что кораблю, который не имеет пункта назначения не обрести попутного ветра. Эта глубокая мысль поможет структурировать и формализировать ваши идеи, интересные фишки, придуманные функции. Очень часто молодые и неопытные разработчики наступают на эти грабли.

Потратьте несколько часов своего времени, возьмите лист бумаги, ручку и в удобной для вас форме опишите будущий продукт. Каким он будет? Для кого он? Что должен получать пользователь? И какие цели преследуете вы? На основании полученной информации уже можно будет планировать бюджет, составлять план будущих работ и сверять полученные результаты с главными целями проекта.

Выбор стратегии

Когда вы точно знаете, что хотите получить, можно выбрать одну из нескольких стратегий достижения вашего будущего успеха:


Нельзя определенно сказать, какой из предложенных вариантов оптимальный, поскольку каждый преследует свои цели при создании сайтов. Однако если вы хотите научиться, вложить свой труд и получить закономерный результат – смело пробуйте создавать сайты самостоятельно.

Как создать?

Хочешь научиться писать статьи и зарабатывать в интернете? Как раз сейчас у меня идет набор на бесплатное обучение по авторской методике.ЗАПИСАТЬСЯ К ПАВЛУ ЯМБУ

На самом деле, чтобы создать сайт нужно потратить 5 минут. Простейшие сайты можно создать в Word, конструкторах или даже в Блокноте. Конечно, подобный продукт не принесет вам миллионы прибыли, не сделает вас популярным. Одним из простейших способов на сегодняшний день быстрого и не дорого запуска интернет проекта – использовать CMS WordPress.

Дело в том, что сайт – это не просто текст и картинки. Это базы данных, системы контроля доступа, обновления и добавления информации, сложные программные функции, которые требуют соответствующей среды. Именно в WordPress есть необходимый задел для запуска малых, средних или даже крупных проектов. Существует мнение, что необходимо разрабатывать собственный движок сайта, при достижении посещаемости на уровне от 2000 пользователей в сутки. На самом деле:

  1. для некоторых задач такая посещаемость не всегда нужна,
  2. в WordPress удачно реализована система установки плагинов, которая расширяет функциональные возможности и безопасность;
  3. если у вас будет такая посещаемость и будет объективная необходимость перехода на свой движок – это не займет много времени.

Ресурсы

Главный ресурс, который вам потребуется, чтобы запустить свой сайт – это время, даже при условии, что ваш проект будет воплощать в жизнь группа программистов. Вам нужно будет быть постоянно в курсе новых тенденций, разработок, выхода программных продуктов, вы вынуждены будете тратить время на написание статей, наполнение контентом сайта. Без этого невозможно привлечь новых пользователей, раскрутить сайт в поисковых системах и в конечном итоге нельзя заработать. Необходимо будет пройти весь путь разработчика, от «ламера», который не отличает HTML от PHP, до продвинутого гуру, создающего востребованный и неповторимый ресурс. Нельзя определенно сказать, сколько вы потратите времени в общем, однако, чем больше внимания сможете уделить проекту – тем выше шансы достичь успеха.

Деньги

Помимо затрат на хостинг, покупку домена, вам понадобится:

  • Оплата раскрутки – сео-оптимизации, покупки ссылок, копирайтинг, создание уникального контента. Оплата доработки функционала сайта – даже используя лучшие шаблоны, или пользуясь услугами программистов, со временем понадобятся доработки сайта. Это нормально, вы развиваетесь!
  • Покупка шаблона в WordPress – если бесплатные версии вам не по душе.
  • Консультации от программистов.
  • Дополнительные вложения в рекламу.

Это все вы можете совершать и самостоятельно если найдете время и обладаете необходимыми навыками и знаниями

Навыки и знания

Чтобы создавать конкурентоспособный продукт необходимо будет планомерно изучать технологии, с помощью которых достигается ваша цель. Это может быть изучение систем управления базами данных, необходимость чтения книг об HTML, PHP, JAVA и многом другом.

Любую сложную задачу легче решить, если разбить ее на несколько простых. Шаг за шагом, путем проб и ошибок, набивая шишки и достигая новых вершин, вы сможете создать такой продукт, за который получите ожидаемый результат, приправленный гордостью, самоудовлетворением и финансовыми выгодами. Хороших вам сайтов, с вами беседовал Павел Ямб.

Привет, друзья!

Хорошее дело — удаленная работа. Прибыльное, полезное и очень удобное. Особенно для тех, кто так же, как и я, любит путешествовать. Недавно только понял лишний раз, что не смотря на все возможные минусы, совершенно не хочется все это менять на стены офисов.

Особенно, когда в понедельник ранним утром едешь по пустой и прямой трассе на мотоцикле в стороне Бангалора и понимаешь, что именно сейчас твои знакомые и коллеги трутся спинами в пробках по дороге на службу.

Все просто: «живи сам и дай жить другим», — как говорят на Шри Ланке!

На этом все, друзья! Думаю, ваш голод по теме «хочу научиться делать сайты» мне утолить удалось. Поделитесь в комментариях, пожалуйста: кем бы Вы хотели работать удаленно? А то мне часто пишут вопросы именно по профессиям в онлайн-заработке, поэтому эту нишу я решил потихоньку заполнять.

Добавляйтесь в друзья, подписывайтесь на обновления блога и будьте счастливы. А если статья Вам показалась интересной, поделитесь ею, пожалуйста, в соцсетях с друзьями.

Красивых Вам сайтов и платежеспособных заказчиков!