надеюсь дальше увижу такие вещи как: отрисовка только тех чанков которые видно на экране, также хотелось бы увидеть LODы типо чтобы в зависимости от того насколько далеко чанк от игрока, тем хуже его детализация, так же когда будет добавлена прозрачная листва, чтобы она на этих менее детализированных чанках была не прозрачной или вообще сплошным цветом
@@eennou чтобы сгенерировать Лод, вам надо сначала высчитать этот далёкий чаек. Соответственно дальность прорисовки должна быть увеличена. Можно переписать алгоритм чтобы он сначала высокие лоды создавал а потом уплотнял сетку.
Не шарю за сишарп, но разве тут нету реордеринга операций, read mem barrier, типа как в джяве? Применительно к коду, где в треде меняется chunkData без каких-либо примитивов синхронизации
Примитивы есть. Но тут я их не использовал, чтобы не блокировать потоки. По сути из таких примитивов у нас тут только барьер, там где цикл в корутине, который ждёт окончания генерации, но его тоже особо не заиспользуешь из стандартной либы, потому что он должен не поток блочить, а корутину откладывать. Ну а остальные гарантии потокобезопасности (если я конечно нигде не ошибся) у нас засчёт того поля state предоставляются
@@EmeraldPowder в Джаве компилятор в такой ситуации может просто реордеринг сделать операций - тоесть сначала выставить поле state, и только потом предыдущую операцию. Тоесть без барьеров нету гарантии порядка выполнения операций. И такое есть в других языках, включая си/си++, раст и т.д. Поэтому я ожидаю что в сишарпе тож самое должно быть.
@@mitallast вот кстати не знаю про это, может быть и есть тут какая-то опасность. Точно знаю что С такого не сделает, потому что там в стандарте ; это sequence point. А в С# я когда-то ковырялся в байткоде, и видел что он там вообще по минимуму оптимизировал во время компиляции, но вот что об этом стандарт говорит честно говоря совсем не знаю
Есть идея для игры, бесплатно дарю: игра похожая по механике на смесь Crossout и Space Engineers. Создаешь кораблики для боя и абордажа из маленьких кубиков (10*10*10 см), треугольников и тд (корпус), а так же функциональных модулей вроде оружия, двигателей, выдвижных панелей под другие модули, сборных конструкций вроде лифтов и тд. А потом в быстрый бой против других игроков или ИИ. Что бы не делать сложную физику разрушений и дать возможность игрокам по-настоящему творить шедевры за счет оптимизации и упрощений, корабль нельзя порвать на части как в SE, поскольку будет прозрачное поле структурной целостности, хотя можно пролезть через него персонажем. За баланс отвечают исключительно модули, навыки персонажа и модификаторы для модулей, но не вид корабля. Главное отличие такой игры от любой другой в том, что вам не нужно строить кирпич что бы быть эффективным, а значит вы сможете создавать самые красивые корабли и быть таким же опасным. Пока что игры, предлагающие возможности по постройке сложных красивых кораблей для боя или шутера от первого лица, слишком сложны, перегружены игровыми механиками и слишком несбалансированные. Прокачка по модели Crossout вполне подходит, надо лишь добавить прокачку навыков для игрока. Большими кораблями можно управлять нескольким игроками, сделать корабль матрешку (авианосец) или держать оборону от десанта в тесных коридорах придуманного тобою корабля. В дальнейшем можно создать больше миссий или даже большой динамичный мир как в EVE. Просто, потрясающе красиво, вариативно и сбалансировано
@@EmeraldPowder , я играл и нет, не похож. Робокрафт очередной представитель жиромобилей. Побеждал не тот кто лучше стреляет, а тот кто сделает самый жирный крафт по технике трифорс (слои не соединялись друг с другом и от того урон не проходил дальше, похоже на ДЗ). Моя же идея в том, что хоть ты построишь тонкий nebulon-b, хоть толстую звезду смерти, победу определят свои способности стрелять и то какие пушки и модули стоят у тебя, а не форма корпуса. Т.Е. Нельзя пальнуть в место сочленения двух половинок корпуса и надеяться что одна из них отвалится. Как результат люди будут стараться сделать не уродливые эффективные коробки, а боевые арткрафты. Именно этого не хватает мне буквально в любой подобной игре. Просто невозможно построить что-то впечатляюще красивое и одновременно эффективное
Как будто не всё рассказано на теме Minecraft, очень хотелось бы увидеть стрим или отдельный цикл видео посвященный реализации своего майнкрафта на деле
я буквально на прошлой неделе писал бота для дискорда и как раз столкнулся с потоками, асинхронностью и падениями "потому что гладилоус", я ща смотрю видео и меня прям накрывает флешбеками как я всё это дебажил. Усугубляло, что я впервые писал на питоне и матерился после node.js просто адски....
Да, потоки это наверное самое сложное для дебага, даже сложнее какого-нибудь мультиплеера. На питоне не знаю, но я вспоминаю как на С в универе писал через Юниксовые POSIX Threads, тогда C# с юнити перестаёт пугать)
await load() await create() load(){ var tasks = new List foreach(var c in chunks) task.Add(loadChunk(c)); await Task.WhenAll(tasks); } змінити await на yield return - сенс той самий
Интересно было бы посмотреть на реализацию генерации чанков через юнитивеские джобы, в синтетических тестах они почти в 3 раза быстрее тасков, и это не применяя распараллеливания (IJobParallelFor)
Было бы интересно посмотреть, можно ли таски заменить на Job`ы от юнити. К тому же будут видна отработка воркеров в профайлере. К тому же - будут сыпаться ошибки в какой джобе что-то пошло не так. В теории - отладка удобнее станет И если выйдет - сравнить результаты производительности.
а если пересчитывать surface только? У тебя же клик возможен только на краях чанка, так считать только этот ряд а не весь чанк. Там же матрица, ты номер ряда знаешь
А там непонятно как тогда понять какие полигоны из меша оставить, а какие пересчитать. Нужна будет ещё всякая хитрая логика чтобы определить к какому блоку полигон принадлежит, потом понять надо ли его оставить или удалить, потом решить какие ещё полигоны добавятся. Лучше для ускорения пересчёта просто сделать чанки поменьше, например тем что по вертикали делить мир на чанки, и оставить логику генерации меша максимально простой
Галочка тут конечно не сработает, потому что меш заранее не извествен, но можно похожего результата достичь батчингом в рантайме, гуглить по запросу StaticBatchingUtility. Но её в данном проекте тоже надо как-то не в лоб применять, а что-то хитрое придумывать
Так же криво получилось самому сделать аналоги GenerateRightSide для других сторон (Вы сделали это после их переноса в MeshBuilder "за кадром" - но так и не показали нигде итог - чуть видно по левой стороне а остальные нет - поэтому часть сторон в проекте кривые)
Ну по видосам чел не бомж, умеет могёт, а это в 99% случаях означает что работает на дядю и некогда ему ютубами вашими заниматься, деньги сами себя не заработают. На ютубе сидят в основном те кто тут заработывает или инфоцыгане (некоторые из них тож зарабатывают). Геймдев жрет кучу времени сам по себе, я тож делают игры, скоро релиз в стиме, если бы у меня был ютуб такой канал - то я понятия не имею как найти время пилить еще и видосики, это нереально.
@@NEKAlinka Да, один из немногих русскоязычных каналов по кодингу и юнити в том числе где видосы реально чего то стоят, а не просто видос ради видоса. Так что, я смотрю как выходит, можно и раз в год, мне торопиться некуда :)
Доброго времени суток. Если блок изменился на границе чанка, этот пограничный тоже нужно регенерировать, иначе при удаление образуются дыры, а при добавление лишние полигоны. Есть у кого-то пример кода, как это можно пофиксить или если это было в какой-то из частей роликов, напишите мне пожалуюста, буду благодарен.
Все хорошо, но Any я бы убрал из цикла и корутины, замена на простой цикл через for с пробегом по коллекции избавит от тупой аллокации в Any (linq не для геймдева, просто посмотрите профайлером). Любые аллокации, которых можно просто избежать переписав код, дадут больше профита на дистанции, чем красивый стройный код. Не надо приучивать людей к linq в рантайме, просто поверьте боли многих коммерческих проектов. Для редактора - пожалуйста, здесь проблем нет.
Нету ) но внутри есть как минимум два if на исключение и многие, как вы и сказали, не знают опасность лямбд. На больших коллекциях внутренние проверки будут давать какой-то оверхед, который вполне можно было бы избежать, написав тот же самый цикл, который лежит внутри Any
Привет, я решил повторить твою систему но столкнулся с багом, попробуй по копать блоки в -x, -z стороны. Знаю ты фиксил что-то подобное но если копать в - координаты где-то блоков 15-20 то на 1 участке начнёт выдавать ошибку (Null Ref), у тебя такой ошибки нет ? Попробуй пожалуйста.
Был такой баг, я его мимолётом фиксил не в той части, вот тут: ua-cam.com/video/z6W1a3IIT3k/v-deo.html После этого вроде нигде не падало, где бы ни копал
@@EmeraldPowder Привет, прости что так долго, но я думаю что ты меня не совсем правильно понял. Данный баг заключается в функции "GetChunkContainingBlock()", Я его решил, если нужно будет более подробное объяснение то могу кинуть решение.
Очередной раз откатил проект и заново выполнил за ментором эту часть. Возникает критическая ошибка при запуске сцены (спотыкается на таске террейна в LoadChunkAt). Это кусок видео-гайда с 7 по 15 минуту. Перепроверил сбился со счета сколько раз. Все так, а не запускается (( как и ментор убрал из GetBlockAtPosition у МешБилдера проверки навроде if (chunkData.ChunkLeft == null) return BlockType.Air; Не помогает! (( При старте сцены сразу получаю в таске террейна 169 входов в зону try (уведомления) и 148 в зону catch (ошибки). Затем с 50го фрейма по 80й по +1 входу в зону try. На сцене появляется единственный чанк (правда персонаж давно в свободном падении и не видит его). Больше ничего не происходит. Ментор будь добр - нужен совет опытного в этом деле ))
Два вечера подряд пытаюсь устранить появившуюся в этой части ошибку. Никак. Пересмотр гайда не помог. Обсуждения на форумах пока тоже (( ArgumentException: An item with the same key has already been added. Key: (-6, -6) System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) (at :0) System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) (at :0) PW.GameWorld.LoadChunkAt (UnityEngine.Vector2Int chunkPosition) (at Assets/PW/Scripts/GameWorld.cs:170) PW.GameWorld+d__15.MoveNext () (at Assets/PW/Scripts/GameWorld.cs:116) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at :0) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) PW.GameWorld:Start() (at Assets/PW/Scripts/GameWorld.cs:96)
Причина была в том, что после очередного рефакторинга кода оказалось 2 вызова ChunkDatas.Add(chunkPosition, chunkData); Устранил, - старая ошибка ушла, пришла обещанная автором (ради отлавливания которой писал catch (Exception e) ...) Object reference not set to an instance of an object UnityEngine.Debug:LogError (object) PW.GameWorld/c__DisplayClass16_0:b__0 () (at Assets/PW/Scripts/GameWorld.cs:178) System.Threading._ThreadPoolWaitCallback:PerformWaitCallback ()
При этом вроде как до каждого символа все перепроверил по видео. Опробовал все 3 варианта ожидайки. Ошибки висят. // ожидайка подгрузки Всех соседей чанка //yield return new WaitWhile(() => { // foreach (ChunkData c in loadingChunks) { // if(c.State == ChunkDataState.StartedLoading) return true; // } // return false; //}); //yield return new WaitWhile(() => { // return loadingChunks.Any(c => c.State == ChunkDataState.StartedLoading); //}); while (loadingChunks.Any(c => c.State == ChunkDataState.StartedLoading)) { yield return null; };
Сразу сажусь смотреть, крутяк, я не ожидал видео настолько быстро. Спасибо огромное за старание!
Жаль что следующая серия последняя. Узнать ещё что-то новое на примере майнкрафта было бы интересно. Спасибо за ролики
Как ты такой стикер сделал😮
Мож спонсорский@@лшд
Где видосы?
Вы - это офигенный мотиватор чему-то учиться :)
А вообще конечно Автору респект и уважуха! ))
Очень годный сделан гайд - Спасибо! ))
ура ти повернувся так довго тебе чекав чел просто шик
Ещё можно использовать ECS, это бомбическая штука.
спасибо за видео! очень интересно смотреть
Очень хочется увидеть мультиплеер в 3D песочнице
Сделай реализацию всех механик portal 2: порталы и портальная пушка("Старый видео урок впринципе есть"), поднятие предметов, кнопки обычные и нажимные, гели, мосты, раздатчики.
Прив! Когда выложишь исходники или игру?
слушай, а можешь сделать ролик, где расскажешь всё про свет? как настраивать, какие есть приколы и т.п., ну как делал раньше про звук там, анимации
Не думаю что он впринцепе уже сделает ролик.
Может продолжишь майн? Добавишь спавны деревьев и разные блоки)
надеюсь дальше увижу такие вещи как: отрисовка только тех чанков которые видно на экране, также хотелось бы увидеть LODы типо чтобы в зависимости от того насколько далеко чанк от игрока, тем хуже его детализация, так же когда будет добавлена прозрачная листва, чтобы она на этих менее детализированных чанках была не прозрачной или вообще сплошным цветом
lodы в играх с процедурной генерацией ландшафта это жестоко
@@elitdie но это неплохая идея, видел мод для майна, который добавляет лоды чанкам. Отличная вещь, к тому же рабочая
@@eennou реализовать можно хоть сову на глобусе. Вопрос на каком компе это будет играться и как быстро
@@elitdie генерация лодов не сильно нагружает, она по идее наоборот должна уменьшить нагрузку
@@eennou чтобы сгенерировать Лод, вам надо сначала высчитать этот далёкий чаек. Соответственно дальность прорисовки должна быть увеличена. Можно переписать алгоритм чтобы он сначала высокие лоды создавал а потом уплотнял сетку.
Привет. Спасибо за крутую серию уроков. А будет ссылка на репозиторий проекта?
У меня есть идея для следующей игры
Срочно нужно добавить динамит 😂
Это всё, последнее видео? Уже три месяца нет новостей....
Не шарю за сишарп, но разве тут нету реордеринга операций, read mem barrier, типа как в джяве? Применительно к коду, где в треде меняется chunkData без каких-либо примитивов синхронизации
Примитивы есть. Но тут я их не использовал, чтобы не блокировать потоки. По сути из таких примитивов у нас тут только барьер, там где цикл в корутине, который ждёт окончания генерации, но его тоже особо не заиспользуешь из стандартной либы, потому что он должен не поток блочить, а корутину откладывать. Ну а остальные гарантии потокобезопасности (если я конечно нигде не ошибся) у нас засчёт того поля state предоставляются
@@EmeraldPowder в Джаве компилятор в такой ситуации может просто реордеринг сделать операций - тоесть сначала выставить поле state, и только потом предыдущую операцию. Тоесть без барьеров нету гарантии порядка выполнения операций. И такое есть в других языках, включая си/си++, раст и т.д. Поэтому я ожидаю что в сишарпе тож самое должно быть.
@@mitallast вот кстати не знаю про это, может быть и есть тут какая-то опасность. Точно знаю что С такого не сделает, потому что там в стандарте ; это sequence point. А в С# я когда-то ковырялся в байткоде, и видел что он там вообще по минимуму оптимизировал во время компиляции, но вот что об этом стандарт говорит честно говоря совсем не знаю
Есть идея для игры, бесплатно дарю: игра похожая по механике на смесь Crossout и Space Engineers. Создаешь кораблики для боя и абордажа из маленьких кубиков (10*10*10 см), треугольников и тд (корпус), а так же функциональных модулей вроде оружия, двигателей, выдвижных панелей под другие модули, сборных конструкций вроде лифтов и тд. А потом в быстрый бой против других игроков или ИИ. Что бы не делать сложную физику разрушений и дать возможность игрокам по-настоящему творить шедевры за счет оптимизации и упрощений, корабль нельзя порвать на части как в SE, поскольку будет прозрачное поле структурной целостности, хотя можно пролезть через него персонажем. За баланс отвечают исключительно модули, навыки персонажа и модификаторы для модулей, но не вид корабля. Главное отличие такой игры от любой другой в том, что вам не нужно строить кирпич что бы быть эффективным, а значит вы сможете создавать самые красивые корабли и быть таким же опасным. Пока что игры, предлагающие возможности по постройке сложных красивых кораблей для боя или шутера от первого лица, слишком сложны, перегружены игровыми механиками и слишком несбалансированные. Прокачка по модели Crossout вполне подходит, надо лишь добавить прокачку навыков для игрока. Большими кораблями можно управлять нескольким игроками, сделать корабль матрешку (авианосец) или держать оборону от десанта в тесных коридорах придуманного тобою корабля. В дальнейшем можно создать больше миссий или даже большой динамичный мир как в EVE. Просто, потрясающе красиво, вариативно и сбалансировано
Похоже на Robocraft по описанию, он был когда-то хорош
@@EmeraldPowder , я играл и нет, не похож. Робокрафт очередной представитель жиромобилей. Побеждал не тот кто лучше стреляет, а тот кто сделает самый жирный крафт по технике трифорс (слои не соединялись друг с другом и от того урон не проходил дальше, похоже на ДЗ). Моя же идея в том, что хоть ты построишь тонкий nebulon-b, хоть толстую звезду смерти, победу определят свои способности стрелять и то какие пушки и модули стоят у тебя, а не форма корпуса. Т.Е. Нельзя пальнуть в место сочленения двух половинок корпуса и надеяться что одна из них отвалится. Как результат люди будут стараться сделать не уродливые эффективные коробки, а боевые арткрафты. Именно этого не хватает мне буквально в любой подобной игре. Просто невозможно построить что-то впечатляюще красивое и одновременно эффективное
Привет, а что делает => такой значек до тела метода? Выполняет тело метода, без вызова? Сильно не ругайте если вопрос простой
стрелочная функция. Безымянная. Чтобы код не засирать, когда тебе нужно пару действий на колбэк какой-нибудь повешать
А как на счет контекста синхронизации?)
Слава палигонам, ты не помер, и хорошо!
Асинхронность не равно многопоточность. Посмотри реализацию UnitySyncronizationContext.
А чанки деспавнятся? Иначе при достаточно большом мире игра умрёт
Где новое видео, сколько можно ждать?
Где скачать?
Как будто не всё рассказано на теме Minecraft, очень хотелось бы увидеть стрим или отдельный цикл видео посвященный реализации своего майнкрафта на деле
Сделай реки и озёра пожалуйста
А потом попробуете сделать "Terraria"?
я буквально на прошлой неделе писал бота для дискорда и как раз столкнулся с потоками, асинхронностью и падениями "потому что гладилоус", я ща смотрю видео и меня прям накрывает флешбеками как я всё это дебажил. Усугубляло, что я впервые писал на питоне и матерился после node.js просто адски....
Да, потоки это наверное самое сложное для дебага, даже сложнее какого-нибудь мультиплеера. На питоне не знаю, но я вспоминаю как на С в универе писал через Юниксовые POSIX Threads, тогда C# с юнити перестаёт пугать)
await load()
await create()
load(){
var tasks = new List
foreach(var c in chunks)
task.Add(loadChunk(c));
await Task.WhenAll(tasks);
}
змінити await на yield return - сенс той самий
Интересно было бы посмотреть на реализацию генерации чанков через юнитивеские джобы, в синтетических тестах они почти в 3 раза быстрее тасков, и это не применяя распараллеливания (IJobParallelFor)
Да и вообще интересно было бы посмотреть на примере этого проекта всю связку: ECS, Burst Compiler и C# Job System.
У меня есть идея для следующей игры
Снова новая часть! Ура!
мистер изумруд, вернитесь, мир умирает без ваших уроков... :(
Таски, корутины. Автор ты совсем на голову болеешь? Это юнити, тут есть jobs + burst. Трансляция в LLVM вот это всё. Ну да, ну да, пошёл я ... )
Иди, иди.....
@@ВалентинаМозжерина-ш1ра вот и комментарии от ограниченных в когнитивных способностях подъехали.
Было бы интересно посмотреть, можно ли таски заменить на Job`ы от юнити. К тому же будут видна отработка воркеров в профайлере. К тому же - будут сыпаться ошибки в какой джобе что-то пошло не так. В теории - отладка удобнее станет
И если выйдет - сравнить результаты производительности.
Можно использоватт джобы)
Подпишусь 👍👍
а если пересчитывать surface только? У тебя же клик возможен только на краях чанка, так считать только этот ряд а не весь чанк. Там же матрица, ты номер ряда знаешь
А там непонятно как тогда понять какие полигоны из меша оставить, а какие пересчитать. Нужна будет ещё всякая хитрая логика чтобы определить к какому блоку полигон принадлежит, потом понять надо ли его оставить или удалить, потом решить какие ещё полигоны добавятся. Лучше для ускорения пересчёта просто сделать чанки поменьше, например тем что по вертикали делить мир на чанки, и оставить логику генерации меша максимально простой
кина не будет. расходимся
ОН ЖИВОЙ, боже, обожаю ролики с этого канала)
Оп-оп, как быстро вышло! Круто
Согласен.
А если сделать меш чанка статик батчинг ?
Тут меш каждого чанка разный, бесполезно
Галочка тут конечно не сработает, потому что меш заранее не извествен, но можно похожего результата достичь батчингом в рантайме, гуглить по запросу StaticBatchingUtility. Но её в данном проекте тоже надо как-то не в лоб применять, а что-то хитрое придумывать
Это канал Артёма который про Блендер рассказывал? Голос очень похож.
Так же криво получилось самому сделать аналоги GenerateRightSide для других сторон (Вы сделали это после их переноса в MeshBuilder "за кадром" - но так и не показали нигде итог - чуть видно по левой стороне а остальные нет - поэтому часть сторон в проекте кривые)
Заведи себе бусти плз, есть ещё масса не освещенных тем)
Изумрудик, мы тебя ждём.
Жаль, что видео больше не выходят
Ну по видосам чел не бомж, умеет могёт, а это в 99% случаях означает что работает на дядю и некогда ему ютубами вашими заниматься, деньги сами себя не заработают. На ютубе сидят в основном те кто тут заработывает или инфоцыгане (некоторые из них тож зарабатывают). Геймдев жрет кучу времени сам по себе, я тож делают игры, скоро релиз в стиме, если бы у меня был ютуб такой канал - то я понятия не имею как найти время пилить еще и видосики, это нереально.
@@Saltant ну, я примерно так и думал. Но все равно жалко. Контент классный
@@NEKAlinka Да, один из немногих русскоязычных каналов по кодингу и юнити в том числе где видосы реально чего то стоят, а не просто видос ради видоса. Так что, я смотрю как выходит, можно и раз в год, мне торопиться некуда :)
Доброго времени суток. Если блок изменился на границе чанка, этот пограничный тоже нужно регенерировать, иначе при удаление образуются дыры, а при добавление лишние полигоны. Есть у кого-то пример кода, как это можно пофиксить или если это было в какой-то из частей роликов, напишите мне пожалуюста, буду благодарен.
Да, такой баг есть пока, спасибо. Когда инпутом займусь обязательно поправлю
Здравствуйте, у меня есть предложение для вас, как с вами связаться?
В чем код пишешь?
Jetbrains Rider
Все хорошо, но Any я бы убрал из цикла и корутины, замена на простой цикл через for с пробегом по коллекции избавит от тупой аллокации в Any (linq не для геймдева, просто посмотрите профайлером). Любые аллокации, которых можно просто избежать переписав код, дадут больше профита на дистанции, чем красивый стройный код. Не надо приучивать людей к linq в рантайме, просто поверьте боли многих коммерческих проектов. Для редактора - пожалуйста, здесь проблем нет.
Можно просто метод сделать вместо лямбды и не будет аллокаций
Там не только лямбда даст алоки
@@darkmax85 У Any All Count нет аллокаций кроме неявной от лямбды же
Нету ) но внутри есть как минимум два if на исключение и многие, как вы и сказали, не знают опасность лямбд. На больших коллекциях внутренние проверки будут давать какой-то оверхед, который вполне можно было бы избежать, написав тот же самый цикл, который лежит внутри Any
Привет, я решил повторить твою систему но столкнулся с багом, попробуй по копать блоки в -x, -z стороны. Знаю ты фиксил что-то подобное но если копать в - координаты где-то блоков 15-20 то на 1 участке начнёт выдавать ошибку (Null Ref), у тебя такой ошибки нет ?
Попробуй пожалуйста.
Был такой баг, я его мимолётом фиксил не в той части, вот тут: ua-cam.com/video/z6W1a3IIT3k/v-deo.html
После этого вроде нигде не падало, где бы ни копал
@@EmeraldPowder Привет, прости что так долго, но я думаю что ты меня не совсем правильно понял. Данный баг заключается в функции "GetChunkContainingBlock()", Я его решил, если нужно будет более подробное объяснение то могу кинуть решение.
Суть его в том что если ChunkWidth 32 то тогда любой блок на координатах x:-32 или z:-32 (+-1 блок) не получится вскопать или поставить.
Спасибо тебе. Твоя работа и этот канал вдохновляет.
Очередной раз откатил проект и заново выполнил за ментором эту часть.
Возникает критическая ошибка при запуске сцены (спотыкается на таске террейна в LoadChunkAt).
Это кусок видео-гайда с 7 по 15 минуту. Перепроверил сбился со счета сколько раз. Все так, а не запускается ((
как и ментор убрал из GetBlockAtPosition у МешБилдера проверки навроде if (chunkData.ChunkLeft == null) return BlockType.Air;
Не помогает! ((
При старте сцены сразу получаю в таске террейна 169 входов в зону try (уведомления) и 148 в зону catch (ошибки).
Затем с 50го фрейма по 80й по +1 входу в зону try. На сцене появляется единственный чанк (правда персонаж давно в свободном падении и не видит его). Больше ничего не происходит.
Ментор будь добр - нужен совет опытного в этом деле ))
А что в ошибке пишет?
Два вечера подряд пытаюсь устранить появившуюся в этой части ошибку. Никак. Пересмотр гайда не помог. Обсуждения на форумах пока тоже ((
ArgumentException: An item with the same key has already been added. Key: (-6, -6)
System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) (at :0)
System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) (at :0)
PW.GameWorld.LoadChunkAt (UnityEngine.Vector2Int chunkPosition) (at Assets/PW/Scripts/GameWorld.cs:170)
PW.GameWorld+d__15.MoveNext () (at Assets/PW/Scripts/GameWorld.cs:116)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at :0)
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
PW.GameWorld:Start() (at Assets/PW/Scripts/GameWorld.cs:96)
Причина была в том, что после очередного рефакторинга кода оказалось 2 вызова ChunkDatas.Add(chunkPosition, chunkData);
Устранил, - старая ошибка ушла, пришла обещанная автором (ради отлавливания которой писал catch (Exception e) ...)
Object reference not set to an instance of an object
UnityEngine.Debug:LogError (object)
PW.GameWorld/c__DisplayClass16_0:b__0 () (at Assets/PW/Scripts/GameWorld.cs:178)
System.Threading._ThreadPoolWaitCallback:PerformWaitCallback ()
При этом вроде как до каждого символа все перепроверил по видео. Опробовал все 3 варианта ожидайки. Ошибки висят.
// ожидайка подгрузки Всех соседей чанка
//yield return new WaitWhile(() => {
// foreach (ChunkData c in loadingChunks) {
// if(c.State == ChunkDataState.StartedLoading) return true;
// }
// return false;
//});
//yield return new WaitWhile(() => {
// return loadingChunks.Any(c => c.State == ChunkDataState.StartedLoading);
//});
while (loadingChunks.Any(c => c.State == ChunkDataState.StartedLoading)) {
yield return null;
};