SlideShare a Scribd company logo
1 of 14
Download to read offline
Розробка власного 2D- 
редактора рівнів 
на Unity
Трохи про гру та її виклики 
прив’язка до сітки 
різні конвеєри труби та інше...
Готові асети vs свій велосипед 
SpriteTile 
Tile Builder 
UniTile 
Tiler 
U2DEX 
Nostalgia 
... 
ціни: $15-30 
різноманітні можливості з асетів: 
● зручності редагування 
● додаткові скрипти 
● колекції картинок 
● оптимізації drawcall’ів 
● геренерація оптимальних колайдерів 
● запікання шляхів 
● прив’язка до сітки - єдине що нам треба
Вікно редактора. 
початки 
Assets/Editor/LevelEditorWindow.cs: 
public class LevelEditorWindow : EditorWindow 
{ 
public static bool editorEnabled = true; 
[MenuItem("Window/Level Editor %_l")] 
public static void Init() 
{ 
var window = (LevelEditorWindow)GetWindow(typeof(LevelEditorWindow)); 
window.title = "Level Editor"; 
window.minSize = new Vector2(100, 50); 
} 
public void OnGUI() 
{ 
editorEnabled = EditorGUILayout.Toggle("Enabled", editorEnabled); 
} 
}
Зберігаємо дані. 
EditorPrefs 
Assets/Editor/LevelEditorWindow.cs: 
... 
public void OnFocus() 
{ 
if (EditorPrefs.HasKey("LevelEditorEnabled")) 
editorEnabled = EditorPrefs.GetBool("LevelEditorEnabled"); 
} 
public void OnLostFocus() 
{ 
EditorPrefs.SetBool("LevelEditorEnabled", editorEnabled); 
} 
public void OnDestroy() 
{ 
EditorPrefs.SetBool("LevelEditorEnabled", editorEnabled); 
} 
...
Головна логіка 
редактора 
Assets/Editor/LevelEditorWindow.cs: 
Vector3 lastSelectedPos; 
Transform selectedTrans; 
public void Update() 
{ 
if (editorEnabled && !EditorApplication.isPlaying && Selection.transforms.Length == 1) 
{ 
selectedTrans = SelectImportantObj(); 
if (selectedTrans.position != lastSelectedPos) 
{ 
var snapped = SnapSelected(); 
if (snapped) { … } 
lastSelectedPos = selectedTrans.position; 
} 
} 
} 
...
Вибір головного 
об’єкта 
Assets/Editor/LevelEditorWindow.cs: 
static Transform SelectImportantObj() 
{ 
var selectedTrans = Selection.activeTransform; 
var rootTrans = selectedTrans.root; 
if (rootTrans != null && rootTrans != selectedTrans) 
{ 
if (rootTrans.CompareTag("Toggle") || rootTrans.CompareTag("Press") || ...) 
{ 
Selection.activeTransform = rootTrans; 
} 
else if (rootTrans.CompareTag("Conveyer")) 
{ 
Transform trans; 
if ((trans = selectedTrans.ClosestWithTag("ConveyerCorner")) != null) 
Selection.activeTransform = trans; 
else 
Selection.activeTransform = rootTrans; 
}
Прив’язка з 
різними 
якорями 
Assets/Editor/LevelEditorWindow.cs: 
enum Snap { Half, One, OneHalf } 
bool SnapSelected() 
{ 
if (selectedTrans.CompareTag("Arrow")) 
return false; 
if (selectedTrans.CompareTag("MainCamera") || ...) 
{ 
return SnapCustom(selectedTrans, Snap.Half, Snap.Half); 
} 
if (selectedTrans.CompareTag("Ground") || ...) 
{ 
return SnapCustom(selectedTrans, Snap.Half, Snap.OneHalf); 
} 
… 
return SnapCustom(selectedTrans, Snap.OneHalf, Snap.OneHalf); 
} 
static bool SnapCustom(Transform trans, Snap snapX, 
Snap snapY) 
{ 
var pos = trans.position; 
var x = SnapCustomVal(pos.x, snapX); 
var y = SnapCustomVal(pos.y, snapY); 
if (Mathf.Abs(x - pos.x) > Mathf.Epsilon || Mathf.Abs(y - 
pos.y) > Mathf.Epsilon) 
{ 
trans.position = new Vector3(x, y, pos.z); 
return true; 
} 
return false; 
}
Інтерактивні 
елементи 
рівня 
Assets/Editor/LevelEditorWindow.cs: 
if (snapped) 
{ 
rootTrans = selectedTrans.RootIfExists(); 
else if (rootTrans.CompareTag("Conveyer") && selectedTrans != rootTrans) 
HandleConveyer(); 
... 
} 
void HandleConveyer() 
{ 
... 
conveyer.Resize(...); 
EditorUtility.SetDirty(conveyer); 
}
Custom Editors 
база 
Assets/Editor/ConveyerEditor.cs: 
[CustomEditor(typeof(Conveyer))] 
public class ConveyerEditor : Editor 
{ 
Conveyer conveyer; 
protected void OnEnable() 
{ 
if (EditorUtility.IsPersistent(target) || !LevelEditorWindow.editorEnabled) 
return; 
conveyer = (Conveyer) target; 
} 
public override void OnInspectorGUI() 
{ 
if (EditorUtility.IsPersistent(target) || !LevelEditorWindow.editorEnabled) 
{ 
DrawDefaultInspector(); 
return; 
} 
… 
} 
}
Custom Editors 
дія на зміну поля 
Assets/Editor/ConveyerEditor.cs: 
public override void OnInspectorGUI() 
{ 
... 
GUI.changed = false; 
var canChangeDirBefore = conveyer.canChangeDir; 
… 
DrawDefaultInspector(); 
if (GUI.changed) 
{ 
if (canChangeDirBefore != conveyer.canChangeDir) 
conveyer.UpdateDirArrowDisabled(); 
… 
EditorUtility.SetDirty(conveyer); 
} 
}
Скрипти- 
фіксери 
всіх рівнів 
Assets/Editor/LevelFixer.cs: 
public class LevelFixer : MonoBehaviour 
{ 
[MenuItem("Custom/Fix Conveyers")] 
public static void FixLevelConveyers() 
{ 
var conveyers = FindObjectsOfType<Conveyer>(); 
foreach (var conveyer in conveyers) 
{ 
// ... fix conveyer … 
EditorUtility.SetDirty(conveyer.gameObject); 
} 
} 
[MenuItem("Custom/Fix Conveyers (All levels)")] 
public static void FixAllLevelsConveyers() 
{ 
RunOnAllLevels(FixLevelConveyers); 
} 
} 
static void RunOnAllLevels(Action action) 
{ 
if (!EditorApplication.SaveCurrentSceneIfUserWantsTo()) 
return; 
var currentScene = EditorApplication.currentScene; 
foreach (var scene in EditorBuildSettings.scenes) 
if (scene.path.Contains("Level")) 
{ 
EditorApplication.OpenScene(scene.path); 
action(); 
EditorApplication.SaveScene(); 
} 
EditorApplication.OpenScene(currentScene); 
}
Демонстрація редактора
Дякую за увагу :) 
Facebook: Лев Лукомський 
email: lllukom@gmail.com 
skype: lllukom

More Related Content

Viewers also liked

Павло Король “Можливості Prom.UA для просування бізнесу”
Павло Король “Можливості Prom.UA для просування бізнесу”Павло Король “Можливості Prom.UA для просування бізнесу”
Павло Король “Можливості Prom.UA для просування бізнесу”Lviv Startup Club
 
Павло Лисий "Free linkbuilding"
Павло Лисий   "Free linkbuilding"Павло Лисий   "Free linkbuilding"
Павло Лисий "Free linkbuilding"Lviv Startup Club
 
Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”
Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”
Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”Lviv Startup Club
 
Як інтернет-магазину збирати базу потенційних клієнтів для розсилки
Як інтернет-магазину збирати базу потенційних клієнтів для розсилкиЯк інтернет-магазину збирати базу потенційних клієнтів для розсилки
Як інтернет-магазину збирати базу потенційних клієнтів для розсилкиLviv Startup Club
 
Андрій Чипиленко "Розробка мобільного додатку для Comp-online.com.ua"
Андрій Чипиленко  "Розробка мобільного додатку для Comp-online.com.ua"Андрій Чипиленко  "Розробка мобільного додатку для Comp-online.com.ua"
Андрій Чипиленко "Розробка мобільного додатку для Comp-online.com.ua"Lviv Startup Club
 
Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”
Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”
Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”Lviv Startup Club
 
Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...
Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...
Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...Lviv Startup Club
 
Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"
Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"
Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"Lviv Startup Club
 
Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...
Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...
Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...Lviv Startup Club
 
Андрій Мудрий «Що таке Project Management для кількох проектів»
Андрій Мудрий «Що таке Project Management для кількох проектів»Андрій Мудрий «Що таке Project Management для кількох проектів»
Андрій Мудрий «Що таке Project Management для кількох проектів»Lviv Startup Club
 

Viewers also liked (10)

Павло Король “Можливості Prom.UA для просування бізнесу”
Павло Король “Можливості Prom.UA для просування бізнесу”Павло Король “Можливості Prom.UA для просування бізнесу”
Павло Король “Можливості Prom.UA для просування бізнесу”
 
Павло Лисий "Free linkbuilding"
Павло Лисий   "Free linkbuilding"Павло Лисий   "Free linkbuilding"
Павло Лисий "Free linkbuilding"
 
Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”
Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”
Lviv iCamp 2014. Іван Портний “як prom.ua за рік збільшив конверсію в 2 рази?”
 
Як інтернет-магазину збирати базу потенційних клієнтів для розсилки
Як інтернет-магазину збирати базу потенційних клієнтів для розсилкиЯк інтернет-магазину збирати базу потенційних клієнтів для розсилки
Як інтернет-магазину збирати базу потенційних клієнтів для розсилки
 
Андрій Чипиленко "Розробка мобільного додатку для Comp-online.com.ua"
Андрій Чипиленко  "Розробка мобільного додатку для Comp-online.com.ua"Андрій Чипиленко  "Розробка мобільного додатку для Comp-online.com.ua"
Андрій Чипиленко "Розробка мобільного додатку для Comp-online.com.ua"
 
Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”
Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”
Lviv iCamp 2014. Андрій Натальченко “20 рокових гріхів в seo”
 
Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...
Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...
Христина Потоцька “Що потрібно знати для початку Email-розсилки по залишених ...
 
Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"
Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"
Lviv Freelance Club: Віталій Подоба: "Три джерела клієнтів для фрілансера"
 
Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...
Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...
Lviv iCamp 2014. Олександр Кулик “Ретаргетинг – каталізатор продажів або “мил...
 
Андрій Мудрий «Що таке Project Management для кількох проектів»
Андрій Мудрий «Що таке Project Management для кількох проектів»Андрій Мудрий «Що таке Project Management для кількох проектів»
Андрій Мудрий «Що таке Project Management для кількох проектів»
 

Similar to Gamedev Mixer. Лев Лукомський "Розробка власного 2D-редактора рівнів на Unity"

Lecture 12. iOS and Android Animations
Lecture 12. iOS and Android AnimationsLecture 12. iOS and Android Animations
Lecture 12. iOS and Android AnimationsMaksym Davydov
 
06 Pointers To Class Members
06 Pointers To Class Members06 Pointers To Class Members
06 Pointers To Class Membersolegapster
 
"How I don't need a state management library in React app", Tetiana Melnyk
"How I don't need a state management library in React app", Tetiana Melnyk "How I don't need a state management library in React app", Tetiana Melnyk
"How I don't need a state management library in React app", Tetiana Melnyk Fwdays
 
02 Copying Objects
02 Copying Objects02 Copying Objects
02 Copying Objectsolegapster
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulationolegapster
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilitiesolegapster
 
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021OdessaJS Conf
 

Similar to Gamedev Mixer. Лев Лукомський "Розробка власного 2D-редактора рівнів на Unity" (9)

Lecture 12. iOS and Android Animations
Lecture 12. iOS and Android AnimationsLecture 12. iOS and Android Animations
Lecture 12. iOS and Android Animations
 
06 Pointers To Class Members
06 Pointers To Class Members06 Pointers To Class Members
06 Pointers To Class Members
 
"How I don't need a state management library in React app", Tetiana Melnyk
"How I don't need a state management library in React app", Tetiana Melnyk "How I don't need a state management library in React app", Tetiana Melnyk
"How I don't need a state management library in React app", Tetiana Melnyk
 
Android animations
Android animationsAndroid animations
Android animations
 
Lecture 07 swift
Lecture 07 swiftLecture 07 swift
Lecture 07 swift
 
02 Copying Objects
02 Copying Objects02 Copying Objects
02 Copying Objects
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilities
 
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
 

More from Lviv Startup Club

Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...
Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...
Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...Lviv Startup Club
 
Dmytro Khudenko: Challenges of implementing task managers in the corporate an...
Dmytro Khudenko: Challenges of implementing task managers in the corporate an...Dmytro Khudenko: Challenges of implementing task managers in the corporate an...
Dmytro Khudenko: Challenges of implementing task managers in the corporate an...Lviv Startup Club
 
Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...
Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...
Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...Lviv Startup Club
 
Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...
Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...
Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...Lviv Startup Club
 
Mykhailo Hryhorash: What can be good in a "bad" project? (UA)
Mykhailo Hryhorash: What can be good in a "bad" project? (UA)Mykhailo Hryhorash: What can be good in a "bad" project? (UA)
Mykhailo Hryhorash: What can be good in a "bad" project? (UA)Lviv Startup Club
 
Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)
Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)
Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)Lviv Startup Club
 
Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...
Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...
Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...Lviv Startup Club
 
Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...
Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...
Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...Lviv Startup Club
 
Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...
Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...
Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...Lviv Startup Club
 
Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...
Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...
Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...Lviv Startup Club
 
Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)
Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)
Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)Lviv Startup Club
 
Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...
Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...
Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...Lviv Startup Club
 
Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)
Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)
Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)Lviv Startup Club
 
Nataliya Kryvonis: Essential soft skills to lead your team (UA)
Nataliya Kryvonis: Essential soft skills to lead your team (UA)Nataliya Kryvonis: Essential soft skills to lead your team (UA)
Nataliya Kryvonis: Essential soft skills to lead your team (UA)Lviv Startup Club
 
Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...
Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...
Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...Lviv Startup Club
 
Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...
Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...
Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...Lviv Startup Club
 
Oksana Smilka: Цінності, цілі та (де) мотивація (UA)
Oksana Smilka: Цінності, цілі та (де) мотивація (UA)Oksana Smilka: Цінності, цілі та (де) мотивація (UA)
Oksana Smilka: Цінності, цілі та (де) мотивація (UA)Lviv Startup Club
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Lviv Startup Club
 
Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)
Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)
Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)Lviv Startup Club
 
Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...
Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...
Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...Lviv Startup Club
 

More from Lviv Startup Club (20)

Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...
Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...
Artem Bykovets: 4 Вершники апокаліпсису робочих стосунків (+антидоти до них) ...
 
Dmytro Khudenko: Challenges of implementing task managers in the corporate an...
Dmytro Khudenko: Challenges of implementing task managers in the corporate an...Dmytro Khudenko: Challenges of implementing task managers in the corporate an...
Dmytro Khudenko: Challenges of implementing task managers in the corporate an...
 
Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...
Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...
Sergii Melnichenko: Лідерство в Agile командах: ТОП-5 основних психологічних ...
 
Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...
Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...
Mariia Rashkevych: Підвищення ефективності розроблення та реалізації освітніх...
 
Mykhailo Hryhorash: What can be good in a "bad" project? (UA)
Mykhailo Hryhorash: What can be good in a "bad" project? (UA)Mykhailo Hryhorash: What can be good in a "bad" project? (UA)
Mykhailo Hryhorash: What can be good in a "bad" project? (UA)
 
Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)
Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)
Oleksii Kyselov: Що заважає ПМу зростати? Розбір практичних кейсів (UA)
 
Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...
Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...
Yaroslav Osolikhin: «Неідеальний» проєктний менеджер: People Management під ч...
 
Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...
Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...
Mariya Yeremenko: Вплив Генеративного ШІ на сучасний світ та на особисту ефек...
 
Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...
Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...
Petro Nikolaiev & Dmytro Kisov: ТОП-5 методів дослідження клієнтів для успіху...
 
Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...
Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...
Maksym Stelmakh : Державні електронні послуги та сервіси: чому бізнесу варто ...
 
Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)
Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)
Alexander Marchenko: Проблеми росту продуктової екосистеми (UA)
 
Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...
Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...
Oleksandr Grytsenko: Save your Job або прокачай скіли до Engineering Manageme...
 
Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)
Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)
Yuliia Pieskova: Фідбек: не лише "як", але й "коли" і "навіщо" (UA)
 
Nataliya Kryvonis: Essential soft skills to lead your team (UA)
Nataliya Kryvonis: Essential soft skills to lead your team (UA)Nataliya Kryvonis: Essential soft skills to lead your team (UA)
Nataliya Kryvonis: Essential soft skills to lead your team (UA)
 
Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...
Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...
Volodymyr Salyha: Stakeholder Alchemy: Transforming Analysis into Meaningful ...
 
Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...
Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...
Anna Chalyuk: 7 інструментів та принципів, які допоможуть зробити вашу команд...
 
Oksana Smilka: Цінності, цілі та (де) мотивація (UA)
Oksana Smilka: Цінності, цілі та (де) мотивація (UA)Oksana Smilka: Цінності, цілі та (де) мотивація (UA)
Oksana Smilka: Цінності, цілі та (де) мотивація (UA)
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
 
Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)
Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)
Andrii Skoromnyi: Чому не працює методика "5 Чому?" – і яка є альтернатива? (UA)
 
Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...
Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...
Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...
 

Gamedev Mixer. Лев Лукомський "Розробка власного 2D-редактора рівнів на Unity"

  • 1. Розробка власного 2D- редактора рівнів на Unity
  • 2. Трохи про гру та її виклики прив’язка до сітки різні конвеєри труби та інше...
  • 3. Готові асети vs свій велосипед SpriteTile Tile Builder UniTile Tiler U2DEX Nostalgia ... ціни: $15-30 різноманітні можливості з асетів: ● зручності редагування ● додаткові скрипти ● колекції картинок ● оптимізації drawcall’ів ● геренерація оптимальних колайдерів ● запікання шляхів ● прив’язка до сітки - єдине що нам треба
  • 4. Вікно редактора. початки Assets/Editor/LevelEditorWindow.cs: public class LevelEditorWindow : EditorWindow { public static bool editorEnabled = true; [MenuItem("Window/Level Editor %_l")] public static void Init() { var window = (LevelEditorWindow)GetWindow(typeof(LevelEditorWindow)); window.title = "Level Editor"; window.minSize = new Vector2(100, 50); } public void OnGUI() { editorEnabled = EditorGUILayout.Toggle("Enabled", editorEnabled); } }
  • 5. Зберігаємо дані. EditorPrefs Assets/Editor/LevelEditorWindow.cs: ... public void OnFocus() { if (EditorPrefs.HasKey("LevelEditorEnabled")) editorEnabled = EditorPrefs.GetBool("LevelEditorEnabled"); } public void OnLostFocus() { EditorPrefs.SetBool("LevelEditorEnabled", editorEnabled); } public void OnDestroy() { EditorPrefs.SetBool("LevelEditorEnabled", editorEnabled); } ...
  • 6. Головна логіка редактора Assets/Editor/LevelEditorWindow.cs: Vector3 lastSelectedPos; Transform selectedTrans; public void Update() { if (editorEnabled && !EditorApplication.isPlaying && Selection.transforms.Length == 1) { selectedTrans = SelectImportantObj(); if (selectedTrans.position != lastSelectedPos) { var snapped = SnapSelected(); if (snapped) { … } lastSelectedPos = selectedTrans.position; } } } ...
  • 7. Вибір головного об’єкта Assets/Editor/LevelEditorWindow.cs: static Transform SelectImportantObj() { var selectedTrans = Selection.activeTransform; var rootTrans = selectedTrans.root; if (rootTrans != null && rootTrans != selectedTrans) { if (rootTrans.CompareTag("Toggle") || rootTrans.CompareTag("Press") || ...) { Selection.activeTransform = rootTrans; } else if (rootTrans.CompareTag("Conveyer")) { Transform trans; if ((trans = selectedTrans.ClosestWithTag("ConveyerCorner")) != null) Selection.activeTransform = trans; else Selection.activeTransform = rootTrans; }
  • 8. Прив’язка з різними якорями Assets/Editor/LevelEditorWindow.cs: enum Snap { Half, One, OneHalf } bool SnapSelected() { if (selectedTrans.CompareTag("Arrow")) return false; if (selectedTrans.CompareTag("MainCamera") || ...) { return SnapCustom(selectedTrans, Snap.Half, Snap.Half); } if (selectedTrans.CompareTag("Ground") || ...) { return SnapCustom(selectedTrans, Snap.Half, Snap.OneHalf); } … return SnapCustom(selectedTrans, Snap.OneHalf, Snap.OneHalf); } static bool SnapCustom(Transform trans, Snap snapX, Snap snapY) { var pos = trans.position; var x = SnapCustomVal(pos.x, snapX); var y = SnapCustomVal(pos.y, snapY); if (Mathf.Abs(x - pos.x) > Mathf.Epsilon || Mathf.Abs(y - pos.y) > Mathf.Epsilon) { trans.position = new Vector3(x, y, pos.z); return true; } return false; }
  • 9. Інтерактивні елементи рівня Assets/Editor/LevelEditorWindow.cs: if (snapped) { rootTrans = selectedTrans.RootIfExists(); else if (rootTrans.CompareTag("Conveyer") && selectedTrans != rootTrans) HandleConveyer(); ... } void HandleConveyer() { ... conveyer.Resize(...); EditorUtility.SetDirty(conveyer); }
  • 10. Custom Editors база Assets/Editor/ConveyerEditor.cs: [CustomEditor(typeof(Conveyer))] public class ConveyerEditor : Editor { Conveyer conveyer; protected void OnEnable() { if (EditorUtility.IsPersistent(target) || !LevelEditorWindow.editorEnabled) return; conveyer = (Conveyer) target; } public override void OnInspectorGUI() { if (EditorUtility.IsPersistent(target) || !LevelEditorWindow.editorEnabled) { DrawDefaultInspector(); return; } … } }
  • 11. Custom Editors дія на зміну поля Assets/Editor/ConveyerEditor.cs: public override void OnInspectorGUI() { ... GUI.changed = false; var canChangeDirBefore = conveyer.canChangeDir; … DrawDefaultInspector(); if (GUI.changed) { if (canChangeDirBefore != conveyer.canChangeDir) conveyer.UpdateDirArrowDisabled(); … EditorUtility.SetDirty(conveyer); } }
  • 12. Скрипти- фіксери всіх рівнів Assets/Editor/LevelFixer.cs: public class LevelFixer : MonoBehaviour { [MenuItem("Custom/Fix Conveyers")] public static void FixLevelConveyers() { var conveyers = FindObjectsOfType<Conveyer>(); foreach (var conveyer in conveyers) { // ... fix conveyer … EditorUtility.SetDirty(conveyer.gameObject); } } [MenuItem("Custom/Fix Conveyers (All levels)")] public static void FixAllLevelsConveyers() { RunOnAllLevels(FixLevelConveyers); } } static void RunOnAllLevels(Action action) { if (!EditorApplication.SaveCurrentSceneIfUserWantsTo()) return; var currentScene = EditorApplication.currentScene; foreach (var scene in EditorBuildSettings.scenes) if (scene.path.Contains("Level")) { EditorApplication.OpenScene(scene.path); action(); EditorApplication.SaveScene(); } EditorApplication.OpenScene(currentScene); }
  • 14. Дякую за увагу :) Facebook: Лев Лукомський email: lllukom@gmail.com skype: lllukom