Coding C# vs Gdscript in Godot 4 ~ Example Differences, Advantages & Disadvantages

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hello everybody Chris here and in this video I wanted to go over some of the differences between trying to code game in C for Gau uh versus GD script with an emphasis of talking about C so we talk a bit about taking a concept that you would write in GD script and moving it over to C so first I want to point out though if you're going to do anything with C in gido you have to be using the mono versions of gido which will include C support so let's take a look at this abstract player class written in GD script so there idea here is that you might want to have multiple implementations of what a player would actually do and you would have this player class as your base class and you can extend from that by maybe having like a ranger player a fighter player or whatever and they have different implementations of all of these different methods now you'll see that when we do GD script if you declare a function you have to give it something so you could write push error not implemented which is kind of what I've been doing lately just to note that this this is supposed to be a abstract quote unquote class so we haven't actually written the implementation of the function so if we call win without actually writing the final win function on the class that inherits from player then it's going to give us the push error message so in a sense what you'd be doing here is overwriting the win function in your child class by writing the same function name and then giving it a different version of what the wi function actually does which would just replace this entirely now uh you can see that you can also write a function and you can just have it say pass but if you call a function that depends on a player class and so it tries to run lose function and it passes here then it's just going to do nothing and it won't give you any indication that uh basically nothing happened and it just skipped over this function uh so that's why I would write something like push error right you also notice here that if you give a return type to your functions in GD script uh that you do have to return something for that value so that could either be um the actual value or you can get away with null and a lot of cases if it's an object uh but you do have to return something so you have to have some basic implementation even if it's meant to be an abstract class it's not really an abstract class because you're not writing abstract functions with no implementation you have to have some code here so because this is technically a node script I could put it on the guy right here I can click on it you can see I have the export variable for the stats resource here um so technically has some of the functionality that I would want in the final script but it's not going to work until I extend from this class so I'm going to create a new GD script here and I'll just call it something like uh wizardcore player. GD okay so this Wizard player is going to extend from player and I might want to give it a class name so Wizard player so in C every time you declare an object it's always going to have have a class so when we create this class I can technically just drag Wizard player onto guy okay and I click here and you'll see that it still has the fields from the player class so it inherits everything from player so here you can see one of the places where with GD script you'd have a bit of a lack of clarity so uh unless you know that uh the player class is meant to have its functions overwritten you wouldn't really know about that so if you call wizard player. when it's going to be using the player win the player lose because we haven't overwritten these functions in the child class so we can Implement them now in Wizard player if we just copy and paste them in over here and then we just give it a different output so for instance when can just be returned true and lose can be returned false so we never lose and we always win and then down here get points maybe we need a points field so I'll do at export for points and this would be an integer we'll just default that to start at zero so now I want the uh return points to be just return points down here and so on and so forth so we can click up here and we'll see that we have that new export variable so over in C there's a concept called interfaces where uh when you haven't actually declared the implementation for uh how winning should work or losing should work for any type of player uh so we don't know how this is actually going to work with an interface we're just basically declaring what anything that implements I player should be able to do there's also actual abstract classes inside of C so here's basically the function declarations but we have no idea about the implementation so in C if we want to create the actual player then we'll create a new class that um implements I player interface and you'll notice that for C I'm actually um using visual studio code over here so with C you really can't edit it in the gdau editor and gdau 4 as far as I know still uh you can't really debug it in uh external IDE like Visual Studio code um however there is the debugger inside of GD script but if I had the option of choosing I'd rather debug inside of Visual Studio code uh so you can still debug C code using visual studio code that's one advantage I would say uh so let's create a new C class for the actual player so I'm going to right click on my C scripting folder and I'm going to create a new script so we'll change language to C and uh for the naming of your scripts uh what I've noticed is that it's actually really important that you use Pascal case for your class I call it player and if it was like Wizard player it would be Wizard player and the first letter of wizard and player Capital so that's your Pascal case but if we were doing Gau script uh the standard convention is more like wizardcore player. GD so the reason you need to make it Pascal case like wizard player. CS is that when we go ahead and we create our classes that in C when you are creating your classes and the naming of your classes is going to be the same it's going to be Pascal case so Wizard player um needs to match the file name if you want things like export variables to actually show up in the inspector so if I made Wizard player snake case over here uh the variables wouldn't pop up over here like you would expect so that's important so we have our Wizard player class which is of type node but we're also going to have it implement the I player interface so when we put this in in Visual Studio code you'll see that it will tell us about all the functions we haven't actually implemented and what's nice here is that we can just do a control period Implement interface and now we have all of these functions that we were supposed to write and they just pop up here so that we can uh write them for our player character so I consider that fairly cool so we still have a popup up here to get that last uh function so we want I player. validate setup so I'll Implement that explicitly okay and then we have the functions we need to implement so in C obviously you have exceptions so you don't really need to do something like a print to console that you have a error okay so pretty easily we know which functions we've got to write and we got their stub code automatically put in there you also notice for C that we can have a uh Base Class and we can have an interface or multiple interfaces at the same time so both of these will work as types so if I wanted to use the Wizard player for something I could use its interface I player um as a qualifying type or it could use the gdau node as a type as well so for instance in that function down here is allied with I player Target player the target player we don't know actually which type of player it is so we are riding the Wizard player now uh but it might be a different type of player it might be a fighter player and all we need to know about I player is that it's going to have these functions implemented at some point when you have the uh final class written out in sight of Wizard player fighter player so let's say for instance in GD script we had a array of nodes and we wanted to get some piece of data off of each of those nodes so we could say something like uh far nodes here and that's going to be an array of node type so basically on each element in here anything in there should be a node and we can execute any node based functions on it okay so for get points let's count the number of nodes that have some arbitrary value so I'll say count valid and we'll say equals nodes. filter so this allows us to run a callable uh function against this list of nodes uh so that could mean you already have a function written and you put it in here to filter out the list and uh for the ones that return true it'll keep that node into the list and the ones that are false it would remove it or we can write it inline so inside of here uh let's write a inline function so I'll say function and the parameter will be node of type node so declaring that just allows us to easily see uh what the node can do okay semicolon and then we write our function code so we'll say and we want a Boolean here to filter the list so we'll say return node do let's say process mode is equal to or is not is not equal to process mode disabled so if I expand it all like that it can look a little bit like that um so I don't think that actually has to all be on the same line I think something more like that for clarity uh makes it a little bit easier to read but I you can write at function you declared outside or you can just write a small one inside of here so this supposedly would just basically count all the nodes that don't have their process mode and disabled so process mode would be this property right over here so I just wanted to show an example of how you could do something like that filtering an array based on some arbitrary little code and then you get a new array of what you need oh and since I filed the array I think I would also want to get the size on the results so filter is going to return an array and then we can get the size of that array so chaining a function there we filter it then we get the size that's our valid count and we can declare here the actual type here if we want and as well so in GD script your variables can be typed or untyped so if we go over to visual studio code for Wizard player and just do something similar all let's take a look at how that would be different so first off the VAR nodes here let's just say that this is a private variable in GD script you would say underscore nodes indicating that this is meant to only be used privately inside the class so I update the name sound there and it'll work fine so if I referen this class from another class I'd still actually be able to access underscore nodes variable you just supposed to kind of know that you're not supposed to mess around with the private variables because they're private for a reason however in C the accessibility of a property or field is going to be declared and enforced so if I want a private property it would look more like this private uh array and we can type the array Noe note that when you're specifying the type of an array you would use the less than greater than symbols to wrap the class type and typing so this is typing the array but you can see in GD script you would put the uh square brackets so basically the same idea here so in cop we would declare using the public protected or private keyword the accessibility of every Field property or function so here I if I want to make a private property I would say private and then the array type would be array node and because it's a property I want to have the first letter be capitals uh you'll notice that also applies to function names a lot more stuff is going to be using this Pascal case inside of C uh you can see that I underscored the validate setup to uh basically give a indication that this is private but that just seems to be a naming convention that gdau c uses as well but there's no technical need to have the underscore since all the functions and methods are going to have their accessibility keyword in front of it anyway okay so we have the array note up here at the top since it's a property I want to have a getter and a Setter so I can just use the default ones like that and if we go over here we'll see that uh the non-generic type array cannot be used with type arguments well uh that's because we have to use the gdau uh collections namespace so if I do a control period here and using gdau collections then that's going to get rid of that error message so we actually are uh pulling the definition for this type of array from gdau collection so different namespaces might have different uh definitions for what a class type is so that's something you'd kind of have to watch out for a little bit while doing C uh Gau script doesn't have name spaces it only has class names by having different Nam spaces you might have uh two or three different objects that are technically called array but if you hover over it you can see that that array definition is coming from kdo collections instead of just kdo and those two namespaces might have a different version of array so you kind of have to be a little careful about that it's not really a big deal though so now that this array property is private we would not be able to use the getter or Setter from outside of this Wizard player class from any other C script and c will actually enforce that as opposed to gdos script where uh it's just kind of implied and you have to make sure that your code respects it because you won't just get an error message that says oh you've been blocked from accessing it so one of the other things regarding that that I do like about uh C is that you can actually make the property public over here and then you can say that only the setter function is private so you have a private set and a git which doesn't have its accessibility declared which means it's going to use this one over here which means that getting the values of this array property are public but setting them are actually private so doing that in GD script isn't really a thing uh we could say that we have this array of nodes right and we can still make a getter function so we could say get and this will just return nodes so this technically even if you have the underscore here this is still quote unquote public it can still be used from anywhere and we could do something like uh set value and if you want to prevent other scripts from setting the value here you could do something like uh when they call the setter function you just push a error which would say cannot be set by Setter function and so you can like have a warning that way and so the setter gets called and you don't actually set the uh nodes to the value which would just be a default Setter so if you just skip over that then technically nodes won't be set and you'll just get an error message so you can block people that way but that doesn't stop you from being able to just go into the set of function and call it anyway so that's definitely something there so I mentioned a little bit ago that uh in GD script you can use filter and give it a function in order to basically take a array of nodes and make a smaller aray based on some criteria of returning the Boolean for each one getting a true or false so in C you can do something really simpler using what's called link and uh I'll just show a really basic example of it real quick so so if I wanted to count let's say the number of nodes in the A and actually I mean for this to be called nodes a is a stupid name there so let's do basically the same thing I did here for get points uh with get points in C so we have our array of notes Here which actually want to be called nodes not array that makes a lot more sense now and let's uh for get points okay so I'm going to return noes so capital on the first letter we're talking about the property so this is going to called the getter on the property which should return a array of node from the backing field so we're returning nodes and I want to use Link in order to filter it so I would probably go ahead and use where here which is uh one option of Link which is pretty much like filter on the GD script array but I want to point out that for collections in C you have a lot of options for link um many I actually don't know myself but you can see you have a lot of options here for um taking collections merging them together filtering them or selecting items from them and it's just a really handy way of manipulating things like AAS so we want to do basically the GD script filter so I'm going to do where and so let's put in our little link uh function with a Lambda so I'm going to do X where X is the item that's going into here I could actually make that a little bit more clear something like node so we're grabbing a node and then we're going to put that into the function so what do we want to do with each of these nodes where we want to figure out where something is true so what are we checking to see if it's true to filter the array we're doing node. process mode note that accessing the uh properties and the functions everything is passcal case not uh snake case so process mode and we're going to check that that is equal uh or sorry not equal to disabled so any of the other process modes like inherit possible when paused always are valid but not this um disabled one so this gives us our filtered array so what do I want to do with that I want to count it to get a integer so I will just do do count so I would just do a uh do count here and that is a function so we need the parenthesis and a semicolon at the end so in one line basically uh we filter the nodes based on the nodes that don't have the process mode disabled and then we count them and return that as our points value okay so pretty handy there's different ways of doing basically the same thing um just the syntax is a little bit different but as long as you kind of get the concept it uh works out more or less the same you just kind of have to convert it in your mind depending on what language you're working so I kind of glossed over the concept of a abstract class in C we have a interface here which which allows us to uh tell us what we need to Define so let's create an abstract class so I'll just create a new file for C and I'll just call this a power node. CS okay I'm going to kind of copy this into the script here so inside of here we want to put abstract after public before partial and we are going to be um inheriting from node as the base class so let's see using gell okay and then we have our class implementation so when we have an abstract class that means that we don't expect that every piece of this class is actually implemented in uh this code that we're about to write down here and actually I want to rename this to match my script name so class power node okay um so obviously a base node is not abstract because you can use that in gdo but this class which Builds on top of it makes it abstract so we're going to have um some random stuff so inside of here we'll have a protected string and I will call this power and this will be defaulting to my power as the string so this field is not abstract so not everything inside of an abstract class has to be abstract and not implemented so down here I'll say something like uh public string which is the return type and we'll say double power and we no parameters so just declare that right there now I normally you have to declare a body which is the implementation of the function but in C you can do public abstract string double power and now we don't have to actually say what this does until we create our node that inherits it so on Wizard player I'm now going to change this node type to power node so it's a implementing I player but it's also a power node and we get this error up here does not Implement member uh Power node. power so let's do a control period and implement the ab class so now we have this function we have to actually Implement now uh in power node we add the protected string power so there is no such thing as protected in GD script that I I'm aware of so basically this means that any class that inherits from this class can access it but classes that do not inherit from Power node outside classes cannot access this string so it's private to classes that don't inherit from Power node but uh in Wizard player because that is a power node I can do reurn on Power and maybe I do power plus power and that's how I double my power so basically with C if you declare some stuff in one class like a abstract function or an interface that the final class should have and that final class actually inherits or implements those abstract classes or interfaces then as long as the code compiles you're guaranteed that those functions are actually going to exist inside of uh the final class now that doesn't mean they're going to work but it means they're going to exist at least so do you like that aspect where because things are being enforced you're not just going to forget that there was supposed to be a function there it's going to tell you with the list of problems everything that you actually need to do in order for things to compile okay so speaking of compiling if you want to run GD script all you need to do is basically say save the script and hit run with C code as soon as you put C code into your project you have to build your project every time it's going to run and uh whenever you make a change to your C code so for instance let me throw Wizard player CS onto this guy I'll just drop that in there okay so we can see uh for Wizard player CS that there's no properties up here I haven't actually exported any properties yet so uh let's show how to do that actually now so when you have a field or property and you want it to show up in the inspector uh just like with GD script 4 you need to export it so in C you do square brackets and you type in export you hit contrl s you go back out and you'll notice that it doesn't show up here because uh you have to build the project whenever you make an update if you want these uh exported fields to show up um that also means basically every time your your project runs it needs to rebuild all scripts which can be a little bit of a pain it means that it's going to take a little extra time whenever you need to test some changes but you can see um just like GD script you can uh get those GD script you can still get that gdau functionality using tags like these and um now we have the array of nodes so I could assign these so in the inspector here uh we can still assign it even though the setter is private but if we tried to access this list of nodes and set it from another script during gameplay that's not going to fly because this private is going to block that so we can assign our nodes so however we want to do it we could even duplicate each node a few times if we want and that's all well and good so more or less exporting works the same now I want to show one of the Annoying Parts about C in gdo at the moment so when you declare class name in GD script and you go to add a child node it's going to show up automatically so you can see wizard ear we got a wizard player. GTE and all you need to do inside of Wizard player at the top is declare a class name and it will be picked up that also applies to resources however in uh C if you want your classes to be registered like that there's a plugin out there for right now gdo mono custom resource registry from at links so you can see that it is possible to register custom types from C and I'm not sure when this would be but uh you can see up here at the top that there was a request to add Global class support for C in gadeau um but right now it's a little annoying so where that can be even more annoying is when you're dealing with resources and let me show you what I mean so here I have a stats resource in GD script right so it extends resource it has the class name stats if I want to create a stats resource I just click on GD script create new resource and let's look for stats so news or test stats I'll just call it test stats. T So if I double click on this file this is a stats resource it's got all the stats in here all the export variables and you know you can use the signal and whatnot so it's easy to create and easy to reference so I think in player script I have an export for a stats resource so let's put player GD on the guy and now you can see see that we need a stats resource to assign so I can quick load the test stats or I can click here and I can create a new stats so the typing for these resources works and it's going to reflect that in the context menu so I can load that in there and then I can edit my sets and I won't be able to accidentally assign something that's not stats here which is handy so of course you can have typed resources inside of C but in the same way that uh you can't have your classes pop up here in create new node it's also not going to show up when you're creating resources or you want to reference a specific resource type that is from C in this context menu for um stats so let's create a stats C I'll just create a new script here and this is going to inherit from resources and it's going to be stats. CS so let's create that I'll double click into here and let's just give it one export so export here and then we're going to have let's say public uh integer and we'll say health and that's going to be equal to 100 so now let's go back out and we want to create a resource with that right so let's let's build the project to make sure that it would show up but if we um now create this in the root of our project create new resource we'll see that stats GD is a type we can create but stats. CS does not pop up here so if you want to assign the stats script to the resource you have to create a base resource like this and we'll say stats uh CS test. TRS and the root save okay so we have this resource we give it the script so we'll take stats and drop this in here and then we have our stats resource um so you can see how that's a little bit more annoying not having it pop up there in the menu automatically if you're willing to download and use the plug-in then obviously that will uh help fix that but but out of the box a little bit more of a paint and now if we want to use this stats type so if we go back in here even though this has a clear class name stats um let's go into Wizard player and let's uh give it that stats resource so export and then we're going to have public stats so the uh specific designated stats resource not just a normal resource and this would be stat stats uh get uh let's just say private set why not and let's save that so for the guy I'm going to take wizard player. CS I'll drop that in there you see that we still have to compile so let's compile it so that it will show up here and now this stats resource if we click here it's not going to know about those uh C typings so even though we declared a class name which of course you have to do all the time in C uh we don't have the menu being filtered here which means that there's it's just way too many types to uh create four and this uh stat sound here is actually GD script stats so the only way we can assign it out of the box that I know of is we have to basically drag and drop or you can click here and go all the way to the bottom and quick load but then this also gives you any resource you can see even scripts show up here because scripts are actually a resource in uh kadoo so we take um stat CS test and drop that in there and we can click here and we have the fields here and uh technically everything works fine it's just a little harder to uh kind of lock down exactly the right types for the right objects and having that verification to know that you're just not assigning a random resource and assigning the right one there so definitely keep that in mind if you're going to use C for gdau okay so if you've been using gdau you probably know about signals so signals are kind of like events for gdau so when something happens you can emit a signal as you can see in the setter function when the HP changed I admit the HP changed signals and any uh other class that um connects or subscribes to this HP changed signal SL event uh is going to receive the data which is the new value float so signals are great and we can also use them in C uh so if we go to stats. CS let's create a signal up here at the top so um signals still basically work the same but uh writing them is a little different so we'd write signal up here to de player uh that we are creating a signal um and we're going to do that out of a public delegate forid and we want the name of our signal so let's just say health changed and then you have to say event handler and then at the end you write the parameters of the event so let's do uh integer um new health oh sorry because that's a field it's should be camel case so new health and and semicolon at the end so what is going to do is it's going to create a health changed event uh with this uh parameters that it's expecting and then you can subscribe to the health changed signal basically like you would in GD script so uh let's see we have the Wizard player which has stats so since we have the stats resource accessible here um let's override so public override the underscore ready function so on ready we want to connect to that uh signal inside of there so we're going to do stats dot so you can see the signal here or basically an event is what you would generally call them in C so we have stats Health changed and we want to plus equals uh the function that we want to call when health is changed from within this class so let's create a private function that can respond to that so it'll do a private um for voore on health change and so we get the uh parameters so the parameters have to be the same and C as what you would expect from Health changed you can't just randomly drop the parameters so have a float and that's going to be new health and then we Implement uh whatever we want in the function so let's take this name here and put that there okay and uh we have a issue here no overload matches the delegate okay so let me go ahead and check that delegate void Health changed event handler new health ah okay it's because the typing has to be the same so inide of where's the player we got to make sure that the float is actually an so now this method that responds to the health being changed we could do something like print out to the console so just like in GD script you can um still use GD script printing so we can do GD which is the global gido object which gives us access to things like print or print error or let's see push error push warning which is probably what you want to do so that these uh messages pop up in the gdau debugger so you could do like push warning push error which doesn't really make sense here so we'll just do uh print okay so let's actually show that this uh signal Works um by telling the stats to emit the health changed event or signal so let's create another node real quick so in uh C I'm going to create a new script and I'll say stats Health changed eitter so inside of the C folder I'm just going to create a new script here and I'll just call this something like health manager which inherits from node so let's put that somewhere in our game let's open up the world and I'll add a child node so let's see uh node and then let's add in our guy scene so so of course I I can make that editable and you can see uh all the nodes inside of there so we have the Wizard player Cs and this node script I want to make that a health manager so I'm going to attach the health manager script and let's go ahead and edit that health manager script so the health manager script is going to have a public stats stats get set or maybe get private set actually so just a reference to the resource file and then let's do public override underscore ready and uh you'll notice that these functions that we're overriding like ready or you can also do public override uh let's see like enter tree exit tree or underscore physics process or process those are the same node functions that you would see in GD script so uh basically you're still working with good it's just a different language but accessing the same uh built-in GD fun functionality okay so on ready we want to emit the uh stats event or stats signal so let's do stats Dot and let's say emit signal so we need to uh give it the name of the signal so the signal name was Health changed and we could give it a value here so I mean you could do it like this but that doesn't really make that much sense it makes a lot more sense if um the signal emission actually comes out of the class here so first off let's make this uh field private and then over in health manager if we do something like stats. Health you'll see that it doesn't even show up here you can't mess with the health field now because it's private so back in here we'll make this a uh underscore a private field the underscore just to indicate that it's private but this is what actually matters here the private and uh because we have the private field if we want to set the health we now need a property so I'll do a public uh in health so we're going to need a getter function so we can return the underscore health and that's easy enough but uh we may also want a Setter function so our Setter we can say health equals the new value so we don't need to put in the parameter uh value is just implied here and then when the health changes we can just uh emit the signal so emit signal Health changed and the new value will beore health so now if we want the signal to get emitted we just need to change the stats value so we can do that in the health manager and we'll say stats. health equals 50 okay so on ready the stat is going to get set and then over in stats this signal is going to be emitted from the setter function of the health and that's going to mean that the Wizard player is uh going to respond to that with the on health changed private function which should spit the new health out to the console okay so let's build the project and actually test that so uh we'll select the current one as the main scene you can see always has to build the project and we get the project going a debugger errors object reference not set to an object oh of course of course because we have to actually assign the resource on health manager so okay there you see once again a little Annoying to assign resources but we can just drag the resource if we know what it is and here uh compile and run so when we've done theing you can still it still actually doesn't uh show the message here okay so the reason actually that um we're not getting a message here is uh because when we call this on the ready function that we haven't waited for everything else to be ready in the scene like the Wizard player so the Wizard player hasn't actually connected yet that's just something you need to be careful about in general that's not specifically C so if you wanted to get around that then on let's see the health manager so what we actually want to do here is uh defer the setting of The health value until all the other nodes have run there on ready so that the Wizard player is going to be connected so we'll do stats. set deferred and then we give it the property name which is health and then the value 50 okay that should give it time for The Wizard player to catch up with it's on ready let's run it and see if that works okay so we run okay and then we have the value sped out to the console um so that's just a little gotcha if you ever try to uh emit a signal from a ready function you want to make sure everything else is ready first so uh you can see that signals work basically the same way as uh they would in GD script as well it's just that the syntax is a little bit different a lot more curly braces but really from what I've seen basically anything you can do in C you can also do in GD script GD script doesn't enforce everything like private functions and variables or your class name has to match the file name um as in the case of all these CS files so it's much more like python as a language C is statically typed you have to compile C every time you uh make a change and you run it so the code executes but hopefully I could give at least a rough overview of some of the differences in actually using C Ino and what that would look like compared to GD script so from here I probably recommend checking out uh libraries so for instance uh when it comes to gdau since GD script is obviously what it was built and if you go into the asset Library there there's going to be a lot more GD script based plugins that you can use now obviously there are uh also plugins that have been mirrored to C and some that are C in general so one I've been kind of playing around with is uh Paradise motion so if we look at Paradise we can see all of banana holograma um scripts here there's C and there's the gdau script version so in some cases you'd be fine going either way and one of the cool things about gdau and I didn't really covered in this video but you can um cross script between the languages so a c script can grab properties and Fields from a GD script so if you have an exported field um that's in GD script maybe it has something like a health value and you have a c script your C script can actually grab that value so they're not incompatible with each other now and I think that uses a lot of strings for accessing the properties cross language which isn't the nicest but uh it it can work so a project can definitely have GD script and C script combined into one so you can play around with both uh see what you like best I do think the lack of automatic class name registration for resources and uh node types is pretty annoying right now but I'll definitely be keeping an eye on C in the months and year to come and see if it kind of catches up for everything uh with GD scripts so if you made it to the end thanks for watching this video I hope I gave you guys some idea of the differences between C and GD script and how they would actually apply inside of your game project so I've been Chris and I will see you guys in my future video content
Info
Channel: Chris' Tutorials
Views: 4,073
Rating: undefined out of 5
Keywords: game development, game engine, indie game development, godot 4, godot 4.2, c# godot, C# godot 4, C# godot signals, signals gdscript, signals C#, c# godot 4 signals, gdscript vs C#, gdscript vs c# for godot, godot 4.2 dev 5, coding godot, should I use, godot c# tutorial, godot tutorial, godot c# vscode, godot game engine, godot engine, game dev, godot tutorials, godot game, indie game, c# tutorial, godot game development, chris tutorials, godot 4.2 tutorial, 2024
Id: r0xAAntDV_s
Channel Id: undefined
Length: 41min 18sec (2478 seconds)
Published: Wed Nov 15 2023
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.