Готова ли Игра?
253 subscribers
122 photos
20 videos
9 files
31 links
Научу делать игры ПРАВИЛЬНО!

Для связи со мной: @ArtemiZ_GD
Download Telegram
А это мои итоги за прошлый год. Вот что мы успели сделать)
Помните, я писал про полезное расширение для Vector3?

так вот, еще одна ооочень простая идея, но иногда полезная, когда вы хотите поменять только одну координату вектора, но сделать это напрямую нельзя

    public static Vector3 WithX(this Vector3 vector, float x) 
{
return new Vector3(x, vector.y, vector.z);
}

public static Vector3 WithY(this Vector3 vector, float y)
{
return new Vector3(vector.x, y, vector.z);
}

public static Vector3 WithZ(this Vector3 vector, float z)
{
return new Vector3(vector.x, vector.y, z);
}


вот такие три метода помогут решить проблему

просто пишем:

    transform.position = transform.position.WithZ(0); // Зануление координаты Z


#Фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
Автоматический синглтон

Я обычно не использую синглтоны в проектах, так как они от части рушат структуру, но если вы их часто пишете, можно добавить в проект вот такой вот класс:
using UnityEngine;

public abstract class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;

public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if (_instance == null)
{
GameObject go = new GameObject(typeof(T).Name);
_instance = go.AddComponent<T>();
}
}
return _instance;
}
}

protected virtual void Awake()
{
if (_instance == null)
{
_instance = this as T;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}

Вы просто пишите:
public class SceneLoader : Singleton<SceneLoader> 
{
// Ваш код
}

Затем:
Singleton<SceneLoader>.Instance.LoadNextLevel();

и экономите кучу времени)

#Фишки
Было ли такое, что вы хотите во время симуляции в Unity узнать значение поля в классе?

Есть несколько вариантов это сделать:
1. С помощью Debug.Log();
2. С помощью перехода в Debug режим инспектора

Но эти варианты не всегда могут быть удобными

Поэтому я создал для вас кастомный Атрибут!

using UnityEditor;
using UnityEngine;

public class ReadOnlyAttribute : PropertyAttribute { }

#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]
public class ReadOnlyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUI.enabled = false;
EditorGUI.PropertyField(position, property, label);
GUI.enabled = true;
}
}
#endif


Добавляете файл в проект и пишете:

    [SerializeField, ReadOnly] private bool _isGrounded;


Если поле публичное (что я категорически не советую делать), SerializeField можно не писать

Update: Исправил баг с компеляцией

#Фишки
Если вы используете однотипные объекты, постоянно их создавая и уничтожая, лучше всего применять пул объектов для них.

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

Скидываю вам самое простое и быстрое решение:

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool<T> where T : Component
{
private readonly T _prefab;
private readonly Queue<T> _objects = new();

public ObjectPool(T prefab, int initialSize)
{
_prefab = prefab;

for (int i = 0; i < initialSize; i++)
{
CreateObject();
}
}

public T Get()
{
if (_objects.Count == 0)
{
CreateObject();
}

T obj = _objects.Dequeue();
obj.gameObject.SetActive(true);
return obj;
}

public void Return(T obj)
{
obj.gameObject.SetActive(false);
_objects.Enqueue(obj);
}

private void CreateObject()
{
T newObject = Object.Instantiate(_prefab);
newObject.gameObject.SetActive(false);
_objects.Enqueue(newObject);
}
}


Пишите в комментах, какие фишки хотите видеть в следующих постах❤️

#Фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
👾 Навигация 👾

🔤Теги

#Фишки - Посты с полезной информацией про Unity. Расширение, оптимизация или просто совет

#ЖизньArtemiZ - Посты с личной информацией. О том, как я стал программистом и как провожу свое время

#Спойлер - Посты - тизеры к моим текущим проектам. У меня есть как рабочие проекты, так и личные. Рано или поздно я их выпущу:)

#Мнение - рандомный пост с моим личным мнением на ту или иную тему. Скорее всего связанную с Unity

❗️Полезные статьи

Путеводитель для начинающего разработчика игр на Unity

Нейросети в разработке игр на Unity

Ссылки на полезную инфу

Порядок расположения элементов в классе

⭐️ Может тебя заинтересовать

Как я докатился до жизни такой - Пост о том, как я стал программистом
Please open Telegram to view this post
VIEW IN TELEGRAM
👾 Обо мне 👾

Меня зовут - Артем. Мне 22 года. 5 лет назад я начал изучать Unity, а сейчас работаю в Дубаях!

Здесь я делюсь своим опытом и помогаю новичкам (и не только) освоиться в этой сфере. Все-таки, за пять лет я успел трижды бросить универ и пройти путь от физика до программиста.

Оставайтесь со мной, чтобы не пропустить:
- полезные фишки
- истории из моей жизни
- процесс разработки крупных проектов

Мои работы:

На данный момент я могу поделиться с вами только очень старой демкой, которую я делал в рамках обучения.
Ссылка на билд
Ссылка на исходники
Please open Telegram to view this post
VIEW IN TELEGRAM
ShowIfAttribute.cs
5.1 KB
Атрибут условного отображения

У меня очень часто случается потребность скрыть или показать поле в зависимости от значений другого. Например, если _hasSecondaryFire == true я отображаю поле _secondaryFireCooldown и наоборот

Делаю подгон для вас!
Реализация данного атрибута с поддержкой пяти типов данных

(Boolean, Enum, Integer, Float, String)

и шести типов сравнений

(Equals, NotEquals, GreaterThan, LessThan, GreaterOrEquals, LessOrEquals)

А так же поддержка множественного условия! (я нигде не видел подобной реализации, так что считайте эксклюзив)

(And, Or)

Как использовать:

    public class Character : MonoBehaviour
{
[SerializeField] private int _level = 1;
[SerializeField] private float _health = 100f;
[SerializeField] private bool _isAlive = true;
[SerializeField] private CharacterClass _characterClass;

// Простое сравнение на равенство
[ShowIf(nameof(_isAlive), true)]
[SerializeField] private float _healthRegenRate;

// Использование оператора сравнения
[ShowIf(nameof(_health), CompareOperator.LessThan, 50f)]
[SerializeField] private bool _isLowHealth;

// Сложное условие с AND
[ShowIf(
nameof(_level), CompareOperator.GreaterOrEquals, 10,
nameof(_health), CompareOperator.GreaterThan, 30f
)]
[SerializeField] private bool _canUseSpecialAbility;

// Сложное условие с OR
[ShowIf(
nameof(_health), CompareOperator.LessThan, 20f,
Condition.Or,
nameof(_isAlive), false
)]
[SerializeField] private float _respawnTimer;

// Комбинация условий
[ShowIf(
nameof(_level), CompareOperator.GreaterOrEquals, 20,
nameof(_characterClass), CharacterClass.Mage,
Condition.Or,
nameof(_health), CompareOperator.LessThan, 30f
)]
[SerializeField] private bool _showEmergencyTeleport;
}


public enum CharacterClass
{
Warrior,
Mage,
Rogue
}


CompareOperator.Equals и Condition.And можно не указывать и пропускать, но советую так не делать, для большей читабельности

#Фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
Готова ли Игра? pinned «👾 Обо мне 👾 Меня зовут - Артем. Мне 22 года. 5 лет назад я начал изучать Unity, а сейчас работаю в Дубаях! Здесь я делюсь своим опытом и помогаю новичкам (и не только) освоиться в этой сфере. Все-таки, за пять лет я успел трижды бросить универ и пройти путь…»
Таймер

Вчера была достаточно сложная фишка, поэтому понижаем градус)

Удобный и простой класс для создания таймера и позможности подписаться на него (а так же поставить на паузу, и получить оставшееся и максимальное время работы)

Кто-то скажет: есть же Invoke(). Вот только, в него можно передать метод только по имени (или через nameof) и нельзя остановить. В общем, он менее удобный

using UnityEngine;

public class Timer
{
public event System.Action TimerComplete;

public float Duration { get; private set; }
public float RemainingTime { get; private set; }
public bool IsRunning { get; private set; }

public Timer(float duration)
{
Duration = duration;
RemainingTime = duration;
}

public void Restart()
{
IsRunning = true;
RemainingTime = Duration;
}

public void Start()
{
IsRunning = true;
}

public void Stop()
{
IsRunning = false;
}

public void Update()
{
if (IsRunning == false) return;

RemainingTime -= Time.deltaTime;

if (RemainingTime <= 0)
{
IsRunning = false;
RemainingTime = Duration;
TimerComplete?.Invoke();
}
}
}


Пример использования:

var timer = new Timer(5f);
timer.OnTimerComplete += () => Debug.Log("Время вышло!");
timer.Start();


#Фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
Как я докатился до жизни такой часть 1

Меня зовут - Артем. Я очень люблю игры! Особенно их создавать)

4 года мне понадобилось, чтобы пройти путь «От идеи до реализации», а точнее от желания начать создавать игры, до работы мечты!

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

Вот только программировать я особо не умел. Был у меня опыт написания простеньких программ на c++, но не больше «калькулятора».

Но большое желание - лучшая мотивация. За одно лето я изучил азы c# и Unity, но начался универ…

Скоро узнаете, что было дальше! А пока, пишите, как вы пришли к идее делать игры)


Продолжение

#ЖизньArtemiZ
🤘Путеводитель для начинающего разработчика игр на Unity

Написал для вас полноценное руководство с полного нуля до первой работы!
Пока писал, даже для себя отметил некоторые полезные вещи, так что рекомендую каждому хотя бы пролистать ее. Заодно поддержите меня)

Так же добавил ее в закреп в навигацию, чтобы не потерять)

Тем, кто напишет под этим постом отзыв о статье, я скину в личку полезный файлик от меня)
Please open Telegram to view this post
VIEW IN TELEGRAM
Готова ли Игра? pinned «🤘Путеводитель для начинающего разработчика игр на Unity Написал для вас полноценное руководство с полного нуля до первой работы! Пока писал, даже для себя отметил некоторые полезные вещи, так что рекомендую каждому хотя бы пролистать ее. Заодно поддержите…»
Media is too big
VIEW IN TELEGRAM
В честь выхода статьи я решил сделать что-то необычное для вас!

Представляю вам внутриигровую консоль! Команды для нее добавляются в 1 строку, а сама консоль легко настраивается в инспекторе!

Всем, кто напишет отзыв о статье в комментариях под прошлым постом - я скину исходники с небольшим гайдом)

Ну, а если никто не напишет - оставлю себе, пригодится!)
Задавайте любые вопросы!

Под этим постом вы можете оставить любой свой вопрос, один из них я подробно разберу в следующую пятницу!

Если вы стесняетесь написать лично, можете оставить анонимный вопрос через специального бота
Подписка
Вы получите доступ к закрытому чату, где вы сможете:

- задать мне любой вопрос и получить развернутый ответ
- получить доступ к демкам моих проектов
- периодически получать плюшки от меня
This media is not supported in your browser
VIEW IN TELEGRAM
Я тут создал закрытый чат для випов)

Прямо сейчас там лежит демка одной игрушки, которую мы сейчас делаем)

А еще вы сможете неограниченно спрашивать меня про всякое!
Как вы оцениваете себя сейчас?

Субъективно, как вы себя ощущаете. В скобках указал ориентировочное время плотного изучения сферы, в том числе практика)
Anonymous Poll
28%
Начинающий (до 6 месяцев)
28%
Junior (1-2 года)
10%
Middle (3-4 года)
8%
Senior (от 5 лет)
26%
Я вообще не разработчик:)
Как я докатился до жизни такой часть 2

Начало истории

Поступил я на направление «Программная инженерия», вроде программирование, но интереса к учебе вообще не было. Такой я человек, мне нужен результат, а теория вгоняет в депрессию:(

Первый раз я отчислился, поступил в другой вуз, взял академ, вернулся и опять отчислился. На все это ушло 3,5 года, а прогресса в плане разработки игр почти не было. Но параллельно я проходил курс Skillbox, а потом Ромы Сакутина.

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

Начался период «Возьмите меня куда-нибудь»

На этот момент у меня в портфолио был всего один маленький проект - курсовая Скиллбокса и все:)

А работу искать надо...

🔥 - если ждете продолжения, чтобы я знал, что такие посты стоит иногда писать)

Продолжение

#ЖизньArtemiZ
Please open Telegram to view this post
VIEW IN TELEGRAM