Unity3D
1 пост
1 пост
1 пост
Доброго времени, товарищи! Прошло некоторое время с того момента как я начал учить Unity и вот, что я на данный момент знаю и понимаю. Это офигеть как трудно, но неимоверно увлекательно!
Итак, напомню что я там хотел (требования к игре):
1. Большой мир (80-100 систем).
2. Каждый уровень (звездная система) хранит своё состояние.
3. RPG система для юнитов. (уровень, экипировка, инвентарь). Квесты, события, песочница, сюжет, торговля.
4. RTS управление (перемещение в 3-х мерном пространстве). Захват систем, кол-во юнитов в сражении как в Homeworld2, Star Wolves 3: Civil War.
5.
6. Игра однопользовательская, для Windows. (Steam)
Что из этого удалось реализовать и на какой стадии оно всё находится? Для начала расскажу вам о настройках проекта:
1. Версия UnityEngine 2022.3.62f1 LTS. Тип проекта: 3D. Built-In Render Pipeline.
2. Сразу после создания переходим в Project Manager и выполняем в таком порядке: обновляем пакеты в In Project, потом устанавливаем новые пакеты в таком порядке - Addressables, 2D Sprite, AI Navigation, Cinemachine, Localization, Input System и перезапускаем редактор для вступления изменений необходимых для Input System.
3. После перезагрузки переходим в Window -> Asset Management -> Addressables -> Groups. В появившемся окне -> Create Addressables Settings. Я пока что разделил для себя ассеты в такие группы: Prefab_Camera, Prefab_Lights, Prefab_MainMenu, Prefab_PauseMenu, Prefab_UI, Prefab_GameObjects, Asset_Audio, Asset_Sound, Asset_Music, Asset_Image, Asset_Material, Asset_Skybox, Asset_Fonts, Asset_Localization, VFXSFX, Core. Возможно потом я пересмотрю подход к групперовке.
4. Далее создаём папку для Localization. Переходим Project Settings -> Localization и создаём настройки локализации - Localization Settings в созданной ранее папке. Потом в обновившемся окне Project Settings -> Localization - добавим локали Add Locales. Я выбрал - EN, RU, и сохраняем их в Localization/Locales.
6. Теперь создаём таблицы для локализации Window- > Asset Management и в появившемя окне в левом верхнем углу -> New Table Collection. В появившемся окне Name -> MainMenu и нажимаем Create. Сохраняем по адресу: Localizatino/Tables. Закрываем пока это окно.
5. Переходим в Project Settings - Player. Вводим название своей компании согласно вашей форме предпринимательства ))).( Я пока не менял Project Settings - Player -> Active Input Handling и оставил его в значении Both.)
6.Переходим в Project Settings - Text Mesh Pro и устанавливаем необходимый минимум - Import TMP Essentials.
7. Создаём папку - Inputs. Переходим в Project Settings -> Input System Package и создаём действия для всего проекта - Create and assign a default project-wide Action Settings и перемещаем их в папку.
8. Переходим в Project Settings -> Input System -> Settings и создаём Settings Asset. В обновившемся окне - Supported Devices -> добавляем Mouse и Keyboard.
8. Возвращаемся в Project Settings - Input System Package и создаём несколько Action Maps: Gameplay_RTS, MainMenu, PauseMenu, Dialogue, Management и Gameplay_DirectControl (я пока остановился на таких).Чуть позже - подробнее о настройках.
Для Menu: Переименовать New Action ->LMB_Click и в уго Binding -> Path -> Left Button [Mouse] и чуть ниже в Use In Control scheme - тут и далее везде ставим галочку Keyboard&Mouse.
9. Создаём папки для импортируемых ассетов: UI/Image/Texture, UI/Image/Icon, UI/Fonts, UI/Selection, Audio/Sound, Audio/Music, Skyboxes, Prefab/GameObjects, Prefab/UI, Prefab/Core. Потом заполним ассетами. Едем дальше.
10. Папке Scenes: Переименовать Sample Scene в MainMenu, потом добавить сцены Bootstrap, Gameplay и UI.
11. Создать папку Scripts. В папке создать Assembly Definition (MainAssemblyDefinition). В инспекторе при выбранном свежесозданном assembly definition: Namespace -> (название вашей игры или как вам заблагорассудится) и чуть ниже - Assembly Definition References -> Add и добавляем следующее:
com.unity.cinemachine; InputSystemForUI; Unity.Addressables; Unity.AI.Navigation; Unity.InputSystem; Unity.Localization; Unity.ResourceManager; Unity.TextMeshPro; UnityEngine.UI
12. Теперь перейдем на сцену Bootstrap удалим все объекты, создаём пустой объект Hierarchy -> RMB -> Create Empty, и переименвываем его в Bootstrap.
13. File -> Build Settings -> и перетащили Bootstarp Scene из папки Scenes в Scenes in Build.
14. В папке Scripts создайте новый скрипт с именем Bootstrap и прикрепите его к объекту на сцене.
15. File -> Save и Save Project. ВСЁ! Вот и закончили первоначальную настройку проекта.
В следующем посте: ассеты, скрипты.
Простите, мне пипец как стыдно просить помощи, но данный материал пока пишется с целью получения хоть каких нибудь денег... Блять, испанский стыд... докатился....
Итак... игра.
Посмотрев на то, что народ публикует под вывеской - "Я сделялъ" (тут картинка, где почки показывают мозгу камни) - я немного офигел и подумав решил, что буду делать игру RTS/RPG в космосе.
Почему RTS/RPG? Достойный вызов, изумруд в портфолио, да и не солидно делать, вот эти вот покатушки шариком, бесконечный бегун (runners)...
Поизучав игры, я вначале хотел сделать игру на мобильный телефон (прекрати называть ЭТО телефоном - запомни, это - устройство) на Android, но слегка приуныл от нехватки знаний.
Почему в космосе, спросят самые любопытные? А, потому, что в этом случае надо меньше объектов.
В итоге посмотрев ещё несколько видосов от CodeMonkey (хитрый дядька, но об этом потом) я понял, что:
1. Сэттинг - будущее, 2250 год, космос.
2. Жанр - RTS/RPG
3. Платформа: Windows
4. Распространение: Steam
5. Тип: Singleplayer (пока что)
Задача максимум:
31.05.2025 - создать MVP* и опубликовать игру в раннем доступе по сходной цене.
*Шо такое MVP - Minimal Viable Product, тобишь, по-нашему, это будет - Минимально Жизнеспособный Продукт.
Я пропущу такие моменты (они, кстати, очень важны. Пожалуйста - не пренебрегайте.):
1. Составление Game Design Document
2. Составление Technical Design Document
Итак, немного о предстоящей игре.... Я вдохновлялся следующими играми: EVE Online, Homeworld2, Star Wolves 3: Civil War, X4
Игровой мир: Галактика, звездные системы, соединенные прыжковыми вратами или черными дырами, кстати галактика планируется на 60+ систем, но для начала попробую сделать хотя бы 10
4 Основные фракции - Калгарцы, Аракибы, Воссолны, Сларусы.
Второстепенные фракции - Пираты, Мусорщики, Наемники, Исследователи (ещё думаю).
Игровой мир (диспозиция): Основные фракции развиваются, конкурируют между собой, но цель одна - одна фракция будет владеть Галактикой. Игрок может влиять на это дело, а может и забить на это дело и заниматься своими делами.
Сюжет: В процессе т.к. еще не готова система диалогов и квестов.
Фишки игры: Ага, так я вам и сказал ) Узнаете в процессе.
Итак, начнем. Начнем мы с того, что будем использовать паттерн - Единая Точка Входа. Хотя следует сначала определится (где твоё место и что ты за птица (с)) c архитектурой проекта и его структурой.
1. Открываем Unity Hub
2. Качаем версию LTS 2023.3.61f1
3. Создаём проект на BRP (Built-in Render Pipeline)*
*Да, знаю, что будут делать URP (Universal Render Pipeline) проекты в новых версиях Unity по-умолчанию и дело движется к деприкации BRP.
Итак для себя я решил, что буду использовать следующие полезные (не факт) приобретенные знания:
Игра будет состоять из (пока) 7 сцен:
1. Bootstrapper - отвечает за инициализацию сервисов.
2. MainMenu - главное меню. Позволяет начать новую игру (продолжить - пока не работает), загрузить игру, изменить настройки (применить и сохранить),
3. Gameplay - сцена в которой и будет происходить всё действо.
4. UIScene - сцена загружающаяся поверх Gameplay и отвечающая за отображение HUD и других UI.... Так, надоело... HUD - Heads-Up Display, UI - User Interface.
4. EndGame - Тут будем показывать заставку/видео/кат-сцену Победы/Проигрыша/Секретная_Концовка (пока одна).
5. Utility - по идее должна использоваться для гарантированной выгрузки всего, что было в памяти, дабы предотвратить возможные (я ведь не волшебник, а только учусь) утечки памяти
Где, 1 - Bootstrap сцена, в которой мы будем инициализировать полезные нам сервисы, мэ-э-э-энеджеры и т.д. С этой целью создадим несколько скриптиков (придется попечатать немного):
- Удалить все объекты со сцены.
- Добавить объект, переименовать в Bootstrap (вообще без разницы, как вы его назовете - ни на что не влияет).
- В папочке (см. структуру проекта ниже) создаём скрипт: Bootstrap.cs который будет отвечать за инициализацию сервисов.
- Сервисы мы будем хранить и использовать централизованное (Service Locator шаблон). Более того Service Locator у нас будет не MonoBehaviour, а обычный Plain Old Class Object (POCO).
Тут следует сделать небольшое отступление:
Классы которые наследуются от MonoBehaviour ВСЕГДА должны быть компонентом (прикреплены) GameObject и присутствовать на сцене.
*При смене сцены, например (сцена1 -> сцена2) все объекты сцены1 будут выгружены из памяти (т.е. канут в Лету)
В таком случае мы будем использовать шаблон Singleton (Одиночка.... одинокий одиночка.... лол)
Поскольку мы его применяем к Service Locator, следовательно сервисы, зарегистрированные в нем будут присутствовать во всех сценах.
Внимание вопрос:
Каким следует сделать Service Locator - MonoBehviour или POCO. Почему?
Я остановился на POCO:
using System;
using System.Collections.Generic;
using UnityEngine;
namespace SpaceMercsLife
{
/// <summary>
/// ServiceLocator - это паттерн проектирования, который предоставляет глобальную точку доступа к сервисам, не связывая клиентский код с конкретными реализациями этих сервисов.
/// В данном случае мы используем ServiceLocator как POCO класс, что бы он был доступен везде.
/// По окончанию использования вызвать Dispose из другого класса - MonoBehaviour
/// </summary>
/// //: MonoBehaviour
public class ServiceLocator : IDisposable
{
// Словарь для хранения зарегистрированных сервисов. Ключ - тип сервиса, значение - экземпляр сервиса.
private readonly Dictionary<Type, object> _services = new Dictionary<Type, object>();
// Статическое поле для хранения единственного экземпляра ServiceLocator (Singleton).
private static ServiceLocator _instance;
// Статическое свойство для доступа к единственному экземпляру ServiceLocator.
// Ленивая инициализация: экземпляр создается только при первом обращении.
public static ServiceLocator Instance => _instance ??= new ServiceLocator();
/// <summary>
/// Регистрирует сервис указанного типа с предоставленным экземпляром.
/// Если сервис такого типа уже зарегистрирован, он будет перезаписан, о чем будет выведено предупреждение.
/// </summary>
/// <typeparam name="T">Тип регистрируемого сервиса (интерфейс или класс).</typeparam>
/// <param name="service">Экземпляр сервиса для регистрации.</param>
// Событие, вызываемое после регистрации сервиса.
public static event Action<Type, object> ServiceRegistered;
// Событие, вызываемое после отмены регистрации сервиса.
public static event Action<Type> ServiceUnregistered;
/// <summary>
/// Регистрирует сервис указанного типа (интерфейса) с предоставленным экземпляром.
/// Если сервис такого типа уже зарегистрирован, он будет перезаписан, о чем будет выведено предупреждение.
/// </summary>
/// <typeparam name="TInterface">Тип интерфейса регистрируемого сервиса.</typeparam>
/// <typeparam name="TImplementation">Тип конкретной реализации сервиса.</typeparam>
/// <param name="service">Экземпляр сервиса для регистрации.</param>
public void Register<TInterface, TImplementation>(TImplementation service)
where TInterface : class
where TImplementation : class, TInterface
{
var interfaceType = typeof(TInterface);
if (_services.ContainsKey(interfaceType))
{
Debug.LogWarning($"Service {interfaceType} already registered. Overriding with {service.GetType().Name}...");
_services[interfaceType] = service;
}
else
{
_services.Add(interfaceType, service);
ServiceRegistered?.Invoke(interfaceType, service);
}
}
/// <summary>
/// Отменяет регистрацию сервиса указанного типа (интерфейса).
/// </summary>
/// <typeparam name="TInterface">Тип интерфейса сервиса, который необходимо отменить регистрацию.</typeparam>
public void Unregister<TInterface>() where TInterface : class
{
var interfaceType = typeof(TInterface);
if (_services.ContainsKey(interfaceType))
{
_services.Remove(interfaceType);
ServiceUnregistered?.Invoke(interfaceType);
Debug.Log($"Service {interfaceType} unregistered.");
}
}
/// <summary>
/// Получает зарегистрированный сервис указанного типа (интерфейса).
/// </summary>
/// <typeparam name="TInterface">Тип интерфейса запрашиваемого сервиса.</typeparam>
/// <returns>Экземпляр зарегистрированного сервиса.</returns>
/// <exception cref="Exception">Выбрасывает исключение, если сервис указанного типа не найден.</exception>
public TInterface Get<TInterface>() where TInterface : class
{
var interfaceType = typeof(TInterface);
if (!_services.TryGetValue(interfaceType, out var service))
{
throw new Exception($"Service {interfaceType} not found");
}
return (TInterface)service;
}
/// <summary>
/// Пытается получить зарегистрированный сервис указанного типа (интерфейса).
/// </summary>
/// <typeparam name="TInterface">Тип интерфейса запрашиваемого сервиса.</typeparam>
/// <param name="service">Выходной параметр, содержащий экземпляр сервиса, если он найден, иначе null.</param>
/// <returns>True, если сервис найден, иначе false.</returns>
public bool TryGet<TInterface>(out TInterface service) where TInterface : class
{
var interfaceType = typeof(TInterface);
if (_services.TryGetValue(interfaceType, out var obj))
{
service = (TInterface)obj;
return true;
}
service = null;
return false;
}
/// <summary>
/// Удаляет все зарегистрированные сервисы и очищает события.
/// </summary>
public void Clear()
{
_services.Clear();
ServiceRegistered = null;
ServiceUnregistered = null;
// Можно добавить Debug.Log("ServiceLocator cleared.") для обратной связи.
}
/// <summary>
/// Реализация интерфейса IDisposable. Освобождает ресурсы, удерживаемые ServiceLocator.
/// В данном случае, очищает список сервисов, отписывается от событий и обнуляет ссылку на экземпляр.
/// </summary>
public void Dispose()
{
if (_instance != null)
{
_instance.Clear();
_instance = null;
}
GC.SuppressFinalize(this);
}
}
}
А вот на "прям вот сейчас, сию минуту" выглядит Bootstrap.cs
using UnityEngine;
using SpaceMercsLife.Service.Interfaces;
using SpaceMercsLife.Service.Implementation.Mono;
using SpaceMercsLife.Service.Implementation.POCO;
using System.Threading.Tasks;
using UnityEngine.SceneManagement;
using SpaceMercsLife.SLocator;
namespace SpaceMercsLife
{
public class Bootstrap : MonoBehaviour
{
private string configFileName = "game_config";
private string defaultLocale = "en";
private async void Start()
{
MonoBehaviourServicesRegistration();
await POCOServicesRegistration();
ReleaseResources();
await LoadGameSettings();
// Воспроизведение фоновой музыки
var audioService = ServiceLocator.Instance.Get<IAudioService>();
await audioService.PlayBackgroundMusicAsync("main_theme", volume: 1.0f, fadeInDuration: 2.0f);
// Загрузка сцены главного меню
var sceneService = ServiceLocator.Instance.Get<ISceneService>();
await sceneService.LoadSceneAsync("MainMenu", LoadSceneMode.Single, showLoadingScreen: true, uiSceneName: null);
}
private async Task LoadGameSettings()
{
// Загрузка графических настроек
var graphicsService = ServiceLocator.Instance.Get<IGraphicsService>();
await graphicsService.LoadSettingsAsync();
// Загрузка настроек ввода
var inputService = ServiceLocator.Instance.Get<IInputService>();
await inputService.LoadBindingsAsync();
// Загрузка настроек VFX
var vfxService = ServiceLocator.Instance.Get<IVFXService>();
await vfxService.LoadSettingsAsync();
// Загрузка настроек UI
var uiService = ServiceLocator.Instance.Get<IUIService>();
await uiService.LoadSettingsAsync();
// Инициализация камеры
var cameraService = ServiceLocator.Instance.Get<ICameraService>();
var mainCamera = cameraService.CreateCamera("MainCamera");
cameraService.SetMainCamera(mainCamera);
// Загрузка настроек камеры и мыши
await cameraService.LoadSettingsAsync();
}
private void MonoBehaviourServicesRegistration()
{
VFXService vfxServicePrefab = Resources.Load<VFXService>("Prefabs/VFXService");
SceneService sceneServicePrefab = Resources.Load<SceneService>("Prefabs/SceneService");
var vfxService = Instantiate(vfxServicePrefab);
DontDestroyOnLoad(vfxService.gameObject);
vfxService.Initialize(ServiceLocator.Instance.Get<IConfigurationService>());
ServiceLocator.Instance.Register<IVFXService, VFXService>(vfxService);
var sceneService = Instantiate(sceneServicePrefab);
DontDestroyOnLoad(sceneService.gameObject);
ServiceLocator.Instance.Register<ISceneService, SceneService>(sceneService);
}
private void ConfigInitialization()
{
var configService = new SimpleConfigurationService();
configService.LoadConfig($"Config/{configFileName}");
ServiceLocator.Instance.Register<IConfigurationService, SimpleConfigurationService>(configService);
var audioService = new AudioService(configService);
ServiceLocator.Instance.Register<IAudioService, AudioService>(audioService);
var graphicsService = new GraphicsService(configService);
ServiceLocator.Instance.Register<IGraphicsService, GraphicsService>(graphicsService);
var inputService = new InputService(configService);
ServiceLocator.Instance.Register<IInputService, InputService>(inputService);
var cameraService = new CameraService(configService);
ServiceLocator.Instance.Register<ICameraService, CameraService>(cameraService);
var uiService = new UIService(configService);
ServiceLocator.Instance.Register<IUIService, UIService>(uiService);
var localizationService = new SimpleLocalizationService();
localizationService.SetLocale(defaultLocale);
ServiceLocator.Instance.Register<ILocalizationService, SimpleLocalizationService>(localizationService);
}
private async Task POCOServicesRegistration()
{
ConfigInitialization();
ServiceLocator.Instance.Register<IResourceService, ResourceService>(new ResourceService());
ServiceLocator.Instance.Register<IPhysicsService, PhysicsService>(new PhysicsService());
ServiceLocator.Instance.Register<IEventBus, EventBus>(new EventBus());
ServiceLocator.Instance.Register<IStateMachineService, SimpleStateMachineService>(new SimpleStateMachineService());
var binaryDataService = new BinaryDataService();
await binaryDataService.InitializeAsync();
ServiceLocator.Instance.Register<IDataService, BinaryDataService>(binaryDataService);
}
private void ReleaseResources()
{
Resources.UnloadUnusedAssets();
}
}
}
А вот так вот выглядят все сервисы
Я не являюсь программистом (профильное образование - юрист), я никогда не имел никакого отношения к играм, кроме как поиграть.
Данный пост (как и остальное на FB, YouTube) создается с целью заработать денег (на поддержание штанов) - кто сколько сможет, пока игра не будет опубликована в Steam.
Я понимаю и принимаю все риски связанные с данными публикациями т.е. что меня могут просто опередить и выпустить эту игру раньше меня. Ну да ладно - поживём - увидим.
Добрейшего Всем!
С детства, после Fallout 2, я понял, что моя голубая мечта - создавать игры. Создавать миры, увлекательные истории... Начну я, пожалуй, с начала, так сказать.
Канада, Калгари
01.03.2025
Я уже несколько месяцев на LayOff (это когда временно без работы, но трудовые отношения никто не разрывал). Переиграл во всё, что только можно и нельзя, 1191.3 часа в IronOrder1919, V Rising и Valheim со школьниками. Tarkov - э-э-эхххх.... был бы ноут по-мощнее - вообще бы не вылазил из неё. Вот список игр во что играл/ю:
Но, рано или поздно, безделье надоедает* и я начал подумывать, чем бы занятся и заодно позаработать денег. Вариантов - раз, два и обчелся:
1. Доставка еды / Такси. Не канает - нет машины.
2. Перепродажа б/у вещей с Trift stores и GoodWill - объемисто, долгосрочно, перспективно. Но в одно лицо - это труба. Да и вещи там так, расхватывают, словно ты пытаешься у них эту самую шмотку, что ни на есть - последнюю, забрать.
3. И..... и больше нихрена я не умею.
В далеком 2014 году я уже пробовал в игроделание (почему не пошло - в другой раз, если вспомню), но поскольку время подстерло память (точнее причину), я решил - хочу сделать игру.
Сцука, идея фикс - игра. Итак, ТС, какую же игру ты захотел сделать? Грабить корованы, лол?
Имея на руках ноутбук, мышку, наушники (с микрофоном) :
Device name LAPTOP-CFCEROC4
Processor Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz 2.21 GHz
Installed RAM 12.0 GB (11.8 GB usable)
Video GPU:
NVIDIA GeForce GTX 1050
Dedicated GPU memory 0.0/4.0 GB
Shared GPU memory 0.0/5.9 GB
GPU Memory 0.0/9.9 GB
System type 64-bit operating system, x64-based processor
Pen and touch No pen or touch input is available for this display
и недюжий интузиазм, я, как мне казалось, начал приобщаться к таинству игроделания.
Я решил, что я должен сам во все вникнуть и разобраться т.е. уметь сделать игру в одно лицо, без мам, пап и кредитов посторонней помощи и сейчас покажу какими программами я пользуюсь:
1. Игровой движок. Unity.
Почему Unity? UnrealEngine - выкинуло из редактора из-за нехватки ресурсов. Godot - уже не очень помню почему, но - нет.
Unity Personal редакции позволяет заработать достаточно много 100 000 USD - 200 000 USD. Ссылка - https://unity.com/products/pricing-updates
2. Язык программирования. С#
Много лет назад, когда я был ешё молодым и ходил в КА "Шаг" - я учил С++. Поэтому сильно не выбирал. Кстати, обращаю Ваше внимание, что Unity поддерживает следующие языки программирования: C#, C/C++, Rust, IronPython, Lua, Java, JavaScript, SQL, HTML 5, and CSS
Для дальнейшего понимания, следует сделать небольшое отступление: из чего сделана игра? Каким представлением оперирует Unity?
В Unity есть такое понятие как сцена. Сцену еще можно представить как уровень / локацию, для понимания. Сцена - это контейнер.
Сцена состоит из GameObjects (объектов-контейнеров), которые, в свою очередь, состоят из компонентов. (https://docs.unity3d.com/2022.3/Documentation/Manual/Creatin...)
Код. Скрипты. Тут всё понятно - используем выбранный язык программирования и в бой. Но есть нюанс ))))
2. 3д объекты, которые состоят из mesh.
Меш (mesh) — это фундаментальный элемент в 3D моделировании, представляющий собой сетку, состоящую из вершин, рёбер и граней.
3. Текстуры. Включая Skybox
4. Материалы.
5. Шейдеры
6. Аудио файлы (музыка, звуки)
7. Видео файлы (если будешь делать кат-сцены или просто видео)
8. Анимации
9. Текстовые файлы
10. Освещение
..... Вроде всё, на пока - хватит )))
И шо же делать, спросят самые непоседливые. А собственно говоря вот:
1. Unity Game Engine
2. VS Code
3. Blender 4
5. AudioCity
6. MeshLab
7. Photoshop
--------------------------------------------------------------------------------------------------------------
Канада, Калгари
03.03.2025
Полон энтузиазма, готов горы свернуть. "В Ютубе всё есть - полно учебных материалов! Бери - нехочу! Все даром рассказывают как делать игры!" Посмори вот тебе ресурсы:
1. Unity documentation (тут понятно - читать не особо весело, неправда ли?*)
2. Youtube - полно видео уроков. (вот тут прям начало припекать)
3. "Тематические" широко-известные в узких кругах сайты, где можно без регистрации и смс скачать книги! (чуть позже выложу свою коллекцию)
4. Парочка русских сайтов.
5. ИИ
6. GitHub
Штошььь... прямо скажем - не густо. Но глаза боятся - руки делают! (с) И я начал читать книжки.
Дабы не томить сильно:
1. ИИ - если ты не знаешь, что/о чём ты спрашиваешь - получишь чушь в ответ. Поэтому читай, для начала.
2. Youtube - для этих, не побоюсь этого слова - П*дарасов, Большой Буквы, есть отдельный котёл, в котором черти будут их жахать кочергой во все дыхательные и пихательные, пока за этим будет наблюдать стая бешеных и голодных собак.
Но следует быть объективным т.е. иметь холодную голову, горячее сердце и чистые руки, и признать что мне попались 3 - 4 годных товарища. От одного я случайно узнал о шаблоне проектирования - Единая Точка Доступа. Это мне помогло.
3. Книги - это просто поле для инфоциганства. Старые болезни.... Переписывают из книги в книгу одно и тоже. используют теже примеры, никакой новизны.*
*Если успею - выпущу свою книжку про Юнити, сцука, и пусть они все охренеют!
Немного отвлечемся:
Так выглядит "изучение":
В завершении нулевой части:
Самое важное в этой писульке от Федота - с чего следует начать (помимо языка программирования):
1. Шаблоны проектирования программного обеспечения.
3. Архитектура приложений / программного обеспечения.
PayPal аккаунт для пожертвований: stas.vdk@gmail.com
Блять, испанский стыд... с этими пожертвованиями конечно....
Первое*
Частей не будет т.к. это отдельный вступительный пост.
Доброго времени суток!
Для начала - подписчикам:
1. Приложение** для калькулирования стоимости - решено народом.***
2. Приложение для парковки - не решено.****
---------------------------
*В соответствии с действующими правилами компании, владеющим данным имуществом (https://pikabu.ru/information/company) именуемым Инфомационным Порталом (Далее - ИП), подача материала будет обезличена (без звукового сопровождения и на одном из общеизвестных языков). Весь материал изложенный ТСом на данном ИП - плод воображения и не несет собой целью нанести моральный и/или иной вред другим посетителям ИП)
**Android.
***Имеются решения решившие данную потребность..
**** В зависимости от ответа Пикабушника.
-//-//-//-//-//-//-//-//-//-//-//-//-//-
Про Канаду...
Приехал - год назад. Живу в провинции Альберта. Если что интересно - спрашивайте.
-//-//-//-//-//-//-//-//-//-//-//-//-//-
Про Игроделание...
Blender 3D (LTS - 3.6)
Потыкавшись в предыдущем параграфе и не найдя себя, дурака, я решил попробовать себя в создании игр... и приняв на грудь я....
Потратил хренову тучу времени (4 недели) на более или менне внятное создание человекоподбной модели, раскрас, модульность (пригодится потом) объекта и азы анимации.
2. UNITY
И тут я подзавис... а игру о чём я буду делать...:
1. Кому она будет интересна и какой посыл она будет нести?
2. Какие возможности Вы бы хотели видеть в играх?
Здесь, уважаемые дамы и господа, я прошу Вас высказаться на тему игры которую Вы бы хотели.
П.С.: Если будет на то воля Высших - слеплю игру на андроид по шаблону одной игры (не называю т.к. возможны юр последствия)
П.П.С: Чистые гонки (ака NFS) или симуляторы (FIFA, The Sims) не являются приоритетом.
"Я тут недавно даже подумал..." (с)
Все недовольны изменениями на Пикабу/Мире.
Как насчет того, что, как уже было выяснено ДАГами (Диванными Аналитическими Группами) - приобретение данной "точки влияния" (ТВ)* про-властной группой лиц (включая ряд других факторов) губительно повлияло на её эффективность на данном этапе, затрагивая, в том числе экзистенциальные вопросы данной ТВ.
Ну, это я отвлекся от того, шо я хотел-то сказать, ага... Так вот...
Давайте рассмотрим текущую монетизацию Пикабу:
1. Будь сознательным и признай тот факт, что данный проект требует денег.
- Аренда сервера
- Труд на написание/внесение изменений
2. Какие варианты владельцу получить хоть "шо ни будь":
- Подписка (т.е. хрен ты сюда зайдешь без подписки)
- "Донаты" авторам
- Просьба о пожертвовании на поддержание инфраструктуры и немного владельца (сколько кто готов скинуть на Пикабу за год? Например 100 человек по 1К наших любимых рублей - 100000 в год - это много или мало для "щастья"?)
Но следует признать - чрезмерной модерацией и отсутствие конструктивного диалога с пользователями пока не получилось.
Выговорился... )))
Согласен - налажалю Держите исправленное качество скриншотов.
Вопросы - Пикабу / @Norutar (Голубеграмм)
Steam conducts a monthly survey to collect data about what kinds of computer hardware and software our customers are using. Participation in the survey is optional, and anonymous. The information gathered is incredibly helpful to us as we make decisions about what kinds of technology investments to make and products to offer.*
*Steam проводит ежемесячный опрос для сбора данных о том, какое компьютерное оборудование и программное обеспечение используют наши клиенты. Участие в опросе является необязательным и анонимным. Собранная информация невероятно полезна для нас, когда мы принимаем решения о том, какие инвестиции в технологии следует делать и какие продукты предлагать.
Да вернутся вам плюсы сторицей во славу Бунда!!!