Hello and welcome to episode 4 hive 5 episode 5 minecraft in unity in this episode we are going to create some basic terrain in the last one we generated our trunks but trunks are fairly blunt and let’s be honest a bit boring so in this one we’re Going to make them look like an actual not not a final world obviously this is I’m only going over the basics here in general but this is just gonna get the basic shape of the terrain and a bit of detail in the makeup of the terrain which will hopefully become a bit Clearer as we get going also before I get started let’s say somebody commented on my other previous videos if I could make my code a little bit bigger because it’s a bit difficult to read just the font size which I’m going to do obviously if anyone’s got any pointers Like that anything to make the videos a bit easier to follow I understand it’s a bit of an uphill battle with my accent and voice in the first place so anything I can do to make it a bit easier to follow along please feel free to comment Let me know and also because it’s a YouTube video well I can subscribe so we’ll start off we’re going to use Perlin noise which I don’t know what level everyone’s I’m assuming most people watching my videos a fairly big in Irish because if not why are you Watching my videos so we’re gonna use Perlin noise which is a pseudo random I guess pattern you call a procedure basically it creates a random pattern of zeros and ones and everything in between so I’ll just pull up a picture it’ll be a lot easier to explain so this is a Visualization of Perlin noise so if you imagine all of the black patches all of the absolute black is zeros and all of the absolute white is ones and then all of the gray shades in between is 0.1 0.2 etc what this is is it’s obviously fairly random looks like a cloud rhythm In it but it’s repeatable so if you start off with the same seed and then you pick a random coordinate because it you can basically you can pick any x and y coordinate in Perlin noise and it will give you back a you’ll be able to get a Zero to one value and anything in between and if you have the same seed and pick the same coordinate you will always get the same value so it’s not truly random which is what we want doing again my minecraft because the way you want the seeds to work that way because Otherwise you’re never going to be able to generate the same world twice so we’re going to use Perlin noise to do this so to start with we’re going to create a new script we’re just gonna call it noise for now open that and I will make my code bigger as requested oh God just don’t a bit more than one function on the screen so this is going to be a static class like our voxel day class we don’t need to run any functions in hid where I don’t need to run any Molly behavior functions in here and we Would like to be able to get to it from wherever now unity has a function built-in imperiling function we’re going to use that this is not the most performant noise function available as far as I know simplex which is one of them are calm and once you be able fine If you do a quick search on Perlin noise is better so I understand I’ve know I’ve not done too much research on that particular thing myself for the purpose of this tutorial this will be fine if you want to replace this Perlin noise with another pearl in noise are you Wrong totally noisy figure adventurous want to code your own it should work exactly the same it’s the this is we’re not coding our own noise Perlin noise function we’re just using the existing one so you can swap this out with wherever you want so we’re gonna create A public static float and we’re gonna call this one get to the pearl in and we’re specifying there is 2d because there will be a 3d pearl in later on so we do need to distinguish between the two so it’s going to take in a vector2 It’s going to take in an offset I’ll explain that in a bit and it’s going to take in a scale and then in here what we’re going to do is return mass MRF math math F however you pronounce it dr. Lin noise and then we’re gonna pass In first off position X and we’re going to add just a 0.1 here and the reason for this is there’s a bit of a weird bug in unities Perlin noise where if you pass it a whole number you will always get the same value I’m not sure why it’s Been around for a long time I’m not sure why it’s not being fixed but if you if you pass in there should be a dot here by the way sorry if you’re passing a whole number it will always give you the same value I think it’s something like 0.475 where it is so this that’s all this 0.1 is is just to make whatever we pass in not a whole number because we are only dealing in whole numbers in this game it’s always one two three four zero or whatever and then we need what Is it’s kind of a tile size we’re just gonna use chunk width because why not and then we want to times that by our scale which is spelt like that not however the hell I chose typed it and then we want to plus offset and then if We just copy this for our Y value obviously we want to change this to position dot why close the buckets and that is all our 2d noise function is gonna do because the purling noises pearly noise this scale so basically when we take a sample of a Pearl in noise the scale will determine how big is so with a smaller scale would be like this so a sample might be over here or over here where is passing in the same value with a smaller scale number it will be like over here or over here so essentially by adjusting the Scale you can make the easiest way to explain it is if you picture these white parts as mountains and the black parts as ground that is one of the most common uses for Perlin noise you’d basically you’d have a more bumpy mountainous ground and then if you reduce the scale Which just ironically makes the pearly noise bigger then you would get less mountains but sort of a more rolling hill kind of thing hopefully it’ll become clear as I can to every more so now we’ve got that we’re gonna need to open our world script the First thing we’re gonna need to do it will give ourselves a public int seed and where that’s gonna come in is at the very start we need to initialize the random state machine and this means that as long as this number is the same we will always get the same pearl in noise So as long as this numbers are the same the world will always look the same so this is if you play Minecraft and I’m assuming if you watching this tutorial you have the part where you have the option to write in anything you want we Can only put an int in but you can that’s something that’s not too difficult to change this is that value and then if we go into unity itself we’ll just put any run once it’s caught up we’ll just put any random number in there we go now To show the to show actually working just so you can see see it in action we’re gonna go down to get to Vauxhall and so basically we’ve got right here this is returning bedrock this is returning air if it’s outside this is returning bedrock if it’s the very Bottom this is returning stone and then this one is the one that we’re going to mess with this is if it is the very top block of a chunk it’s returning grass so we’re going to change this just get some curly brackets in here and then what We’re going to do is we’re going to get a float just recall it Tim noise I guess it doesn’t it’s not really important and this will equal noise dot get 2d pearl in the position is a new vector to positive x positive said we don’t need the Y value obviously The offset is entirely unimportant at this point so we’ll just put not on this scale we will put just put 0 1 for now now with that float we’re going to do this if just remember these values the value is returning is a normalized value Between 0 & 1 so if temp knows is less than 0.5 return three and then else return oh you know what we don’t actually have a I need an alternative block and I don’t think we’ve got one yeah well really we’re already using stone and grass we need another block Otherwise we’re not gonna know that it’s working so if I just pull up wherever I put it my texture reference picture will use sand so 10 all this once and all the faces are the same Danny is solid and that is now index 0 1 2 3 4 so go back in here so if it’s below 0.5 return 3 if it’s above return 4 so now we should have a bit of a pattern on the top of our chunks it’s not much of a pattern if we move around we should see more of it so it’s Something like this this is really just to show you in action so it’s essentially what’s happening here is because we’re only sampling below and above 0.5 we don’t get all this detail we’re just getting two different colors so it’s reducing all this detail to this pattern and that’s What we need so now that we have that in place we can make things a little bit more interesting so the first thing that we want to do is we want to go in back into our gap voxel and we’re gonna start reworking this entirely so if I let’s Just get rid of well get rid of everything except for that that we’re keeping so we’re gonna break it into sections so this top section we’ll just call this a mutable pass and what this meant what this means is that anything that’s done here is absolute so this this first Check that we’ve got here if it’s outside the world and that’s what that check does then we are returning an air book that’s always gonna be the case he doesn’t matter whereabouts the in the world we are well we’re outside the world if that one’s checking true there Anything that’s in this immutable past bit it doesn’t matter where we are in the world it doesn’t matter what biome we are doesn’t matter what height we are it doesn’t matter what seed we’re using these values will always return exactly as they are if this condition is true And the same for you know what let’s just give ourselves a little bit of a value up here because we’re gonna need it just be a bit easier if we just make this an int from the start and I’ll start annotating these a bit just to get make it easier to follow Along alright so for now they’re the only immutable values we’ve got but basically if it’s the bottom block or it’s outside the world it will always return these values it doesn’t none of the other information is important because it’s all the bottom block is always going to be bedrock the outside The world is always gonna be air or you could you could make this a solid block it’s not going to draw the block remember this is just so that we know what to do when we get to the edge of the world returning it as an air block Means that it will always draw the outside of the world so you get like a solid chunk edge around the outside of the world which we’re going to leave like that so that you can see some of the detail later on once we’ve got going with the actual terrain generation so if We get past here then when to our next pass we’re gonna call this one just first no I’ll call it basic terrain pass so if we get this far we’re gonna need another value and this value is gonna be called terrain height so this is going to be as the name suggests the Height of the terrain at this point and to get this we need to do a long hard to follow line of code so oh you know I’ll do it and they saw this supposed to be easier follow so we get were you gonna use our noise function noise don’t get too okay it’s Already filled in for me new vector2 pause acts said remember even though it’s asking for a while you why his height and we’re only dealing in two dimensions of the minute and our two dimensions in the real world at X and set so it’s important to try not to get Confused by y&z when you’re dealing to I’m three dimensions at the same time we’re just gonna pull up 0.25 I’ve played with these values a bit so I’m not entirely on show I’m doing right so right now that’s just getting a sorry I forgot my offset that’s about 500 it’s Really it really doesn’t matter I’m not just correct spelling I saw half of these videos are just make correcting typos so the problem with this is we’re asking for an int obviously this but this is only receiving a value between 0 & 1 now obviously flauta int is either gonna Give us 0 like 99 times out of 100 and maybe the occasional one bartering isn’t that that’s arraigns a bit bigger than that so what we do that because this is given as a value between 0 & 1 weaken times our chunk high by it and then what that will do what’s called A adult chunk all right times that now what I’ll do is it is basically this will act as a percentage so voxel date chung-kai which I can’t remember what currently is I think it’s like 15 yeah 15 so if that was 10 for example and this returned a Value of 0.5 then the height would be 5 so this gets as this translates our zero or to one value into a real-world height based on whatever our Cronkite is and the beauty of this is you can change your chung-kai at any point and don’t need to do anything with this code it Will still work so then we’re gonna do a check if Y pause is less than or equal to terrain height we will return to stone else return 0 so if it’s less than whatever this height is we’re gonna get a solid block and if not we’ll get a if It’s higher than it will get an air block and this should give us some detail now so if we’re going to chunk because we haven’t had to do this yet we aren’t actually checking to see if a block is solid before we draw it so here sorry yeah cuz we’ve we’ve just been Filling the chunk up completely every block has been solid so it’s not been important to check whether a block is solid before we draw because we know the block is solid so we just need to put a little a little check here yeah so we’re only drawing wrong drawing A Vauxhall if it is solid and that should get rid of that weird layer on the top that looks better so now we’ve got some some terrain to look at not much to look at but we’ll just let’s just change this a little bit if wipe ours is equal to terrain height Return three else if else if y Paz is greater than terrain height return air and then finally else return to should make it a little bit more interesting there we go so we’ve got some basic looking terrain now which is a lot nicer to look at them all were Looking at before so you may have guessed from the fact that we can see bedrock on the surface that we’re not quite done yet so the problem we where the reason we can see bedrock is that our mouth here timesing the chunk out by whatever value we get that is the entire Chunk height so a value if the value comes back is zero if the high comes back is zero then we’re going right down to bedrock and obviously there’s no terrain in Minecraft there goes completely down to bedrock well I guess maybe you could have a canyon but that’s That’s down a lot less advanced stuff we’re just doing the basic terrain for now so we need to deal with that I mean the first the first thing we’re going to do is we’re going to change some values in here we’re gonna make the chunk sorry we’re gonna make the chunk height 128 And we’re gonna make the chunk with 16 which I believe is the original minecraft values and then just so we can see things a little bit because this is gonna start to get a bit more system intensive and I don’t want you start waiting for the game to load every time I press play so we’re gonna change this to 10 now we’re gonna change this to 5 no no no we’re gonna leave it on 10 and we’re gonna leave that on 5 which if I running now won’t be a massive amount different they’ll just be more of everything There we go and now because it’s dry because I’ve changed the world size to be within the view distance because if you remember it’s the view distance is five but it’s five each way you can now see the edges of the world and obviously the edges of the world solid stone it’s Starting to look a bit more like like Minecraft not much but we’re getting that so what we need to do now is we need to give it some more some more detail and the way we’re gonna go about that is we’re gonna create a scriptable object first because we want to be able To in future we want to be able to have multiple values for generating the world and we don’t have to change our line code so we’re gonna call this biome attributes and this is gonna be a scriptable object so again it doesn’t need any of the mana behavior stuff Scriptable objects and we’re gonna want to create the stuff create these from the asset man from the asset menu so create asset menu file name equals and obviously these names are whatever you want to call them this is just what I’m calling them so if we go back here we’re gonna create A folder for it we just call this data and then in dates I’ll create another folder for biomes and then in here we should be able to create by him a tribute I’m just gonna call this one default for now so what do we want in Here well the most obvious one is a string for the name which is very self-explanatory now this would be said if you were if you were making if I was making a proper game this would be soap eventually it would be setup more complicated with more knobs and dials to Twiddle but because we’re just going through this tutorial I just want to get you get things done which is so this this isn’t the way I would do that if I was making this into a proper game this is the way I’m choosing to do it To illustrate how to do it so the first value we’re gonna have is a public int and we’re gonna call this one solid ground height and what this is is below this value we’re going to assume it’s always solid ground to start with we may modify that after the fact like so that If you remember we have different passes this is just the basic terrain pass eventually there’ll be more passes you might want to have a cave Pass for example or a canyon pass or mountain pass or whatever this is just basic terrain and in the basic terrain pass or ever done with that We’re gonna have a solid ground high and below this this value it will always be solid to start with and it just it takes some of the burden off the algorithm because we know if it’s below that value we don’t need to do anything with it we Can just assume it’s solid and make its toll or whatever our default block is and then above that we’re going to have a public int we’ll call this from terrain height and what this is is this is the height of the terrain from the solid ground height to the highest point That you want your terrain to go so if the solid ground is let’s say 40 and your terrain height is 30 then the highest point that the world will be like the highest point of terrain that you will have in your world will be 70 hopefully that made sense and then we’re Gonna need a float for the scale terrain scale that’s just gonna be flush straight into our noise function and I think that will do for now and if we go back into here we can set these values default solid ground I was using 42 we’ll just make that 40 to about 42 and We’ll keep that from 0.25 in our world class we need to take in that potater class so we just drug this into here now we can use it in our world class in our get box or function which I have lost there we go right so this pretty much stays Untouched we still know that if it’s below that position then we need to return more and if it’s below the opposition we need to return zero none of that changes this bit slightly changed because we now have a terrain scale the offset now that’s not where the terrain scale goes the offset we’re Just gonna have zero it’s really no important for this one the reason you want the reason we have enough set at all is because if you use the function the noise function for more than one thing and you’ve got the same values in the same area say for example you were Using it for tree placement and you wanted to use the noise value twice once for tree plant placement and once for flower placement for example and you use the same position X so in position Z and you have the same scale and then you have the Same you have no offset then it would be trying to put trees and flowers in the same place every time whereas if you have an offset you could use all the same details but you would get different result because it’s essentially sampling a different part essentially sampling a Different part of the noise so like one might be a square over here there and another one might be over there just because of your offset again I hope this is coming across clear now we’re using our biome atributes class to get some details we can go on with the rest of it This we’re gonna leave the same but we’re gonna add another one in here oh we’re gonna need another block block which is one on the texture map currently so I don’t know the one of these dirt obviously it’s solid and then just ones across the vault cuz the dirt Block is the same on our sides and then this is gonna return one and then you’ll see what this does in a second so all this is gonna do is just give us a bit more depth to the surface layer so we’ve got grass on top we have stone across The board and then Oh it also helps give us the right value the texture value was one but the block ID is five I was good to remember the difference between a texture value and the block ID so now it just gives us a little bit more depth to it now as you Can see it’s still going all the way to the floor which we do not want we want to have some we don’t want it to go we don’t want our zero two one zero um ones from the blob fell in nice to apply all the way from bedrock to sky so We need to implement that next so first thing we do is change chunk height to biome dot terrain height so now it works the same way but now it’s only applying itself to this value rather than the full chunk I like it was and then all we Need to do is add whatever this value is to you buy on solid ground height and then we have our total terrain height from ground to where ever the world comes to wherever the terrain comes through on that point so if we press play now we should have a more reasonable looking Terrain yeah that looks far more firm less extreme should I say and we have our bedrock at the bottom there and we have a few layers of dirt below our grass and we’re not seeing stone through the extremely steep hills anymore so we’re starting to get something that Looks a bit more minecraft II now but we don’t want to stop there so we need to add a 3d nice function now so we’re gonna go into a nice class and we’re just gonna add this as a as another function this one is going to be a bull And the reason for this is we’re using the 2d noise to create depth like a height map but we can’t use 3d noise like that because it’s it’s 3d so this is gonna be a bull instead and basically we’re gonna pass in a threshold and what It’s going to do is it’s going to check whatever value it gets from the details we give it against that threshold and if it’s above it then we will return true and if it’s not above it will return false because all this is doing all we’re using this for really is to check Against the noise and decide whether there’s gonna be a block there or not it’s kind of working like that it’s solid or not in the chunk functions and we’re just going to use it to basically add a bit more detail to the chunk itself this time we’re gonna need to take in a Vector3 one our offset again on our scale again and this time we also need a threshold I mean we don’t need this fresh old but we’re going we could have a static threshold but it just gives us a little little bit more control over what we’re gonna get back again there are external Things you could use to get if reading pearl in noise what I ended up selling on was Tom again not the most efficient way of doing it but very simple to understand basically I found a video on youtube of a guy who just had it very Simple 3d noise I’ll post a link in the show notes and just quickly show you it it’s this video here somewhere along here there we go this basically takes a cross-section of three different purling noises using the value that you divide the XYZ values you pass in and then it returns 3d Perlin Noise using those it’s very simple its elegant it’s perfect for this tutorial because you don’t need to understand anything new once you’ve got your head around purling 2d Perlin noise then the 3d polling noise makes perfect sense so we couldn’t again full credit to that guy I’ll just copy his link in there So we want position directs plus offset and then for the same reason plus 0.1 because if you don’t give the offset a decimal value we’re still gonna end up with a whole number and then time scale they want to do the exact same thing for Y and Zed and then we need to start comparing all the values math Perlin noise X Y and we’re just gonna copy this and adjust values as necessary we need six of those so this one BC this one AC and then we’d basically doing the same thing again but we’re reversing the Values we had the first time or should be why that one is XE and then again we’re just reversing the values that we had the first time so I know it’s not very interesting what you mean mess around with single characters on multiple lines of code hopefully you follow what I’m doing Though and then we get to our check so if a B plus BC plus AC plus B a plus C CB plus CA divided by 6 is greater than whatever threshold we pass in return true and if it’s not return false and that is our get 3d Berlin function so Now we’re gonna go into a scriptable class and we’re going to create a new class and we’re gonna call this one loads basically as in like mother lode of that kind of thing because that’s essentially what this would be used for it’s not gonna be what I’m demonstrating In this video but essentially this would be used for generating ORS a new world so it’s gonna want to be a system serializable class because we’re going to be editing in biome a tribute asset we’ll give it a string so that we can name it public bites block ID and this Is whatever block this load represents so if we had an INR or a diamond our block this is where you will put the ID for that we’re gonna give it a public int min height a public and max height and if it wasn’t obvious basically this is just means that below this height We’re not going to apply the this particular load and above the height we’re not going to apply it so an example of this was I don’t know if it’s still the case it’s been a long time since I’ve actually played Minecraft but it used to be the case that diamonds Could only be found in like levels three to ten or something so if that was the case then min high would be 3 max I would be 10 and then you wouldn’t find whatever this load is anywhere outside of that we’re gonna give it a float for Scale a float for threshold and a float for noise offset so now if we go into here we should have so no way you have to actually put it in here though public load array loads and now if we’re going here when it updates we should find Ourselves a nice little array we can edit we’ll give it to to start with dirt again like I said I’m not working with actual loads here do it was 5 min height for this one we’re gonna get one max height we’re just gonna put 255 obviously the chunks don’t go as high as 255 but it just means that there is no upper limit in the world for where a dirt load can go scale zero point one threshold 0.5 offset we will leave at zero and then this one sand block ID for that was I can’t remember look I never send okay Far far and this one we will give a min height so overall 15 no much let’s go a bit higher or let’s go 30 max I 2 5 5 so basically this means that we will no smoke a bit higher actually this means that we shouldn’t see any sunt Below no though we’re not going to generate any visible let’s go 30 to 60 so there’s a 30 block patch where sand can be generated we’ll give this one slightly bigger scale so remember the way this works that bigger the scale the smaller the sample size that we’ll end Up with so this should mean that we have bigger lumps of dirt and smaller lumps of sand and we’re gonna give the threshold 0.6 and this one we this one we are gonna give an offset word just to make sure it’s completely different to the dirt we’ll call it 500 again it’s Not really important so now if we go into our get voxel and we want to apply this so the way we’re gonna go about this is we’re going to instead of automatic n stay the same so if we hit these we’re gonna return that value because we know we’re not doing anything Else with them these were going to change and we’re going to have a voxel value equals not an instead of returning straight away we’re just going to set the voxel value to that except for this one if it’s in the air we’re still just returning zero And then this one voxel on volume equals two and the reason we’re doing this is because we don’t want to return the value straight away cuz if it is one of these values we might still want to do something with it as it turns out the Way we’re gonna do at the minute it’s only gonna be if it is two that we’re going to do anything with it but that can change so we’re gonna move on to our second path and this is where we add a bit more detail to it so the first thing We want to do is we want to check if voxel value is equal to two then we’re gonna do our stuff if it’s not we’re just gonna for now we’re just gonna return box or value for the time being we’re only going to be messing around if It is stoned if it’s the grass or the dirt layer we’re gonna leave it alone again this is all gonna be entirely up to you how you want to generate your world I’m just trying to show you enough information for you to figure out how to Do that so then we’re gonna loop through each of our loads oh yeah sorry this Vox value is a bite to an int and then so for each one of our loads we’re going to do a check if y pause is greater than a load dot min Height and y part pi pause is less than load dot oxide so if it’s within that range between the min height and the max height then we do another check if noise dot get 3d pass in our position we don’t need to do set a new one now we can just Pass in the position wholesale load dirt noise offset load dot scale load load dot threshold if that’s true return don’t know sorry foxhole value equals load dot block ID so what that should do is give it a error well we’re not returning that path all right yes all right this doesn’t Need to be an else because we’re returning we’re returning fossil value regardless so that didn’t mean to be an else so now if we run it we should get a little bit more detail there we go obviously it’s it’s not exactly it’s not exactly stunning right now but you get The idea so you can mess around with these values mess around with the the ranges and the limitations wherever and change the block ID and you could be generating loads or you could change it to instead of giving a block ID you could just give you the air block and Create caves so we’ve got all the groundwork for some pretty basic terrain generation there is one thing I want you to just quickly look at if we just drove this over here I believe there’s a bit of a problem with with the camera well not the camera the basically we’re Using unlit textures and it’s not as obvious as it was now but if you see these little lines there between the where the seams are on the mesh basically it’s a bit more obvious down here basically that’s a bit of a bug if we go into project settings go into Quality and one second I’ll do this one it’s not running and if we turn off what was it now a nice Copic only anisotropic sorry disable that and disable anti-aliasing that should fix that weird little problem it’s something to do with using I think it’s just a bulk to be Honest but now that it’s off we should have more seamless yeah we’re not getting those weird lines anymore and the world’s disappear in there because I’m going off the edge of the world if I increase the world size a bit I don’t want increase it to because Again it’s gonna bog the system down if I increase it well we’ve still got view I’ll keep the view distance small because this is very unoptimized so this will slow down very quickly but if I increase the world size while keeping the view distance small you should be Able to see the world generation in action a little bit better so I’ll just go up here now this is what I mean by being very on optimized obviously when you’re playing the game you don’t want it to be having this massive luck spike every time you generate a new chunk I’m Going to partially address that I don’t want to get too deep into it because then you start to get into things like threading and if you’re in at things like threading you can’t get in beyond the scope of my tutorials right once you’re getting into things like Threading you kind of want to be watching somebody who’s a bit more advanced than I am like I want to be watching tutorials about threading not teaching you guys I’ll do it but I’m gonna do some things that are gonna make this a bit more performant a bit a bit Less laggy on the system but that is pretty much it I think hopefully it wasn’t quite as painful as the last video a bit shorter a bit less coughing and spluttering and we’ve got something that looks a lot more like Minecraft at the end of it in the next video we’re Gonna had a basic character controller so we can start walking around our very basic and bland and boring world but for now that’s everything again if you like the video please feel free to like and subscribe cuz that’s what youtubers are supposed to say we’ll see you next time by Video Information
This video, titled ‘Make Minecraft in Unity 3D Tutorial – 05 – Basic Terrain’, was uploaded by b3agz on 2019-03-09 23:21:28. It has garnered 44312 views and 1302 likes. The duration of the video is 00:49:19 or 2959 seconds.
JOIN THE DISCORD SERVER!
———————————————————————————–
In this episode we generate some basic terrain, including laying the groundwork for ore placement and caves.
Credit to Carlpilot for the 3D Perlin Noise code snippet. Link to that can be found here;
https://www.youtube.com/watch?v=Aga0TBJkchM
And link to the assets files for this episode can be found here;
https://github.com/b3agz/Code-A-Game-Like-Minecraft-In-Unity/tree/master/05-basic-terrain/Assets
SOCIAL STUFF!
Website: http://b3agz.com Twitter: http://twitter.com/b3agz Instagram: http://instragram.com/b3agz
———————————————————————————–
SUPPORT THE CHANNEL
The easiest way to support the channel is by liking, subscribing, and sharing. But if you want to go that little bit further, sign up for my Patreon at; https://www.patreon.com/b3agz