Прохожу курс Яюниор по юнити
♡2024 by Pixlife. Copying Art is an act of love. Love is not subject to law.
Post #328
150
MO @namlessmoth
Showing posts older than #330 · Back to latest
Forwarded from Дневник разработчика
Construct 3 Hack.rar3.3 KBForwarded from Рина Хиганбана
afav2_пкв1.gif215 KB1) Удаляйте неиспользуемые using
2) Base
1. FindObjectOfType - не используйте методы Find для получения ссылок на компоненты объектов со сцены, это неявное обращения к объектам и трудозатратное по производительности, также и с ResourceStorage
2. в OnDisable происходят подписки вместо отписок
3) можно не делать явное сравнение с правдой, например (isAlive == true) или isAlive != false). Результатом сравнения будет всё тоже значение, поэтому эта операция не нужна
4) ResourceDistributor - более 1 пустой строки подряд быть не должно
5) UnitsDepot - SendFreeUnitToGathering - условные операторы отделяются от остального кода пустой строкой с двух сторон
6) Builder
1. переменные должны именоваться в стиле camelCase
2. Input.GetMouseButtonDown(0) - магия
1) if (Vector3.Distance(positionNearby, transform.position) < _sphere.radius) - "Vector3.Distance - Это очень затратная операция из-за вычисления корня в конце. У процессора с этим туго. Везде где возможно лучше вместо дистанции использовать sqrMagnitude, это даже в документации написано (просто сравниваешь не с самой дистанцией, а с ее квадратом). https://t.me/KaDR_gamedev/83
2) public event Action<Resource> UnitUnloadResource;
3) public event Action ReadyForNewTask;
4) public event Action<Resource> UnitAimedAtResource; - события именуются в прошедшем времени с окончанием -ed или -ing
5) StartCoroutine(nameof(MoveToResourse), resource);
6) StartCoroutine(nameof(MoveToBase), resource); - немного странное решение. Почему сразу не написать StartCoroutine(MoveToBase (resource));
7) if (_resourceStorage.HasFreeStorageSpace == true) - не делайте явную проверку с true. Ведь результатом сравнения будет всё тоже значение
_base.GetComponent<ResourceDistributor>().Initialize();, а если на базе нет компонента ResourceDistributor?
8) if (_generator == null)
_generator = FindObjectOfType<ResourceGenerator>(); - я бы предпочел в OnValidate выводить ошибку что поле не заполнено
1) Удаляйте неиспользуемые using
2) UnitsSpawner - переменная Unit unit в функции SpawnUnit не нужна
3) HasFreeUnits - можно сократить public bool HasFreeUnits => _freeUnits.Count > 0; и кстати это свойство не используется в коде
4) ResourceStorage - лучше пишите методы событий Unity в порядке их вызова (Awake выше OnEnable, Start ниже OnEnable)
5) ResourceStorage - если класс называется хранилищем ресурсов, то он наверное должен выступать только складом, а не базой данных для бронирования ресурсов, для этого нужен отдельный класс
6) можно не делать явное сравнение с правдой, например (isAlive == true) или isAlive != false). Результатом сравнения будет всё тоже значение, поэтому эта операция не нужна
7) Unit стр 41 - вместо постоянного ручного перемещения объекта можно просто прекрепить его как дочерний объект и открепить когда довезём
8) Base
1. после { и перед } пустые строки не нужны
2. не мучайте код с помощью Update, пытайтесь отправить ботов за ресурсами только событийно в двух случаях, когда сканер событием оповестил что он обнаружил ресурсы (чтобы если все боты были без работы, то ничего не сломать), и в момент возвращения бота на базу, это сильно сократит количество вызовов метода GatherResouses
9) Builder - метод BuildBase ничего не делает, буквально, в нём кода нет
10) Player
1. поле _isBuildMode не используется
2. у всех членов класса должны быть явно указаны модификаторы доступа
3. переменные должны именоваться в стиле camelCase
Привет, Владислав.Мои мысли:
1) private void Scann() скан пишется с одной буквой н. )
2) Вынеси скан в отдельную сущность.
3) У ресурса не должно быть поля private bool _isFree = true; сделай класс который хранит найденные ресурсы и выдает только те, которые еще никому не назначил, то есть будет две коллекции, в одной будут храниться вообще все ресурсы, в другой те, которые еще никому не отдали.
4) public void PickUpByUnit(Unit unit) ресурс не должен знать о юните.
5) обычные поля отделяются от сериализованных пустой строкой.
6) Выдели отдельный класс по управлению юнитами и пускай база им владеет и работает с его методами. )
Создадим 3D игру с плоской картой. Камера позволяет наблюдать за всем пространством уровня. Реализовать следующие механики:
1. В начале игры на базе находятся три юнита
2. Во время игры в случайных местах уровня генерируются ресурсы (на ваш выбор)
3. База может сканировать пространство уровня на наличие ресурсов
4. Если у базы есть свободный юнит и несобранный ресурс, она отправляет юнита собрать этот ресурс
5. Когда юнит получил координаты ресурса, он физически берет ресурс и несет его на базу
6. У базы есть показатель количества доступных ресурсов. Когда юнит приносит новый ресурс, этот показатель увеличивается. Сам юнит ожидает дальнейших указаний
Сдавать как проект на Github + видео
Доработать
1. [SerializeField] private float _explosionRadius = 5f; [SerializeField] private float _explosionForce = 100f; - эти данные может хранить сам взрыватель, раз у вас на каждом кубе свой взрыватель
Или свойства по ним не нужны, если извне не получаете данные
2. private List<Rigidbody> _createdParts; - если не используется, то оно и не нужно
3. part.GetComponent<Rigidbody>() - а где гарантия, что данный компонент есть на объекте?
4. private Cube _cube; - поле не нужно. Вы в метод передаете нужный куб
Продолжаем работу над задачей “Взрывы кубов”.
Теперь реализуем именно взрыв, в случае если не происходит создание новых кубов. При нажатии на куб, он взрывается и исчезает, толкая другие кубы в разные стороны. Взрыв, действует в некоторой области. Чем дальше объект от центра взрыва, тем меньше силы будет приложено на объект. Чем меньше куб, тем больше радиус и сила с которой он раскидывает другие кубы.
Сдача как проект на Git + видео демонстрация.
1) стр 82 и 23 - магические числа
2) следует разделять ответственности, не засовывайте всю логику в один класс, вынесите логику применения силы, а также логику создания как в фабричных паттернах, в отдельные классы Exploader и Spawner, и эти компоненты должны быть не обязательно на кубах, можно и следует их держать отдельно от кубов
Доработать
1. newObject.GetComponent<Renderer>() - один объект не знает, какие могут быть компоненты у другого. Стоит или проверить наличие, или пусть второй сам найдет и сохранит у себя. А дальше или сам делает нужные действия с компонентом, или вернет его по запросу.
2. Instantiate(template - создавайте не по GameObject, а сразу по нужному компоненту и обращайтесь к его новому методу Init, чтобы задать все нужные данные.
3. for (int i = 0; i < UnityEngine.Random.Range(minCubeParts, maxCubeParts + 1); i++) - некорректное использование Random.Range - на каждой новой итерации цикла будет получено новое число. Сначала получите число в переменную и уже используйте переменную.
1) шанс деления куба следует хранить в классе Cube, спавнер должен только создавать
2) даже развёрнутым свойствам следует устанавливать приватный set, все изменения данных следует проводить в методах
На сцене находится несколько кубов. При нажатии на куб он исчезает и появляются новые кубы, в случайном количестве от 2 до 6 штук.
У каждого нового куба Scale уменьшен в два раза по всем осям.
Цвет каждого куба определяется случайным образом.
На каждый куб действует сила гравитации.
Шанс разделения с каждым разом уменьшается в 2 раза начиная со 100%. При успехе идет разделение, иначе куб просто исчезает.
Добавить взрывную силу из центра исчезнувшего куба, которая разбросает только созданные им объекты.
Сделать невидимые ограждения, чтобы кубики далеко не разлетались
Сдача как проект на Git + видео демонстрация.
Forwarded from Varaneu's Creatures