You hello and welcome to another episode of how to code a game like Minecraft in unity in this one we’re going to be tackling trees before we get into it though there’s just a couple of things we need to have a look at the first of which is since the last video I’ve Upgraded unity and if we have a look in console there you can see there’s a whole load of errors for some reason there these errors are to do with text match Pro which I’m not sure why that’s causing problems with this particular project soon as this project didn’t have Text mesh in stalled but if you do happen to upgrade your unity and come across this same problem the way I’ve dealt with it for now soon as we’re not using text much Pro is to go up to window or package manager and get rid of It and as you can see all those errors are gone I’m not I’ve not bothered to look into exactly why it takes much Pro is causing problems cause like I said we’re not using it if we’re gonna use it I would obviously try and figure out why The next thing we need to look at is I’ll just quickly run the project now this probably won’t work now because it’s not 100% consistent but you may have noticed if you’ve been playing around with it there every now and again you get some kind of weird index mesh Error oh yes it’s not gonna do it now but what was happening trial not time to just replicate it I really would rather show you the error before fixing it there we go right so this error down here failed setting triangles so Mendez’s so my dishes are out of bounds That error is because when we created our just will just go into chunk here when we created our transparent triangles array to hold on to the details for the separate meshes that were going to be transparent I never actually put a reference to it in here So when we’re clearing all our mesh data we’re not clearing this the transparent triangles mesh so to fix that in this is out of range we’re just gonna in here transparent triangles dot clear and that will fix that problem so now that we’ve dealt with those we can get On with the actual tutorial one thing we are going to do because we have to add another block I don’t want to just keep changing that’s the icons block sorry I didn’t want to just keep changing this to shuffle blocks around so I’ve gone ahead And made a 256 by 256 version of the out list it will obviously be available in the download to go with this but basically this is the size of the regular minecraft or at least the original I think minecraft texture pack so the main difference about this is Obviously these 16 blocks across and 16 blocks down so we are going to have to modify our script to accommodate that and the reason I’m did somebody did ask about this in the comments so this will help them hopefully so if we’re going to voxel data texture out the sizing blocks We just want to change that to 16 and then obviously we want to actually set our materials to it so our materials were blocks we were up there and we find block atlas and then what was in transparent blocks obviously we want to have the same texture otherwise that Will cause all kinds of problems and obviously when I brought the texture in I set it to clamp find no compression and Max is 2 5 6 and alpha is transparent so with that in mind we are ready to go let’s go into our scripts folder I’m gonna open up our foxhole no We’re gonna open up our biome atributes file and we’re gonna add a few more values in here so if we just will create a little header just to separate these values out and imaginatively we’re gonna call it trees and then we want two values for now we’ll go a bit at a time I’m gonna call it trees own scale and shree zone threshold so make a bit more sense in a minute just because I’ve been playing with these values when I was getting ready for the tutorial I’m gonna give them some defaults so that I don’t forget what they are so save that and Then we want to open up our world script and our wills group we’re gonna go down to our get voxel if you remember this is the heart of the world generation algorithm this is where all the magic happens and we’re gonna add another pass so remember we’ve got our first pass Which is just the basic terrain pass and then we’ve got our second pass which is what in this case adds AHS we haven’t got any ours yet but I think it’s just adding a lot of dirt at the minute so we’re gonna go down here we’re gonna Create a another pass we’re just gonna call this one free pass and then in our tree pass just gonna first off say if Y pause is equal to terrain height we don’t want trees below the ground and we don’t want them floating above the ground so we’re only interested in this Particular position if it is at terrain height and then within that terrain I would say if noise get to deeper limb and then we’ll pass in our current position and then we want this if you remember the offset is entirely up to all that you want to do is make sure there it’s Always the same so if you change the offset hard-code it or make it something that can’t be changed by the player because if that value gets changed mid game or anything like that it will cause problems with the world generation as you move through the world as long as it Stays the same like you can change it from game to game but as long as it stays the same once the game is running it’s not a problem but if you change it mid game it can cause problems so I’m just gonna leave it as 0 but like I say If you if you want to give it a slightly different value you can it’s just where it samples the pearl in noise from and then we want to pass in our biome dot Tree zone scale and then so we’re saying if the value we get out of that and Remember that value is going to be normalized it’s going to be 0 to 1 so if it is greater than and then we’re gonna pass in a threshold value so if it is greater than that threshold we will set our voxel value to new 8 no 1 peseta to 1 which is bedrock as far as I remember what this is doing now is this is essentially establishing a placement area so a forest basically so if we press play now you can see we’ve got patches of bedrock I’ll just come out of 2d here and we’ll go to an overhead view There we go so you can see we’ve got these patches of bedrock like I say mess around with these values all you want I’m just going with some values that look good enough for my liking for this tutorial I’m only one I only want to show you how to do it I don’t Necessarily want to go through in great detail how to create a good-looking forest this is just how to get you on the path so these patches of bedrock they’re representing where the forests will be so now within that we need actual trees so the trees are only gonna be placed where those Bedrock patches obviously we’re not going to leave bedrock patches there this is that was just visualizing so you could see what was going on so if we go back into our biomaterials file we’re gonna add another couple of values and these threshold value and there is gonna be another threshold value they’re Always going to be zero to one so we can make that a range value just you know so it never like it doesn’t want to be zero and also because there are point one to one is it never wants to be more than one it’s never going to return more than One so there’s no point in having it more than one and it’s never gonna be lower than 0 but 0 is no use to us zero would be entirely there be no patches of bedrock and one would be all bedrock so these we will call tree placement scale And these are gonna work in exactly the same way and again I’ve got some default values in mind so I will use those if I could remember they were 15 and then they once again you know just copy this placement threshold and this one we want To be a 0.8 and then we’re not gonna need to get for a little bit yet but we’ll also set a tree size in 12 we’ll go with right once again all these values entirely up to you mess around with them to your house content these are just the Ones that I landed on so if we go back to our world get box or class and we’re gonna edit these to incorporate these value no sorry edit these to incorporate these values we’re already saying that if we are within a tree placement zone we’re just going to turn the ground at that Position to bedrock just to show us where it is and then also once we’re in that zone we’re going to do a second sample I’m gonna say if noise don’t get too deep Earl in and just copy all of this and again this is a position this Is a situation where you might want to mess around with the offset just to get a different value and you can you could put another offset value in here so that you could change it easily again the important thing is that he doesn’t get changed during the game so if it’s Greater than that threshold at that position then we’re going to set it to 8 which I think if I remember correctly is bricks now if we run our code again now you can see we’ve got little patches of brick in amongst our bedrock patches so like I say play with these values get Multiplied every want I’m just gonna get you started on how to put them there in the first place so what we could do here is we could tell the code to pass out a value there is one block higher than this and set it to a wood block which would be fine Except the tree is not just a one column of wood basically it’s you know it’s gonna go open so far in all one column which will be fine but then the trees are gonna spread around the leaves are gonna spread around sorry and the problem with the leaf spreading around Is that the leaves are probably gonna at some point on guaranteed to cross over into another chunk which is what makes things quite complicated so let’s get started on or put this class in here no written here so we need a new class that’s inside that class this is how we’re gonna Handle it and I’m sure these are the ways of doing it this is just the way that I’ve managed to source out and we’re gonna call this voxel mod it will keep a vector3 or just call position and a bite I’m gonna do constructor for it So that will be public box or not it takes in a vector3 but you’re just going to call underscore position and about makes we’re gonna call on the Scot ID and just in and just in case never is necessary we’re just going to create an empty constructor as well and that will Just set position to just a new vector3 and bite to zero I don’t think we need a not bite sorry don’t think we need a I don’t think we have a use case for this in what we’re gonna do today but just in Case so then if we go to the top of our world function we’re gonna create a list for this you know actually we’re not going to create a list we’re gonna create a queue because I’m in part the point of this tutorial is to help people Who aren’t experts so I am trying to use different functions and features and stuff to at least well regardless of whether it’s the best way to do it like it introduces you to your concept so we’re gonna use a cue which if you are not familiar with it’s Very similar to a list in the way you set it up so you type Q and then in the brackets we’re gonna put our data type which is the type that we’ve just created and we’re gonna call this modifications and the reason we’re calling modifications is because these Are modifications to the basic structure of a chunk so we have our terrain and our blocks and everything like that that’s the basic structure these are on top of that well that’s basically what tree is it’s a modification to the chunk and if you had a village hot something Like that Canyon or a cave not necessarily a cave cave could consider we considered the basic structure but basically anything that can’t be covered by a single block is a modification and one mean by single block is if you sample the gate voxel algorithm any point in the world it can give you Either terrain a type of terrain or an air block or whatever it can give you a tree leaf because we don’t know where those tree leaves are going to be until we generate a tree so you like I say you initialize it the same way you do a list Equals new Q box or not what Q does is you can’t access a queue like you can access at least you can’t say I want to look at item number 23 of a queue what you can do is you can add items to the queue and remove items from the queue And it’s a first-in first-out scenario so basically whatever the first item is in the queue that will be the next one that gets removed so we’ll get to actually adding and removing stuff from it shortly you know actually lists let’s just just so you can see it in action if we go Down to get box or whatever is here right we’ll leave our bricks and bedrock blocks in place for now so if we type modifications dot1q and what this does is it adds an item to the list and the item that we’re going to add is a new box on mod positive x Positive y plus 1 because we want it to be on top of the terrain we don’t want it to be in the terrain paws dot Zed and then the ID I think would is 6 sorry there we go so that’s just gonna add that to that particular queue and the Next thing we want to do is go into chunk and we’re gonna have to create a method for dealing with these modifications first off we’re going to need a public queue much like the one we just scooped identical to the one we just created in world Vox all mod I’m Not gonna call it modifications just like we did before and it’s imperative that this is public because this is going to be added to directly from the world script and then if we go down to update chunk in here we’re gonna put while modifications dot count is greater Than zero so this loop will continue until there are no more modifications left that creates a new Mocksville vaad which will just call v4 doesn’t really need to have a semantic name for what we’re doing and it’s going to equal modification dot DQ and what that does Is it takes the first item in the list so whatever is the of the list currently it sets our Vauxhall mod to that and then it removes it from the list so the item is no longer in the list once this line of code is run so vector3 pause is going to Equal V dot position minus equal position and all we do is set box all map set our box on map based on that position to the ID that’s in that and then like I say remember when we call this it removes that from the list so It’s then it’s going to go back round to the top and go again and it will get the next item that was in the list which is now top of the list set it to that remove it and keep looping until there’s none of that left we also need to make This public because we’re going to be calling this function from the world class as well and then if we go back into our world scripts we need to create a new list in here which we’re going to call list this is a is going to be of Type chunks chunks array and this is going to be chunks to update this V equals a new list and if we go down to our generate world script we need to make use of all this so we’re gonna do similar to what we did in the chunk script while modifications Dot count is greater than zero so once again it’s gonna carry on looping until we’ve got no more modifications left so the first thing we’re gonna do in this loop to ensure that we do reach a point where there’s no modifications left because obviously we don’t want to get Stuck in an endless while loop it’s worth noting that we are placing this loop in a point in the code where nothing else is going on at the same time that involves this modifications thing modifications queue it would be good practice to ensure that nothing else can be done with this modifications Queue while we are messing with it because if we’re saying modifications queue loop through until modifications queue is zero and then somewhere else in the code in the game stuff is been adding to that list this could in theory go on forever so it it would be good Practice to like lock it but we’re just gonna leave it for now because the reason we know there’s nothing this isn’t that big a script yet this game isn’t really that large of a project so we know nothing is going on at the same time this is the main loop the world Loop and we’re in the start function essentially generate world is called from start so all this is happening before we ever get to anything else going on Foxhall mod V again is gonna equal modifications dot DQ and if you remember this is a different list to the One in our chunk this is the global list as opposed to the specific chunk list and then we’re gonna just to make things a little bit easier we’re gonna get a chunk card which will be V gets chunk card from vector three and we’re going To pass in vedas ition so we get the chunk that is associated the chunk that this fox will mod will apply to before we do anything with it we want to make sure we actually have that chunk so the reason we’re doing this in this part here is because we’re only generating The chunks that were within the view distance to start with but if there is a tree on the board of that view distance that crosses over into the next one we need to add that data anyway as well because the tree algorithm only works from where the tree Starts like the the trunk on the Lund on the on the terrain so even if the chunk isn’t generated if the chunks on the border of the generated land we need to be able to up this data to it because this data isn’t going to get added through the voxel algorithm because it’s Only adding the one voxel the start position of the tree on the ground essentially is like you think of it as a sapling in Minecraft it’s only I didn’t that one position we need to make sure that the information for the rest of the tree gets given to the chunk so we need To check to make sure we’re not looking at a chunk that is outside of the generated world and if it is outside we need to add it so we’ll just do a quick check if chunks C dot X C dot Z is equal to null that means that it is not Generated then we want to first off see that X C dot Z first off we want to generate it so put new chunk passing this chunk card this is the world reference and then we’re gonna say true we wanted to generate straightaway and then we will add it to the active chunks List so that it gets added or removed as necessary once the game starts running anything any chunks that that we add to the game need to be in the active chunks list because otherwise they won’t get removed when we move out of distant out of view distance of them so once we’ve Done that whether the chunk was already there and generated or not we have now got a chunk so using that chunk we’re going to uncute Vauxhall mod so now we’re putting this into putting this Vauxhall not here into the modifications queue for that specific chunk and then We’re just going to check if chunks to update that does not already contain I’m just gonna copy this because I can’t miss typing it if it does not already contain this value then add this value and then once we’ve done that the last thing we’re going to do is go through That Trump’s to update list I’m going to do it this way I equals 0 I is less than chunks to update dot count I plus plus now we’re gonna say chunks to updates no actually just zero every time because we’re going to remove it from the list Once we’ve done it so this is kinda like work this is very much working like the queue but the reason we’re not using the queue is cuz we need to be able to check whether something is already in it and we can’t do that with a queue so this Needs to be a list so that we can use the contains function here so that’s why we’re not just using the queue to do because then we could do what we’re about to do now in two lines with a queue we will be doing one line So forego over to our game and hit play I can see we’ve got some tree stumps we do have a few that aren’t generating on time but we’ll be able to deal with that if we there has done the data side of it if I place a chunk now and fast this Chunk to update you’ll probably see that the this stumps will reappear yeah what’s happening is is it’s getting skipped over in the actual update loop but the the data is getting added to it it’s just some reason it’s not updating it in the start oh by the way just I Don’t think I pointed this out the reason that we’re doing this this here is because if we don’t it will update it will it will add the trunk to the chunks to update list every single time there is a voxel modification everything one trees probably got about 50 voxels so That will be 50 updates per chunk per tree per chunk so this is to ensure that we’re only updating the chunk once for every regardless of how many voxels there are in that chunk so now that we have a functional tree generation system we’re going to make the actual tree Itself a bit more tree like so we’re gonna create a new class which we’re gonna call structure and the original cornish structure is because we’re gonna think of the tree as a structure this class will handle anything else that you could consider a structure so that could Be a village hut or attracting where else there is in Minecraft that mine anything like that anything that’s not part of the basic terrain generation that can’t just be generated on the fly that you need to add like that you can think of as a prefab really and it’s gonna be static I’m gonna call it a make tree and it’s going to take in a vector3 position I’m just gonna take in a cue and that’s it that’s all it takes it don’t need telling what the key was called it doesn’t it take something in sorry it Needs to take in an int min trunk height and then in max trunk right so the first thing we want to do is get the height now we can’t just use a random I mean we could just use random value but the problem with the random value is we’ve We’ve initialized the random state machine in this code that was I think we did it here yep so we’ve initiated the random state machine we’re always gonna get the same sequence of random numbers so in theory if we said give me a random number between 4 and 7 it’s always gonna Give us the same random number at the same point but we can’t guarantee that that points always gonna be the same so if we generate a chunk and while we’re waiting for that chunk to generate we go off and do something else and then come back to this one say one machine is Faster at generating chunks for whatever reason that machine might get back to this quicker than the other machine and they’re gonna come up with two different random numbers so one way we can get around this problem is we’re gonna first off we’re gonna call this height and What we’re gonna do is we’re gonna use pearly noise again so max shrunk height because if you remember Perlin noise gives us a value between 0 and 1 so if we times our much trunk height by that value we’re gonna get a value between 0 and the max trunk height because for Example if the match junk his twelve and we times it by 0.5 we’re gonna get six that’s how we’re gonna do it and no remember the name of your own functions noise don’t get to the pearl in the and obviously we need to always give it the same values relative to like If we give it to different positions like if we if we just pick two random numbers then we’re gonna have the same problem all over again so base we need to give it the actual position of the tree because then it’s always gonna be the right value for this tree the offset Again it doesn’t really matter as long as it’s always the same let’s just give it to 50 for this one and the scale I think I just put 3 last time it seemed to work out fine again it doesn’t really matter but I think the higher the scale The more variation you should get but then also we want to do a check because we don’t want any zero length trees so we’ll just do if height is less than Minh Truong kite then high its equals Minh Truong kite and now that we have that we’ll do a quick little for loop For int I equals we’re gonna start from 1 because we’re gonna be passing in the terrain value like the the get voxel command the get box or algorithm is gonna be working at the exact vauxhall or it’s looking out and the voxel it’s looking at is gonna be the one below Where we want the tree to be so we’re gonna start off with one rather than zero I wants to be less than height obviously we’re only incrementing one at a time and then all we’re gonna do is Q dot on Q new voxel mod new vector3 position directs position Dot y+ i position dot said and this wants to be six no seven no six yes six six would yeah six I know I’m talking about and then we go back to our world bloody blah get back get Vauxhall sorry if I sound a lot with it so I I’m a Little tired and then instead of this we’re just going to call structures make do don’t up make that public public static void I did structure not structures sorry make tree we want to give it the position which is just position the cue we’re going to pass in The modifications cue so it’s going to be altering that cue and then for our minimum maximum height we can get that from our biome because we added that value earlier on so if you run the code now we should find we’ve got a bit more lookup as you Can see we’ve now got some tree trunks and we still have certain places where it’s not being generated we’ll deal with that and then if we go to our world thing we can add ourselves a leaves block so on 12 the leaf texture is the last one so that’s going to be 16 It is solid it is also transparent I’m going icon free just yet but it’s not really important for this and then if we go back to our structure I’ll just copy this I want to set plus height and the is 11 yeah 11 there we go we have our Leaf blocks now we we need to actually make them into a tree like structure so I’m not going to go into making the trees so a random shape at the minute for now we’re just going to just make a square true a square leaf structure on Top so the easiest way to do that is for int x equals now these values again you can mess with all you want I’m just literally placing a cube of leaves on top of the tree trunk so you can add some randomness to it if you want I Don’t want to get too bogged down in specific little details like that cuz I feel like from everything I’ve shown you should be a figure that power or this X is less than 4 so we’re going from minus 3 to 3 X plus plus then we’ll just copy that I really want To change these to y and z and y instead of going from minus three wants to go from naught to seven and then if we copy this again we’re going to be put in position x plus x position dot y plus y and position sorry position dot y plus height plus y And then position those ad plus Zed and that should be all of that there we go right so our next problem in addition to not 100% generating everything I’m not dating everything straightaway we also if I just zoom out here and I run off in Which way to all be facing this this way yep if I run off in this direction you’ll see that we’re also not generating trees on new chunks that have been generated as well as the few that have been missed so this is where it starts to get a little bit tricky If he did not really seem tricky before so if we go to will go here it seems like the best place to put it we’re gonna create a couple of new functions the first one we’re gonna call create create chunk not create chunks you’ll notice we’ve already got to create Chunks function down here somewhere we’re going to be getting rid of that but for now let’s just create this chunk card C equals chunks to create 0 again it’s getting the top item in the list and then we want to remove that item so that we don’t do it again we’re gonna Add this chunk to the active chunks list and then we want to initialize it that’s all we need to do in that function and then we’re gonna do a function for updating chunks now this one’s a little bit more involved so we’re gonna set off a bull to start with updated equals False and then we want an index and then we’re gonna do a while loop and this while loop is gonna keep going until updated is no longer true it is no longer false and the reason we’re doing this check is because it is entirely possible that we’re going to hit a chunk At the top of this list that is not ready to be updated so the first thing we do is check chunks to update index dot is pops all not populated because if the voxel map is not populated then the chunk is not ready to go so we need to Leave it for now if it is not populated I’m sorry if it is populated then we’re going to update it and then we’re gonna remove it from the list and then we’re gonna set up dated to true so that we exit out of this while loop however if It’s not ready to go we’re gonna increment index and then loop around again and the reason we do that is because we could just tell it to only just you know just have this if statement alone and then it wouldn’t do it if the chunk wasn’t ready to go and Then it just exit but that means that would be sending a call to this function and not doing anything so we increment the index and then we go around again and we check the next item on the list and for that reason we also need to make Sure that we’re not checking an item greater than all this so also if index is less than chunks to update dot count minus one so now if we go down here we’re going to delete this we don’t need this anymore and if we go up here we Also don’t need this however we do need a new bull which we’re going to call applying modifications so we’ll go obviously we’ll need to we’re gonna change this in a second so we’ll go back down to where we added these and we’re gonna create a new one Final co-routine places the one we just delete it I guess apply modifications and in here first off apply applying modifications they’re going to be set to true so that we know that we are currently running this in much the same way we use that bull I Would just delete it and we need a count and you’ll see the the purpose of this count shortly so once again we’re gonna do a while loop while modifications don’t count is greater than not so keep looping as long as we have something to loop through voxel node V equals Modifications DQ basically you know it’s just copy of the first part of it is it was very very similar to what we did here however where it differs is that we are going to be breaking out of this every so often because otherwise this would really cause the game to hang up so We’re going to increment count here and then if count is greater than and I’m gonna put 200 this value is entirely down to you this is kind of a temporary measure we’re gonna be doing further optimizations and stuff to make things run quicker probably in the next Minecraft that result maybe but for now this is just basically it limits it to running 200 voxel modifications per frame so you can make this number smaller and it would take less time per frame but get less done or you can make it higher and it’ll get more done but it Would take longer so it’s just finding a right balance I found that 200 seems to be a decent amount on my computer maybe on a slow computer you’d be happier to have it like the machine out not like the machine out but have trees so gradually popping into existence so in Here we want to put if count is greater than 200 reset count and yield return null and then when we eventually get to the end of our while loop we run support applying modifications equals false now if we go up to our updates and get rid Of this and we’re going to replace it with a couple of function a couple of calls so the first one is if modifications dot count is greater than not and we’re not applying modifications already then want to start the Co routine so we’re only starting it if 1 we have Some modifications to loop through and 2 we’re not already looping through them and then if jumps to create dot count is greater than not create you and if chunks to update dot count is greater than not update chunks so because this function because these functions that we Create here only do they’re not loops they only do one thing at a time that means that this is essentially just gonna loop through chunks there he needs to create or update do one and then let the frame carry out let the game progress to the next frame so it’s Kara Works it just breaks things up a little bit so that we’re not creating ten chunks all at once and freezing the game up while we wait we go have a look now now you could see the trees popping into existence I think you could see them Anyway if I if I run off in in a direction you can see the trees don’t instantly appear with the chunks that’s just the nature of the way they’re created like I say that value the the 200 value you could set that value lower and then it would the chunks would Appear quicker but the trees would be slower or you could set it higher and the trees would appear more in like if the value if there was no value if we just didn’t yield that what that loop at all then the trees would appear when the chunks appeared but the chunks would be A lot slower because they would have to wait for the trees so that’s the way that value works I hope that makes sense and like I say you could add some randomization to these trees to make the make the leaves look a little less square essentially all of this is fairly Basic stuff it’s the complicated part is getting the trees in the world in the first place so that’s gonna be it for this tutorial I think and mentioned in the next tutorial we’re going to actually you know what we’ll do just before we call it a day if we go back Into our world get voxel or is it there is going to our tree Pass we’re just going to remove this and remove this and then we’ll play again there now we don’t have the bedrock and everything everywhere so yeah that’s it the next Minecraft video I’m not sure if it’s I Don’t think it’s gonna be next week but the next minecraft video I’m pretty sure we’re just gonna try and do some optimization make everything load a bit quicker I wanted to avoid threading but we might have to do it I’m speaking to a few people on comments I think the the Lag of generating chunks is a problem for some people and it’s only gonna get worse as we add more things like trees so that’s probably gonna be what the next video is about the other next minecraft video sorry I’ve got something else planned for next week but that’s it For now and thanks for watching I’ll see you next time bye bye you Video Information
This video, titled ‘Make Minecraft in Unity 3D Tutorial – 11 – Trees!’, was uploaded by b3agz on 2019-05-14 07:34:29. It has garnered 16676 views and 407 likes. The duration of the video is 00:48:52 or 2932 seconds.
JOIN THE DISCORD SERVER!
———————————————————————————–
ABOUT THE VIDEO
In this video we’re going to tackle the surprisingly complicated process of adding trees to our Minecraftian world. Settle in, this is one of the longer ones…
Thanks for watching!
———————————————————————————–
Get the scripts/files for this tutorial here;
https://github.com/b3agz/Code-A-Game-Like-Minecraft-In-Unity/tree/master/11-trees/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