Тёмный
Emerald Powder
Emerald Powder
Emerald Powder
Подписаться
На этом канале регулярно появляются новые видео, которые позволят тебе научиться создавать игры, или подарят новые идеи и вдохновение, если ты уже умеешь!
Туториалы по созданию законченных игр, по реализации какой-то механики, обзоры новых версий и инструментов, и просто рассуждения и рассказы на касающиеся GameDev'a темы. В основном видео связанны с Unity 3D, но я стараюсь рассказать и о других альтернативах
Что нового в Unity 2020.1
4:40
3 года назад
Комментарии
@txdd21
@txdd21 2 часа назад
Код из видео(без ошибок): 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); } }
@txdd21
@txdd21 Час назад
Также код террейн генератора В 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; } }
@alex_rahvalov
@alex_rahvalov 9 часов назад
Думал новое видео...(
@redfox2964
@redfox2964 День назад
Интересно, я один смотрю это видео, при этом не умея делать игры?
@yesiamppl
@yesiamppl День назад
помогите я сделал точно также но без плавного перехода, и когда сцена загрузилась то у меня какая-то беда со светом, то-есть я уже даже пост процессинг отрубил но свет при переходе на сцену становиться зеленоватым и я это уже на сцене никак не могу пофиксить, и причем если я начну игру прямо с основной сцены то такого бага нету
@alexisnienov4677
@alexisnienov4677 2 дня назад
За урок однозначный лайк. Только "кюррент" ухо режет.
@globalacademyorigina1
@globalacademyorigina1 3 дня назад
Убедительная просьба к автору в начале видео указывать версии ПО которым он пользуется. Это облегчит работу подписчикам а вам их прибавит)
@globalacademyorigina1
@globalacademyorigina1 3 дня назад
Все получилось, спасибо автору. Много чего не понятно, потому что я не настолько искушен в программировании, да и С# осваиваю самостоятельно. Однако, кто из новичков столкнется с проблемами в данном видео (ввиде неправильной генерации блоков) попробуйте поменять лево и право, скорее всего как и у автора у вас будет такая же проблема.)
@globalacademyorigina1
@globalacademyorigina1 4 дня назад
Интересно. Заметил, что у автора видео запущена игра, но открыто окно сцены, а не игры. Открыл свое окно сцены - все работает. Странный подход, ну да ладно. Видимо иначе в таком русле нельзя)
@globalacademyorigina1
@globalacademyorigina1 4 дня назад
Пытался воссоздать код, перепроверил все 20 раз - не работает. Возможно нужно указать версию юнити, на которой делалось? У меня 22я разбирая все пошагово нашел что код не работает с самого начала. То есть тупо треугольник не отрисовывается.
@user-ec7qu1dz4u
@user-ec7qu1dz4u 4 дня назад
Как мне делать игру про взлом замков,грифинг и локальный мультиплеер?
@VovarbtyVovarbty
@VovarbtyVovarbty 6 дней назад
У меня не появляется блок. Что делать?
@user-tx6gw5lc4n
@user-tx6gw5lc4n 7 дней назад
Это кто это у тебя в ГТА мог возродиться и отомстить?
@ROK_220
@ROK_220 14 дней назад
Ролик довольно старый, но вместо атрибута executeAlways можно использовать метод onValidate, вынести логику изменения в отдельный метод и вызывать его из OnValidate и из Update. Так будет вызываться только необходимое и отпадает надобность проверять включена ли игра или нет
@bleki4307
@bleki4307 16 дней назад
Спасибо,теперь у меня есть идея для моей игры
@juliap.5375
@juliap.5375 12 дней назад
Чё за игра?
@user-eq9cs2qs9s
@user-eq9cs2qs9s 19 дней назад
Спасибо я так долго искал как сделать много способов попробовал и только твой помог.
@dmitryzh3344
@dmitryzh3344 20 дней назад
Ребят, у кого смена skybox происходит всего один раз, а после он остается неизменным вне зависимости от времени суток, то это потому, что один skybox приобретает свойства другого. Чтобы этого избежать: создайте 3-й skybox, который вы выставите в настройках освещения (ночной, дневной он или еще какой - не важно, его всего равно изменит скрипт на нужный, или точнее сказать, изменит его параметры), а другие два, которые вы создали для дня и для ночи, назначьте в скрипте, как и в видео. Таким образом у нас выставлен в настройках skybox, параметры которого мы изменяем на дневные или ночные через скрипт.
@tepr1
@tepr1 20 дней назад
В названии 3D ,а в видео только 2D
@lopatinpavel
@lopatinpavel 21 день назад
У МЕНЯ ШЕЙДЕР ПОРТАЛ В ФИОЛЕТОВЫЙ ПРЕВРАТИЛ
@user-so5gd8eh3j
@user-so5gd8eh3j 21 день назад
Даже родная апб засветилась
@fighter2499
@fighter2499 24 дня назад
Прикольно
@Salvadorioo
@Salvadorioo 25 дней назад
Что я вынес с урока: - корутина позволит тебе задерживать пчелочку на месте, а потом сделать чтобы она упала - корутина сможет спаунить с пчелки монеты - корутина заканчивается на тина, а ещё там всякие yield return ы есть, которые помогают процессы на время задерживать (на время или до выполнения какого -то условия)
@Kory4252
@Kory4252 28 дней назад
23 7 98
@user-uw1ur4vs6n
@user-uw1ur4vs6n 28 дней назад
у меня игрок не встаёт в центр ячейки, а встаёт сбоку
@viktorkuznetsov1617
@viktorkuznetsov1617 28 дней назад
А как можно сделать траву, цветы, лозу всякую... забор, кнопку... ? (То, что не формы куба)
@user-ht9ef2xq6b
@user-ht9ef2xq6b 29 дней назад
Спасибо за работу, наверное много времени потратил на ролик
@sonyaseluyanova7843
@sonyaseluyanova7843 Месяц назад
Не садите, а сажаете
@SergeyBaranov_ru
@SergeyBaranov_ru Месяц назад
Спасибо за урок, все получилось. Однако при развитии возник вопрос - как теперь созданный материал с шейдером прикрепить к terrain? При попытке сделать это получаю предупреждение с текстом "The provided Material's shader might be unsuitable to use with Terrain in the active render pipeline...". Если проигнорировать и запустить, следов не видно и все начинает очень тормозить...
@SuperSayanKrisik
@SuperSayanKrisik Месяц назад
3:28 зелье удачи в террарии просто увеличивает вашу удачу на протиядении некоторого времини, например чаще выпадают редкие вещи, больше монет выпадет и всякое такое(удача также помагает убитт босса).
@boba4289
@boba4289 Месяц назад
Либрариум повесился
@LEV2010
@LEV2010 Месяц назад
14, 71,56 так чтоб незабыть
@P1xelC47GM
@P1xelC47GM Месяц назад
19: обожнюю цю механіку
@ray_games.animations
@ray_games.animations Месяц назад
Как только я увидел FireWatch в первых кадрах я уже понял, что автор молодЭц
@LAKERBorisEleseenko
@LAKERBorisEleseenko Месяц назад
Где видосы?
@kepka55
@kepka55 Месяц назад
Это называется falling sand Игры на falling sand: The Powder Toy, Noita, Powder Game
@Linlees
@Linlees Месяц назад
5 26 80 Изменено: 7 26 80
@coolskibidigman
@coolskibidigman Месяц назад
19,25,90
@SashaLuchik
@SashaLuchik Месяц назад
Это мне одному кажется: сильно быстрое перечисление механик игры? В любом случае: благодарю за видео 😊
@KMsmiler
@KMsmiler Месяц назад
6:00
@KMsmiler
@KMsmiler Месяц назад
🥲
@user-eq6pv2xt2s
@user-eq6pv2xt2s Месяц назад
Эмиральд ты красава!=) А можно использовать твой проект и создать свою игру на ГуглСторе на его основе?
@enekne
@enekne Месяц назад
😮Фаренгейт - психологическая шкала персонажа, 🎉Макс Пейн - замедление времени Ps. Подписался из рекомендаций ютуба
@xhyrx1620
@xhyrx1620 Месяц назад
От души, бро, единственный кто рассказал мне все по порядку, чтоб сильно не нагружать новичков. Остальные с каждым гайдом только все больше отталкивают иебя от изучения
@krivodeling7925
@krivodeling7925 Месяц назад
+
@nv06_
@nv06_ Месяц назад
оч крутое видео. Нравится что все открыто для нашего воображения, придумывай, сочитай. Надеюсь люди вдохновятся роликом
@Slava.Hizhnyak
@Slava.Hizhnyak Месяц назад
Нажимаю "Switch to this", что-то происходит, все чудно, открываю юнити - никакого предложения перезагрузить сцену - в гите теперь старая версия, а в юнити новая как была так и осталась :/ P.S. какой-то полный бред, что для того, чтобы первый раз сделать коммит нужно закрыть проект в юнити, иначе выдаст 350 ошибок. После этого открыть проект, и снова сделать коммит, тогда сработает. Потом, если захочешь переключиться на раннюю версию, тебе нужно закрыть проект, иначе получишь ошибку "Unlink of file Failed. Should I try again?" А если вдруг ты не закрыл при этом проект и получил эту ошибку, то вернувшись в окно юнити он предложит тебе перезагрузить сцену и откатит все изменения до той версии что ты выбрал, вроде бы победа, ура, вот только в истории гита проекта ты останешься на той же версии где был, ты же получил ошибку, а значит ничего не должно было происходить, а если все сработало, его это уже не парит, отдыхай малыха. Короче резюмируя - если вы как и я новичек, который думал использовать простенькую программу контроля версий для себя без мороки чтобы вдруг что было куда откатится, НИ В КОЕМ СЛУЧАЕ НЕ КАЧАЙТЕ СРАНЫЙ ГИТ, я чтобы определить причины вышеописанных проблем 3 дня потратил, поберегите нервы
@OnTheWayToTheDirection
@OnTheWayToTheDirection Месяц назад
Лучший
@vyacheslav6620
@vyacheslav6620 Месяц назад
блин почему нельзя встроить это в юнити..
@cd6693
@cd6693 Месяц назад
спасибо!
@proleternal
@proleternal Месяц назад
Интересная задумка, но проще и красивее по стандарту использовать цельные текстуры для цельных блоков, но просто перерисовать их в соответствии с желаемым масштабом. Например, 4х4 текстура и блоки в 4 раза меньше в коде (хотя проще размер персонажа увеличить в 4 раза). Так и вычислений на видеокарту меньше ложится, и код везде понятнее, и боковая текстура травы адекватнее выглядит, и видеопамяти меньше занято. В идеале вообще наслайсить текстуры в Texture2DArray, чтобы не вычислять uv каждой текстуры, а просто передавать индекс текстуры через uv2. В шейдере благодаря встроенным функциям Unity это требует замены лишь нескольких строк кода, зато удобства привносит - хоть отбавляй.