На этом канале регулярно появляются новые видео, которые позволят тебе научиться создавать игры, или подарят новые идеи и вдохновение, если ты уже умеешь!
Туториалы по созданию законченных игр, по реализации какой-то механики, обзоры новых версий и инструментов, и просто рассуждения и рассказы на касающиеся GameDev'a темы. В основном видео связанны с Unity 3D, но я стараюсь рассказать и о других альтернативах
Пікірлер
Спасибо, правда час промучался, не мог понять почему у меня вставляется не там где надо, а оказывается, что есть зависимость от Scale объекта, пришлось умножить все координаты на LossyScale
Жаль, что видео больше не выходят
Ну по видосам чел не бомж, умеет могёт, а это в 99% случаях означает что работает на дядю и некогда ему ютубами вашими заниматься, деньги сами себя не заработают. На ютубе сидят в основном те кто тут заработывает или инфоцыгане (некоторые из них тож зарабатывают). Геймдев жрет кучу времени сам по себе, я тож делают игры, скоро релиз в стиме, если бы у меня был ютуб такой канал - то я понятия не имею как найти время пилить еще и видосики, это нереально.
@@Saltant ну, я примерно так и думал. Но все равно жалко. Контент классный
@@NEKALINKA Да, один из немногих русскоязычных каналов по кодингу и юнити в том числе где видосы реально чего то стоят, а не просто видос ради видоса. Так что, я смотрю как выходит, можно и раз в год, мне торопиться некуда :)
Как же похожи номер 5 и номер 78 игровых механик.
За что ты назвал прототайп старой игрой?
Код из видео(без ошибок): using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class ChunkRenderer : MonoBehaviour { private const int ChunkWidth = 10; private const int ChunkHeight = 128; public int[,,] Blocks = new int[ChunkWidth, ChunkHeight, ChunkWidth]; private List<Vector3> verticies = new List<Vector3>(); private List<int> triangles = new List<int>(); void Start() { Mesh chunkMesh = new Mesh(); Blocks[0, 0, 0] = 1; Blocks[1, 0, 0] = 1; for (int y = 0; y < ChunkHeight; y++) { for (int x = 0; x < ChunkWidth; x++) { for (int z = 0; z < ChunkWidth; z++) { GenerateBlock(x, y, z); } } } chunkMesh.vertices = verticies.ToArray(); chunkMesh.triangles = triangles.ToArray(); chunkMesh.RecalculateNormals(); chunkMesh.RecalculateBounds(); GetComponent<MeshFilter>().mesh = chunkMesh; } private void GenerateBlock(int x, int y, int z) { var blockPosition = new Vector3Int(x, y, z); if (GetBlockAtPosition(blockPosition) == 0) return; if (GetBlockAtPosition(blockPosition + Vector3Int.right) == 0) GenerateRightSide(blockPosition); if (GetBlockAtPosition(blockPosition + Vector3Int.left) == 0) GenerateLeftSide(blockPosition); if (GetBlockAtPosition(blockPosition + Vector3Int.forward) == 0) GenerateFrontSide(blockPosition); if (GetBlockAtPosition(blockPosition + Vector3Int.back) == 0) GenerateBackSide(blockPosition); if (GetBlockAtPosition(blockPosition + Vector3Int.up) == 0) GenerateTopSide(blockPosition); if (GetBlockAtPosition(blockPosition + Vector3Int.down) == 0) GenerateBottomSide(blockPosition); } private int GetBlockAtPosition(Vector3Int blockPosition) { if (blockPosition.x >= 0 && blockPosition.x < ChunkWidth && blockPosition.y >= 0 && blockPosition.y < ChunkHeight && blockPosition.z >= 0 && blockPosition.z < ChunkWidth) { return Blocks[blockPosition.x, blockPosition.y, blockPosition.z]; } else { return 0; } } private void GenerateRightSide(Vector3Int blockPosition) { verticies.Add(new Vector3(1, 0, 0) + blockPosition); verticies.Add(new Vector3(1, 1, 0) + blockPosition); verticies.Add(new Vector3(1, 0, 1) + blockPosition); verticies.Add(new Vector3(1, 1, 1) + blockPosition); AddLastVerticiesSquare(); } private void GenerateLeftSide(Vector3Int blockPosition) { verticies.Add(new Vector3(0, 0, 0) + blockPosition); verticies.Add(new Vector3(0, 0, 1) + blockPosition); verticies.Add(new Vector3(0, 1, 0) + blockPosition); verticies.Add(new Vector3(0, 1, 1) + blockPosition); AddLastVerticiesSquare(); } private void GenerateFrontSide(Vector3Int blockPosition) { verticies.Add(new Vector3(0, 0, 1) + blockPosition); verticies.Add(new Vector3(1, 0, 1) + blockPosition); verticies.Add(new Vector3(0, 1, 1) + blockPosition); verticies.Add(new Vector3(1, 1, 1) + blockPosition); AddLastVerticiesSquare(); } private void GenerateBackSide(Vector3Int blockPosition) { verticies.Add(new Vector3(0, 0, 0) + blockPosition); verticies.Add(new Vector3(0, 1, 0) + blockPosition); verticies.Add(new Vector3(1, 0, 0) + blockPosition); verticies.Add(new Vector3(1, 1, 0) + blockPosition); AddLastVerticiesSquare(); } private void GenerateTopSide(Vector3Int blockPosition) { verticies.Add(new Vector3(0, 1, 0) + blockPosition); verticies.Add(new Vector3(0, 1, 1) + blockPosition); verticies.Add(new Vector3(1, 1, 0) + blockPosition); verticies.Add(new Vector3(1, 1, 1) + blockPosition); AddLastVerticiesSquare(); } private void GenerateBottomSide(Vector3Int blockPosition) { verticies.Add(new Vector3(0, 0, 0) + blockPosition); verticies.Add(new Vector3(1, 0, 0) + blockPosition); verticies.Add(new Vector3(0, 0, 1) + blockPosition); verticies.Add(new Vector3(1, 0, 1) + blockPosition); AddLastVerticiesSquare(); } private void AddLastVerticiesSquare() { triangles.Add(verticies.Count - 4); triangles.Add(verticies.Count - 3); triangles.Add(verticies.Count - 2); triangles.Add(verticies.Count - 3); triangles.Add(verticies.Count - 1); triangles.Add(verticies.Count - 2); } }
Также код террейн генератора В ChunkRenderer в строках private const int ChunkWidth = 10; private const int ChunkHeight = 128; замените private на public. И строки Blocks[0, 0, 0] = 1; Blocks[1, 0, 0] = 1; замените на Blocks = TerrainGenerator.GenerateTerrain((int)transform.position.x, (int)transform.position.z); Код TerrainGenerator: using UnityEngine; public static class TerrainGenerator { public static int[,,] GenerateTerrain(int xOffset, int zOffset) { var result = new int[ChunkRenderer.ChunkWidth, ChunkRenderer.ChunkHeight, ChunkRenderer.ChunkWidth]; for (int x = 0; x < ChunkRenderer.ChunkWidth; x++) { for (int z = 0; z < ChunkRenderer.ChunkWidth; z++) { float height = Mathf.PerlinNoise((x + xOffset) * .2f, (z + zOffset) * .2f) * 5 + 10; for (int y = 0; y < height; y++) { result[x, y, z] = 1; } } } return result; } }
Думал новое видео...(
Интересно, я один смотрю это видео, при этом не умея делать игры?
помогите я сделал точно также но без плавного перехода, и когда сцена загрузилась то у меня какая-то беда со светом, то-есть я уже даже пост процессинг отрубил но свет при переходе на сцену становиться зеленоватым и я это уже на сцене никак не могу пофиксить, и причем если я начну игру прямо с основной сцены то такого бага нету
За урок однозначный лайк. Только "кюррент" ухо режет.
Убедительная просьба к автору в начале видео указывать версии ПО которым он пользуется. Это облегчит работу подписчикам а вам их прибавит)
Все получилось, спасибо автору. Много чего не понятно, потому что я не настолько искушен в программировании, да и С# осваиваю самостоятельно. Однако, кто из новичков столкнется с проблемами в данном видео (ввиде неправильной генерации блоков) попробуйте поменять лево и право, скорее всего как и у автора у вас будет такая же проблема.)
Интересно. Заметил, что у автора видео запущена игра, но открыто окно сцены, а не игры. Открыл свое окно сцены - все работает. Странный подход, ну да ладно. Видимо иначе в таком русле нельзя)
Пытался воссоздать код, перепроверил все 20 раз - не работает. Возможно нужно указать версию юнити, на которой делалось? У меня 22я разбирая все пошагово нашел что код не работает с самого начала. То есть тупо треугольник не отрисовывается.
Как мне делать игру про взлом замков,грифинг и локальный мультиплеер?
У меня не появляется блок. Что делать?
Это кто это у тебя в ГТА мог возродиться и отомстить?
Ролик довольно старый, но вместо атрибута executeAlways можно использовать метод onValidate, вынести логику изменения в отдельный метод и вызывать его из OnValidate и из Update. Так будет вызываться только необходимое и отпадает надобность проверять включена ли игра или нет
Спасибо,теперь у меня есть идея для моей игры
Чё за игра?
Спасибо я так долго искал как сделать много способов попробовал и только твой помог.
Ребят, у кого смена skybox происходит всего один раз, а после он остается неизменным вне зависимости от времени суток, то это потому, что один skybox приобретает свойства другого. Чтобы этого избежать: создайте 3-й skybox, который вы выставите в настройках освещения (ночной, дневной он или еще какой - не важно, его всего равно изменит скрипт на нужный, или точнее сказать, изменит его параметры), а другие два, которые вы создали для дня и для ночи, назначьте в скрипте, как и в видео. Таким образом у нас выставлен в настройках skybox, параметры которого мы изменяем на дневные или ночные через скрипт.
В названии 3D ,а в видео только 2D
У МЕНЯ ШЕЙДЕР ПОРТАЛ В ФИОЛЕТОВЫЙ ПРЕВРАТИЛ
Даже родная апб засветилась
Прикольно
Что я вынес с урока: - корутина позволит тебе задерживать пчелочку на месте, а потом сделать чтобы она упала - корутина сможет спаунить с пчелки монеты - корутина заканчивается на тина, а ещё там всякие yield return ы есть, которые помогают процессы на время задерживать (на время или до выполнения какого -то условия)
23 7 98
у меня игрок не встаёт в центр ячейки, а встаёт сбоку
А как можно сделать траву, цветы, лозу всякую... забор, кнопку... ? (То, что не формы куба)
Спасибо за работу, наверное много времени потратил на ролик
Не садите, а сажаете
Спасибо за урок, все получилось. Однако при развитии возник вопрос - как теперь созданный материал с шейдером прикрепить к terrain? При попытке сделать это получаю предупреждение с текстом "The provided Material's shader might be unsuitable to use with Terrain in the active render pipeline...". Если проигнорировать и запустить, следов не видно и все начинает очень тормозить...
3:28 зелье удачи в террарии просто увеличивает вашу удачу на протиядении некоторого времини, например чаще выпадают редкие вещи, больше монет выпадет и всякое такое(удача также помагает убитт босса).
Либрариум повесился
14, 71,56 так чтоб незабыть
19: обожнюю цю механіку
Как только я увидел FireWatch в первых кадрах я уже понял, что автор молодЭц
Где видосы?
Это называется falling sand Игры на falling sand: The Powder Toy, Noita, Powder Game
5 26 80 Изменено: 7 26 80
19,25,90
Это мне одному кажется: сильно быстрое перечисление механик игры? В любом случае: благодарю за видео 😊
6:00
🥲
Эмиральд ты красава!=) А можно использовать твой проект и создать свою игру на ГуглСторе на его основе?
😮Фаренгейт - психологическая шкала персонажа, 🎉Макс Пейн - замедление времени Ps. Подписался из рекомендаций ютуба
От души, бро, единственный кто рассказал мне все по порядку, чтоб сильно не нагружать новичков. Остальные с каждым гайдом только все больше отталкивают иебя от изучения
+
оч крутое видео. Нравится что все открыто для нашего воображения, придумывай, сочитай. Надеюсь люди вдохновятся роликом
Нажимаю "Switch to this", что-то происходит, все чудно, открываю юнити - никакого предложения перезагрузить сцену - в гите теперь старая версия, а в юнити новая как была так и осталась :/ P.S. какой-то полный бред, что для того, чтобы первый раз сделать коммит нужно закрыть проект в юнити, иначе выдаст 350 ошибок. После этого открыть проект, и снова сделать коммит, тогда сработает. Потом, если захочешь переключиться на раннюю версию, тебе нужно закрыть проект, иначе получишь ошибку "Unlink of file Failed. Should I try again?" А если вдруг ты не закрыл при этом проект и получил эту ошибку, то вернувшись в окно юнити он предложит тебе перезагрузить сцену и откатит все изменения до той версии что ты выбрал, вроде бы победа, ура, вот только в истории гита проекта ты останешься на той же версии где был, ты же получил ошибку, а значит ничего не должно было происходить, а если все сработало, его это уже не парит, отдыхай малыха. Короче резюмируя - если вы как и я новичек, который думал использовать простенькую программу контроля версий для себя без мороки чтобы вдруг что было куда откатится, НИ В КОЕМ СЛУЧАЕ НЕ КАЧАЙТЕ СРАНЫЙ ГИТ, я чтобы определить причины вышеописанных проблем 3 дня потратил, поберегите нервы