USE Gameplay Tags

  Рет қаралды 32,812

The Game Dev Cave

The Game Dev Cave

4 ай бұрын

We've all created long lists of bools on our characters to keep track of a bunch of info, but you don't actually need to do that and as a matter of fact, you probably shouldn't! Gameplay tags are a built in system in Unreal engine that allow you do do all that, with much more functionality!
Join the discord for any help you need! : / discord
Join this channel to get access to perks:
/ @thegamedevcave
support the channel and development over on patreon : / thegamingcaves

Пікірлер: 250
@MercGT63s
@MercGT63s 4 ай бұрын
Never used tags before and i started using UE a year ago and you just changed that. Thank You!!!
@thegamedevcave
@thegamedevcave 4 ай бұрын
Happy to help!
@Penthast
@Penthast 4 ай бұрын
I was getting started learning how to use gameplay tags, your video really helped. Nice job
@thegamedevcave
@thegamedevcave 4 ай бұрын
Glad it helped!
@blackshinobi956
@blackshinobi956 3 ай бұрын
Thanks for explaining this! I've always been curious about tags, but haven't had a reason to use them yet. Also, thank you for responding to your comments. Every single question I had was asked by someone else and answered already. Great job!
@thegamedevcave
@thegamedevcave 3 ай бұрын
Glad it was helpful! Always happy to help out but I apricate you looking through the comments first to avoid double questions! XD btw i recognized your profile pic, I've seen some of your videos pop up on my feed before! :)
@fabulamcafee
@fabulamcafee 3 ай бұрын
i recognize your name
@minilabyrinth
@minilabyrinth 3 ай бұрын
I don't have a ton of bools on my character blueprint, so they work well for me. I love how I can directly see the names and know what they do instantly, and can right click and find references to easily see where they're being used, no extra steps or anything needed. I can see though your system would be great for a heavier game project
@thegamedevcave
@thegamedevcave 3 ай бұрын
yeah, you shouldn't use tags as a replacement for every bool. but if there are bools that can make use of the parent/child structure tags have, or bools that are present on multiple different classes, it's worth doing. With tags you can read and write them to actors without needing to cast, unlike a bool too which is a huge upside. All heavily depends on context which option is the best to implement though
@veiledmelancholia
@veiledmelancholia 16 күн бұрын
@@thegamedevcave There is also a cool decorator in the behavior tree called "Gameplay Tag Condition" which will make a task run depending on whether the target actor has a specific gameplay tag on it or no
@pimeine
@pimeine 3 ай бұрын
This is amazing! I will start to use them now 👀
@BaseRealityVR
@BaseRealityVR 8 күн бұрын
Easily one of the best vids I have seen as to why to use this system
@thecanticleofcrom4787
@thecanticleofcrom4787 4 ай бұрын
Phew! So glad I found your channel. Great explanation, thank you!
@thegamedevcave
@thegamedevcave 4 ай бұрын
Glad it was helpful!
@DonData.
@DonData. 3 күн бұрын
Jesus this is amazing - time to rebuild my whole character, genuine thanks! 😀
@UnrealProfessor
@UnrealProfessor 4 ай бұрын
Nice, I was using a map variable string/bool and string/other to store basically everything. Nice trick, I would have to invest more time with the new unreal tag system. Thanks for share the knowledge
@thegamedevcave
@thegamedevcave 4 ай бұрын
that's what I did before figuring this out too. still has it's uses of course but tags are wonderful in most cases!
@KaitheArtGuy
@KaitheArtGuy 4 ай бұрын
Very clear explanation, thank you!
@thegamedevcave
@thegamedevcave 4 ай бұрын
Glad it was helpful!
@PirateDion
@PirateDion 3 ай бұрын
Works more or less like I thought gameplay tags would work. My eventual box characters running about in their box world fighting box enemies will be thankful for this video.... eventually. Still working out how to get a randomized layout of buildings for NPC built cities, so tags on the back burner for now. Good video none the less though adding it to my Unreal playlist. Future me will thank you.
@diliupg
@diliupg 3 ай бұрын
don't let yourself get boxed in.. or out....😜
@PirateDion
@PirateDion 3 ай бұрын
I've upgraded to having boxes with specific unit sizes to help with determining scale of my eventual non box entities in their otherwise boxy world currently. Small steps. Which coincidently I did use this video for as those scaled up boxes have the gameplay tag "building" to them :P. @@diliupg
@F4Phantom5657
@F4Phantom5657 4 ай бұрын
Thank you. 👍 I love finding solutions, even better when they are built in.
@thegamedevcave
@thegamedevcave 4 ай бұрын
You bet!
@kirillkokorev817
@kirillkokorev817 2 ай бұрын
Thank you very much, man. Invaluable upgrade!
@thegamedevcave
@thegamedevcave 2 ай бұрын
Glad you like it!
@JeyLosGamer
@JeyLosGamer 3 ай бұрын
Nice explanation, now I now how they can be used. I like to use enums better because of the switch or select functions, so I don’t have to make a lot of if statements/branches
@thegamedevcave
@thegamedevcave 3 ай бұрын
enums have their upsides, doing a switch statement for an enum is much nicer than a bunch of if statements for sure but the downside is that an enum is a simple variable and as such can only have 1 value at a time :)
@dorondavid4698
@dorondavid4698 3 ай бұрын
What Unreal Engine should do to improve this is to make every actor have access to the gameplay tags WITHOUT needing to create an explicit variable everywhere.
@thegamedevcave
@thegamedevcave 3 ай бұрын
every actor i believe already has a gameplay tag container setup by default that you can access through an interface so you can apply and remove tags without needing to cat and such
@dorondavid4698
@dorondavid4698 3 ай бұрын
@@thegamedevcave oh yeah? You should have included that in the vid! (unless it's there, as I didn't watch it all the way through yet)
@thegamedevcave
@thegamedevcave 3 ай бұрын
@@dorondavid4698 yeah i shouldve mentioned it, kinda figured that would be obvious but a few people have asked about that so apparently not XD
@dorondavid4698
@dorondavid4698 3 ай бұрын
@@thegamedevcave ha yeah, it's hard to know what to mention when making a video
@tomimartikainen6689
@tomimartikainen6689 4 ай бұрын
thank you for this, this was very helpful
@thegamedevcave
@thegamedevcave 4 ай бұрын
My pleasure :D !
@50shadesofskittles9
@50shadesofskittles9 3 ай бұрын
I'm a fan of using a data table and structure for storage of gameplay tags
@rikou9080
@rikou9080 4 ай бұрын
Very useful thing to know ! Thx you.
@thegamedevcave
@thegamedevcave 4 ай бұрын
Glad i could help!
@distinctivepixels
@distinctivepixels 3 ай бұрын
This channel is pure gold
@thegamedevcave
@thegamedevcave 3 ай бұрын
Thanks!
@johnrex7108
@johnrex7108 Ай бұрын
Terrific tutorial. Again, learned lot from these.
@thegamedevcave
@thegamedevcave Ай бұрын
Thanks! I'm glad it helped you out!
@frostlyspark5842
@frostlyspark5842 15 күн бұрын
I feel so called out in the first minute of the video lmfao
@thegamedevcave
@thegamedevcave 15 күн бұрын
we've all been there XD
@vmukeshkumar5566
@vmukeshkumar5566 4 ай бұрын
Thanks for the video, gameplay tags are pretty usefull, one doubt isnt gameplay tags unoptimized , like checks are comparing strings ig like in low level, but enums are int checks, also it doesnt have index like enum just asking, even i have used tons of gameplay tags in my game, just wanted to know if its correct way(i have around 100 of tags) also all my code are in c++, used native gameplay tags
@thegamedevcave
@thegamedevcave 4 ай бұрын
on a low level it preforms the same as using Name variables, so more expensive than a bool check. But not to a degree where you're likely to notice any performance different at all unless you're doing a WHOLE lot of tag checks on the tick event on actors that you have 100s or 1000s of instances of. If your code is neatly done you'll usually only have to querry your tags once, and then go on to do something with them , like enable a damage timer, and then turn it off again after X time. On a very low level technical look bools are cheaper, but bothersome to work with on scale. (which isn't to say that you should always use a tag instead of a bool, something like a value on a door "canOpen" should 100% be a bool for instance, but things that apply to multiple different objects in your project, or things that you want to be able to check in a hierarchy, that's where tags are useful)
@patriklind545
@patriklind545 4 ай бұрын
Brilliant, thanks.
@eh6027
@eh6027 4 ай бұрын
Wonderful just wonderful!
@TC9
@TC9 3 ай бұрын
1:17, don’t mind me, just leaving a checkpoint!
@pamparam3495
@pamparam3495 3 ай бұрын
Great guide!
@thegamedevcave
@thegamedevcave 3 ай бұрын
Glad you think so!
@jbtnproductions7245
@jbtnproductions7245 8 күн бұрын
great function, I confess that I didn't know that, but we must agree that good practices and a clean and organized code ends up being better than this functionality, as sometimes we need certain properties that only by creating a variable will we have access to, such as depriving a variable, But I must also agree that in certain cases this knowledge will make a difference, but in my view I will continue to value good practices and clean code, sometimes shortening solutions can double their size
@thegamedevcave
@thegamedevcave 8 күн бұрын
of course this is not a replacement for booleans, but where it makes sense you probably should try using gameplay tags, it's not exactly going against any best practices or bad for performance in any way.
@projectgg6730
@projectgg6730 2 ай бұрын
Omg I wish I knew about these forever ago
@Owl_UA_Unreal
@Owl_UA_Unreal 3 ай бұрын
Classic, good solution from Gameplay ability system
@thegamedevcave
@thegamedevcave 3 ай бұрын
learning GAS is what finally forced me to start using them and now I want to invent a time machine to go back and slap my pre-GAS self in the face for not learning about them sooner XD
@thelawgameplaywithcommenta2654
@thelawgameplaywithcommenta2654 3 ай бұрын
Guess you would have a generic enemy actor and apply the interface and gameplay tag container on that one. Duplicate if you need to have separate Parent Actor.
@thegamedevcave
@thegamedevcave 3 ай бұрын
Its always a good idea to try and have a good inheretance for your classes but the point of if you use an interface is that you can use it instead of normal function overrides, and with it youre no longer limited to only children of a certain class :) so you could put that interface on anything, not just children of the generic enemy class
@thelawgameplaywithcommenta2654
@thelawgameplaywithcommenta2654 3 ай бұрын
@@thegamedevcave Yeah, but imagine doing that for 40 different classes. If we are going to do that anyway, might as well add it into a base class to get it automatically.
@thegamedevcave
@thegamedevcave 3 ай бұрын
@@thelawgameplaywithcommenta2654 true, saves you some headache! just wanted to point that interfaces are meant to be like override functions without being limited to parent/child classes :)
@PatrickTheDM
@PatrickTheDM 3 ай бұрын
Excellent tutorial.
@thegamedevcave
@thegamedevcave 3 ай бұрын
Thank you! Cheers!
@PalThingb
@PalThingb Ай бұрын
One option to using an interface is to put the Gameplay Tag Container on an actor component instead. Then you still avoid hard references, and you can more easily select for instance "All actors with game tags".
@thegamedevcave
@thegamedevcave Ай бұрын
all actors have a gameplay tag container by default and an interface for them I believe so you dont need to set that up yourself, you can apply gameplay tags directly to actors that way instead of copying the method in this video with a separate container variable (although, still could be useful to have multiple tag containers in some cases) :)
@PalThingb
@PalThingb Ай бұрын
Ah ok, that's awesome. I see there are some node types like "Matching all tags" to do logic with multiple containers. You can even create them on the fly in blueprints. @@thegamedevcave
@PalThingb
@PalThingb Ай бұрын
Actually, I can't see that all actors have a gameplay tag in the editor. @@thegamedevcave
@thegamedevcave
@thegamedevcave Ай бұрын
if you have an actor variable, you can get a few interface messege functions which should work I believe (although you may have to implement the interface for them on the classes you're using them for, i can't 100% remember if the actor class itself implements them in any way). these are the names of those functions: Get owned gameplay tags has all matching gameplay tags has any matching gameplay tags has matching gameplay tag it'd make msot sense that you do have to implement the "gameplay tag asset interface" in the classes that use it and provide it with the prober container there.
@WeirdGoat
@WeirdGoat 4 ай бұрын
What a coincidence! I'm changing all my status enums to Gameplay Tags now!
@thegamedevcave
@thegamedevcave 4 ай бұрын
Probably a lot more flexible to work with, that said... if you only ever want 1 status effect at a time to be in effect, having it as an enum can be nice because that can only ever be set to 1 value, instead of bools or gameplay tags which have to be turned on and off individually. Of course, that's also the reason I personally prefer gameplay tags, because it doesn't limit you in that way :)
@WeirdGoat
@WeirdGoat 4 ай бұрын
@@thegamedevcave Yeah! No more .h file every where, whenever or wherever you need them, they are right there for you! Cheers!
@natecoet3291
@natecoet3291 4 ай бұрын
I concur I use mostly enums, I used to use gameplaytags in the past and they are very functional and make for clean code. But require to be enabled and disabled every time which for me was annoying, but I work mostly in C++. I did find using gameplaytags in Anim BP to be also useful for different state transitions. I think Gameplay tags are really at their best with gameplay ability, personal opinion though. very instructive video.
@knightdivisiongames
@knightdivisiongames 4 ай бұрын
Since it is stored as an ini file by default, does that means it also saves immediately when changed? For example, if I wanted to use this for level or weapon/equipment unlocks would that be possible or are these only appropriate for temporary changes such as status effects like you listed?
@thegamedevcave
@thegamedevcave 4 ай бұрын
No, the types of tags are stored in a .ini file, but those tag containers are just structs like any other variable that youll have to store and save like you would any other data. What youre asking about sounds more like data assets :)
@omgwat
@omgwat 4 ай бұрын
It does not save immediately when changed. You have to restart your engine as it's an engine level construct that only loads when the engine is initialized. GameplayTags can absolutely be used for what you're describing. GameplayTags can be assigned to GameplayTag containers. The most common GameplayTag container is the AbilitySystemComponent, but you can create your own. I can imagine an UUnlockedAbilities actor component that has a gameplay tag container, and then you add and remove tags to that container as necessary. Saving this would be as easy as saving the actor component's state into an FArchive and serializing and deserializing it as necessary. Make sure to do it a background thread so that you don't block the main gameplay loop.
@dylanc.1712
@dylanc.1712 3 ай бұрын
Great video ! I just struggle to understand the last part when it comes to interface. Does it setup one and only single "variable" accessible from every blueprint where the interface is implemented ?
@thegamedevcave
@thegamedevcave 3 ай бұрын
sort of, it's a function that every class that implements it can put it's own code in so they all just give their tag container as a return value. you can check out my video on interfaces here where i use it to set up a basic interaction system : kzbin.info/www/bejne/aqSve4Klp7p8btk
@dylanc.1712
@dylanc.1712 3 ай бұрын
@@thegamedevcave I did at the end of this video and if I know how to use basic interface, I still don't understand how to use gameplay tag container with interface, without casting from one blueprint to another. Anyway, I'll figure out. Keep on the good work :)
@thegamedevcave
@thegamedevcave 3 ай бұрын
@@dylanc.1712 you make an interface with a function that returns a tag container, then on every blueprint that implements that interface you create the definition for that function to simply return it's tag container. you can call interface functions without casting and if the object you're calling it on has the interface, it'll run that objects definition of the function, in this case, giving you it's tag container without having to cast.
@misfire8771
@misfire8771 3 ай бұрын
Great video as always really helpful, I've tried using tags, but i ran into a bit of issue, how do you delete a tag if you're no longer using it, every time i try i get this error that its still in use and its absolutely not, it brings up this new window that ive never seen (im still very new to UE5) and i dont seem to be able to edit anything there either D: edit : i deleted all the GE_effects it claimed to be referencing and the error went away, a bit annoying but an easy fix, leaving this here incase anyone else runs into the same problem
@thegamedevcave
@thegamedevcave 3 ай бұрын
probably easier to close the engine, find the .ini file that stores the tags and remove it there, only if you're SURE nothing is using it anymore. Also can be good to generally make sure all the classes referencing the tag are saved and compiled and restarting the engine before you try to remove it.
@marco638.52
@marco638.52 4 ай бұрын
I have a question. Is this possibile to use on multiplayer? Is the Tags Source personal to each blueprint, so that each character has his own status?
@thegamedevcave
@thegamedevcave 4 ай бұрын
yeah the tag container is like any other variable and each instance has it's own set of values for it. as long as you replicate it like any other variable it should work for multiplayer/networking.
@Stk
@Stk 3 ай бұрын
Hey, I'm wondering what would be the design pattern to adapt booleans which are OnRep variable in multiplayer ? I feel like it doesn't make sense in that case
@thegamedevcave
@thegamedevcave 3 ай бұрын
Gameplay tags will replicate just as well and I believe (you will have to double check) if you apply tags directly to the actor instead of a container variable like this is may replicate them automatically as it is
@newtonbrown6694
@newtonbrown6694 3 ай бұрын
Dude not only am I your fan for life now, but you've actually gotten me super pissed at a few buddies that have been in the game a bit longer than me. I'm been curious about trying the GP tags instead of the crappy digital post it's they can't seem to decide are actual tags or names for other things or even sometimes just a pretty color, but only when you have absolutely zero use for them. When you need to use the functionality I feel like rainman is teaching me to count cards. my asshole friends i'll be rolling up to the bar in the old folks home with in 30 years said the other gameplay tags are even worse and i was better off not getting to play with the puppy before having to put it down so I sort of forgot about them. they work freaking perfectly don't they??? Jeez always go with your gut i guess, even experts don't know squat sometimes. Keep up the phenomenal and too the point videos dude. We are loving it this side of the pond!
@thegamedevcave
@thegamedevcave 3 ай бұрын
seems like you've had a pretty rough time with it XD really sucks about your friends steering you away from gameplay tags for no good reason :( hopefully you can use them going forward!
@newtonbrown6694
@newtonbrown6694 3 ай бұрын
hahaha thanks man nah they rock sorry if i sounded like i trauma dumping haha. Yes I totally ditched the solution i was failing at before to keep track of multiple npc's and their status in a sort of game of old school 'tag' and sure enough i'm asking myself why anyone would stick with the pinky tags or infinite bools thanks again and keep up the rocking tuts brother! @@thegamedevcave
@garyh100
@garyh100 4 ай бұрын
Thanks for the video, I didn't know about these! Some of my "bool swamp" values are accessed on event tick. Any ideas of the performance of reading a tag from a Gamplay Tag Container versus a simple bool property?
@thegamedevcave
@thegamedevcave 4 ай бұрын
i'm sure it's somewhat more expensive but not to a degree where it's worth bothering about honestly. I'd be more inclined to refactor the code to prevent checking things in tick if possible to improve performance. (of course, sometimes you simply do have to check every frame on something, but very often even tick ends up being a shortcut that's rather expensive)
@garyh100
@garyh100 4 ай бұрын
​I think I have tried to keep the logic in the player character event ticks to a minimum (even when a lot of KZbin guides seem to add more and more!). The other place is the "Update Animation" event where bools are checked for the purposes of the animation state engine. Perhaps the tag system would only become an issue if you grew the game tag container "array" to a very large size...?
@thegamedevcave
@thegamedevcave 4 ай бұрын
@@garyh100 in all Likelyhood you shouldn't need to look at your tags for animation related things. Unless you have (as an example) a specific animation that plays when your character is burnt that loops for at long as they keep the burnt status (like a panicked, waving their arms around "I'm burning to death" kind of animation), something like that you should be able to check for tags for if you need. All together, the difference between checking a bool and a tag by itself shouldn't make any notable impact really though
@Rekettyelovag
@Rekettyelovag 2 ай бұрын
U can use inheritance for your bool problem well. I suppose it would be faster than using tags. I used tags for different purposes in UE4, it was very slow.
@thegamedevcave
@thegamedevcave 2 ай бұрын
that still limits you to only child classes. you could just make a child of character and make everything in your game a child of that. that fixes a lot of issues but then also potentially heavily limits you if for any reason you need a normal actor or a pawn. and if you make your class with all the bools on it a child of Actor, now you're losing out on all the build in functionary of the Pawn and Character class, meaning a huge portion of the engine is suddenly worthless. If you can get away with it, doing what you suggest certainly works (although you're still missing out on being able to check for parent tags like Status.X for ANY status instead of a specific one, doing that with bools get really clunky really fast)
@Rekettyelovag
@Rekettyelovag 2 ай бұрын
@@thegamedevcaveMaybe you are right, I don't know, I haven't tried out the new engine yet. I just recalled the OOP principles, and it makes sense when separation of concerns is in mind.
@moleex5759
@moleex5759 2 ай бұрын
assuming these can be saved and loaded, it looks like a good way of unlocking levels. I've got multiple boolean arrays in a game for level unlocking. With this I could have named them and grouped them between different modes much easier. maybe in the sequel
@thegamedevcave
@thegamedevcave 2 ай бұрын
i'm not sure abuot saving them, that may be possible, if so this works fine for that. Usually though tags are used more for things that different actors need to keep track of, either on themselves or eachother. But hey, of course we can use it in whatever way we come up with!
@ResonanceRebirth
@ResonanceRebirth 4 ай бұрын
Good job, but tags are not accessible from Get Class Defaults, which means all of this stuff is "cool" but basically useless, as a lot of Unreal Engine features. Apparently this works ONLY for instantiated Actors, which totally kill their potential. LIke if you want to have a clothing system and use tags for special booleans like "is fullbody", we'll still have to stick to booleans.
@thegamedevcave
@thegamedevcave 4 ай бұрын
wasn't aware that this wouldn't work with class defaults. that's a bit strange. But I also don't really think that using class defaults is a very common thing to do, and for what thee gameplay tags are useful for especially. As i show in the video, it is most useful for keeping track of state changes, not as a blanket replacement for all bools, and those have no relevance in class defaults anyway
@VampiricBard
@VampiricBard 3 ай бұрын
Gameplay Tags are accessible from Get Class Defaults. I tested it just now to double check.
@thegamedevcave
@thegamedevcave 3 ай бұрын
@@VampiricBard good to know, i planned to double check but entirely forgot about this, thanks that you took the time to correct this!
@skal3802
@skal3802 4 ай бұрын
Great thing. Now i will go research how to make it in C++
@thegamedevcave
@thegamedevcave 4 ай бұрын
personally haven't looked into c++ use for them, I assume it's pretty straight forward though. I mostly use tags for the Gameplay Ability system at the moment and in Behavior trees.
@Utopia2023Game2
@Utopia2023Game2 2 ай бұрын
yea Thank u
@aakburns
@aakburns 2 ай бұрын
Enumeration lists and Blueprint interfaces is the way.
@thegamedevcave
@thegamedevcave 2 ай бұрын
enum list kind of works too, depending on the situation but it's rather clunky compared to gameplay tags. But if you have something to "tag" or keep track off that is very specific to a certain type of actor , doing it with enums or a method like it probably does make more sense than gameplay tags. For values that are relevant to a lot of different classes though, gameplay tags are a lot nicer to work with
@aakburns
@aakburns 2 ай бұрын
@@thegamedevcave I watched the video a second time. You’re right.
@atakanosgames
@atakanosgames 3 ай бұрын
That's cool. I create enum lists for character and AI status. This is pretty good either. But I saved your method. I ll need that later ^^
@thegamedevcave
@thegamedevcave 3 ай бұрын
Enums work pretty well for keeping track of states, since it can only hold 1 value at a time , for status' this works better, adding a new entry to a list of enum's can be haard to follow if you ever need to debug. but in the end, if it works, it works :)
@atakanosgames
@atakanosgames 3 ай бұрын
Yeah. Developers Master Faith; Do not change if it works :D Have a good works
@ivomollov3073
@ivomollov3073 2 ай бұрын
Do you know the background implementation for this tag container? How much space does it occupy with those strings? How are these strings compared? What data structure lies beneath it? What algorithm is used for searching a specific tag, is it optimal when done multiple times a second? If the answer to these is not O(1) with no extra space spent then having a ton for booleans is the better solution when it comes to performance. If however these are going to be checked occasionally then tags are the superior choice
@thegamedevcave
@thegamedevcave 2 ай бұрын
These are index as Fnames, meaning the comparing isn’t a string comparison but rather an int comparison. There shouldn’t be any real performance impact. I mean if you’re checking for every tag on every actor during every frame you’ll notice a difference but at that point the tags aren’t the issue, the mess of code would be the issue. on a purely theoretical level, tags are slightly more expensive but in the real world, it’s impact is near 0. That kind of super low level optimisation is super important in data center software development, for a video game, I wouldn’t worry about the minimal difference:)
@arthurbulhak1266
@arthurbulhak1266 4 ай бұрын
The more you know xD. Thanks for telling about another baked-in feature I've never ever seen.
@thegamedevcave
@thegamedevcave 4 ай бұрын
unreal does a great job having so many baked in features, and a terrible job letting you know about them XD I guess that's my job though! :p
@arthurbulhak1266
@arthurbulhak1266 4 ай бұрын
@@thegamedevcave Indeed, unfortunately many older links that can still help rely on old forums which where replaced by "community forums" which bricked all docs and now we have to explore UE like after server wipe xD
@thegamedevcave
@thegamedevcave 4 ай бұрын
@@arthurbulhak1266 it's really annoying that they just wiped those old servers because So often when i'm troubleshooting an issue I find the answer and it turns out to be a dead link XD so I 100% feel you there!
@arthurbulhak1266
@arthurbulhak1266 4 ай бұрын
@@thegamedevcave Exactly, I guess at this point the best way to debug stuff, albeit definitely "advanced" (well default if you at least understand C++ :D) is to download debug symbols (aka 40 more GB), double-click on every blueprint giving trouble, looking at code directly and then going to UE5 codebase docs. Quite more annoying but extremely rewarding
@tuwumuch
@tuwumuch 27 күн бұрын
Fixing old habits be hard
@thegamedevcave
@thegamedevcave 26 күн бұрын
it really is!
@BlazingnitroYT
@BlazingnitroYT 13 күн бұрын
@@thegamedevcave with people like gorka and matt aspland posting, these bad habits are extra hard to break for a lot of people
@boundlessunrealengine9467
@boundlessunrealengine9467 4 ай бұрын
Thanks! Just in time. And how did I miss it before?
@thegamedevcave
@thegamedevcave 4 ай бұрын
Exactly what I wondered when I found out about these a while ago XD
@kenalpha3
@kenalpha3 4 ай бұрын
Is the tags INI file readable by players in a packaged game? Is there a free way to encrypt the text (names) so that we can have a secret status (not readable from players opening the INI file)?
@thegamedevcave
@thegamedevcave 4 ай бұрын
the Gameplaytags.INI file isn't readable for players. So no need to worry about any of that, players would need to decompile the game to get access to any of that and unreal has a build in feature to encrypt your game when you package it if you feel like that's needed
@kenalpha3
@kenalpha3 4 ай бұрын
@@thegamedevcave Thanks for the reply. Never packaged yet. So UE has a built in encrypt option. But I found this: "I-wanna-fuck-SCP1471 ·3 mo. ago There's no real "need" to encrypt the game PAKs, especially since AES encryption can be broken in seconds" "botman ·3 mo. ago It's not actually breaking the AES encryption. Epic simply puts the key into the executable and it's fairly trivial to find the AES key to unencrypt the package" Video idea: So can you give info or make a vid about working encryption methods in UE5/2024? And show these INI files to show us what is/isnt seen in packaged games (with/without encrpyt)? I saw assets on the Market. But unsure of the quality or if they are as hackable as Epic's method. (Nothing is hackproof, but I want a way to hide game name variables and player progress unlocks from most players.) Ty
@thegamedevcave
@thegamedevcave 4 ай бұрын
idk, in the end there is no such thing as 100% secure encryption and for anyone that's not a mega studio spending millions on developing a game, i dont think you should worry about it too much.
@SeanMaxhell
@SeanMaxhell 3 ай бұрын
I need to check if these tags also work across animation scripts, so I can create custom statuses like flying and swimming.
@thegamedevcave
@thegamedevcave 3 ай бұрын
they're stored on the actor so like any other value and variable yours should be able to get them into your animation blueprints without issue. (although for things like this you're better off using an enum, like the way the character movement component that unreal provides you with does, since you'll only ever by in only 1 of these states at a time anyway)
@DailyPaily
@DailyPaily 4 ай бұрын
I need more pros, its like a struct of tags.
@thegamedevcave
@thegamedevcave 4 ай бұрын
It kind of is I suppose, but that should be a good thing
@MetronSM
@MetronSM 4 ай бұрын
How would you quickly find all actors on the map that have a specific tag?
@thegamedevcave
@thegamedevcave 4 ай бұрын
you'll likely have to get an array that keeps track of all actors (on begin play simply get all actors of class and store that in a variable so you dont have to do it every time you need to check). Then for each loop through that array and check for their the tag you want. If youre spawning in any new actors or any actors get destroyed, do make sure you add and remove them from that array though. Doing any operation on all actors in a level isn't ideal though so you gotta be careful with doing that and only do it if you really have to.
@MetronSM
@MetronSM 4 ай бұрын
@@thegamedevcave Thanks for the reply.
@lDeltalol
@lDeltalol 4 ай бұрын
I have worked almost 10 years with UNREAL and this is the best way to handle booleans, even character states and avoid the use of global enumerators (not local scope enumerators) and it is pretty standard in the industry today (in UE5). It should be noted that for systems like GAS (or similar), where it is necessary to validate several conditions to use a skill or modify an attribute, this way allows to simply add them in a FGameplayTagContainer and that's it.
@kenalpha3
@kenalpha3 4 ай бұрын
What should be used for 100 weapon unlocks? Because if a mock bool (yes/no) is stored in an INI file, then the player can hack the file to unlock weapons. Whereas if the Bool is stored in a [what type of file/asset] - we can make the unlocks unhackable?
@thegamedevcave
@thegamedevcave 4 ай бұрын
the actual state of a bool isn't stored in an .ini file, it's just the list of possible tags that exist in that ini file that the engine uses, once you compile the game, even that .ini file isn't accessible for players. That said, these tags probably aren't the best solution for unlocking weapons either, though it does heavily depends on the kind game you're making. If it's a simple singleplayer game I'd probably look into something where the weapon information is stored with data assets and that data asset simply includes a bool for "isUnlocked". but again, there's a lot of variables at play to decide what works best for your project.
@kenalpha3
@kenalpha3 4 ай бұрын
@@thegamedevcave "bool for "isUnlocked"." Thanks for the confirm. Im using a DT made from a Struct that has weapon variables + bools. But for status effects, I see that your meth is better.
@thegamedevcave
@thegamedevcave 4 ай бұрын
As far as i know data tables are read only assets so you wouldnt be able to write to them to chamge the unlock status of a entry. If youve found a way to write to a data altable though im interested to hear about it because if that works i do think it may be the best option
@kenalpha3
@kenalpha3 4 ай бұрын
@@thegamedevcave You're correct. Im still prototyping and it uses DT to load, but not save (yet). Are Structs writeable? I believe I bought an asset that saves DTs, or it loads the DT into another file type, and saves that. I'll have to get back to you. And/or there may be a free method to load DT info to other asset > save that asset.
@normandguerin8901
@normandguerin8901 2 ай бұрын
I dont understand. I follow all instructions and i have access to tag names from characterBP and levelBP. but i can only assign tags values from each blueprints. even if they have the same tags they are completely as stand alone since changing a tag value in one BP does not affect value in the other BP in any way. is this where the interface comes in to play because i setup the interface also and there is still no value change from one BP to the other which would be the point of this exercise right??
@thegamedevcave
@thegamedevcave 2 ай бұрын
No I think you might have misunderstood. Every actor has its own tag container to keep track of its own values for the tags so setting a tag on 1 actor only sets it on that actor, the on/off values of the tags aren’t a universal thing. If you want something like that simply put a tag container in the game mode or game instance so every actor can access it easily and read it write to it.
@normandguerin8901
@normandguerin8901 2 ай бұрын
@@thegamedevcave oh i see. Thank you
@normandguerin8901
@normandguerin8901 2 ай бұрын
@@thegamedevcave its weird that i cant access values fron other blueprint since its all in the same single .ini file
@thegamedevcave
@thegamedevcave 2 ай бұрын
@@normandguerin8901 the .ini file only declares the tags, it sets up what tags exists. the actual tag container is what stores each tag's true of false state on a per actor basis
@normandguerin8901
@normandguerin8901 2 ай бұрын
@@thegamedevcave once again, thank you so much for your time.
@carlosrivadulla8903
@carlosrivadulla8903 4 ай бұрын
didn't u previously add these tags in the project settings?
@thegamedevcave
@thegamedevcave 4 ай бұрын
you can add new tags in a lot of places, I believe there is a place for it in settings too, there is also a specific window you can add that's for managing your tags. in the end they all simply get added to a .ini file, regardless of what way you're adding them :)
@FreakinMrGamer
@FreakinMrGamer 7 күн бұрын
Subscibed !
@Priception
@Priception 3 ай бұрын
As a Halo modder, im really used to tags, and it's good to see i can use them in UE.
@Youshisu
@Youshisu Ай бұрын
Why not use struct with all params defined there? Why tags are better?
@thegamedevcave
@thegamedevcave Ай бұрын
unreal has an interface set up for gameplay tags so you can check gameplay tags on any actor without needing to cast to them at all. Gameplay tags also easily allow for Parent/child relationships where you can check either for a very specific tag (like Status.Stunned.Long) or any more broad parent tags (so you can also check for just Status.Stunned to check if the actor has ANY of the child tags of stunned or just check Status to check if there are any status conditions at all) Behaviour trees also have a prebuilt decorator that can check gameplay tags on the Pawn they're running on so its' easy to check "if character is burnt, run this behavior"
@Graydis_Media
@Graydis_Media 4 ай бұрын
Just use an observer rather your listeners dont need to know if is healing you just have to send out the call to them when they are subscribed People become in flexible when thinking about design
@thegamedevcave
@thegamedevcave 4 ай бұрын
Thats not at all what this video is about though...
@Graydis_Media
@Graydis_Media 4 ай бұрын
@@thegamedevcave To be fair its best practice especially on larger projects otherwise you have to keep track of all the object tags This can scale to thousands & become extremely hard to pin down
@thegamedevcave
@thegamedevcave 4 ай бұрын
@@Graydis_Media as an example, the gameplay ability system uses tags a lot. You tag an an ability of gameplay effect with a certain tag, then when you execute that ability, it can cancel other abilities with certain tags, block abilities with certain tags while this ability is in use,etc. For effects it can check the tags and decide if it should apply an effect or end another active effect all based on tags. If you'd have to program all that for each ability or effect through only Delegates that would be a massive pain in the ass. This video just shows the basic concept of what gameplay tags are and what they can do. Besides all that, the ability to check for either a specific tag or a parent tag makes for a very flexible workflow. The way you should use gameplay tags isn't to activate or deactive things, you're right about that. it's more something you use to check if something is currently active or not by querying an object for a certain tag.
@bencemervay
@bencemervay 4 ай бұрын
I generally do not like tags, becasue they are strings (costly and prone to errors via typos). I usually make my own systems with enums. But this is pretty cool, I will definitely keep this in mind!
@thegamedevcave
@thegamedevcave 4 ай бұрын
if you're working in c++, that does increase the odds of things going wrong with typo's for sure XD something to be mindful of
@bencemervay
@bencemervay 4 ай бұрын
@@thegamedevcave I mostly worked in Unity before, there tags have this danger. I started prerly learning Unreal not too long ago, and I always wonder at all the solutions that are pre-built in the engine. Such as these game tags.
@Marcus615
@Marcus615 4 ай бұрын
@@thegamedevcaveUE5 professional gamedev here... This is wrong actually, you don't really need to use strings ever with Tags. Sure, they have a FName internally and you could have a typo, but the only associated risk is to have a typo-ed tag and that's a very easy fix. See, when you declare & define a tag natively, you associate it with an actual variable name that your autocompleter (and of course compiler) will ensure you don't miss-type, ever. And on the editor side the property editor for tags just doesn't allow you to make a typo by nature. As for performances, tag comparisons between one another and against a container are much faster than a string comparison : FNames are "indexed" internally. It's their whole point. It's not at all the same as if you were to just express the state of your actor (or whatever else !) with a bunch of strings.
@alexandrupana6037
@alexandrupana6037 4 ай бұрын
Tags use FName under the hood, which are strings that get indexed in a global table at construction. Each FName that has the same case-insensitive string gets the same index. Equality comparison is done using the index, not the underlying string.
@PeoplesGaming
@PeoplesGaming 4 ай бұрын
Looking through names is vastly faster than looking through strings, hence epics use of name variables in tags. Just to simplify the last comment 😂
@StBlueFire
@StBlueFire 3 ай бұрын
I'm curious to know more about why you don't use the default "Actor GameplayTags" and make your own struct. It basically creates a free interface for you so you don't have to cast to get gameplay tags off the actor if another actor is curious (like a sprinkler turning on if something overlaps with burning tag). Additionally the actor tags iirc will interface with gameplay effects in GAS so you can set yourself up to move more easily to that system if the scope makes it worth it.
@thegamedevcave
@thegamedevcave 3 ай бұрын
Yeah tbh that’s probably better, just wanted to show this in case you for whatever reason you have 2 containers on a blueprint you do this. But I’ll happily admit that’s a pretty unlikely scenario xd
@PsychoJosh
@PsychoJosh 4 ай бұрын
So this gameplay tags feature is basically the same as a switch function?
@thegamedevcave
@thegamedevcave 4 ай бұрын
i can see where you get that comparison, but this is something else. This is just a bool that's a little bit smarter and can be declared on a project wide scope, instead of on a specific blueprint. A switch statement is something that decides the flow of 1 input into 1 of many outputs based on the value provided, so using a switch on a bool or a gameplay tag would still just be a true or a false, same as an if statement (branch node)
@Kinos141
@Kinos141 3 ай бұрын
I still don't see how gameplay tags are different from enums in terms of usage. I believe I can get the same functionality with enums to an extent.
@thegamedevcave
@thegamedevcave 3 ай бұрын
An enum only can have 1 value at a time. So it cant be set to both poisoned and burnt at the same time, unless you make an array of them but thats still a rather clunky work around. Youre also missing out on the ability to check for parent tags.
@Atl3m
@Atl3m 4 ай бұрын
crapy part about gameplay tags is that if you migrate a progect using tags the tags will not recreate and you need to manually re sett all the tags . you can always move the tag.ini first but not always making edits in the config folder is the best way to go . i loooove tags tho dont get me wrong . unreal just need a fix, if a tag dont exist well just create it
@thegamedevcave
@thegamedevcave 4 ай бұрын
yeah when you migrate it really should move over the .ini file first so the gameplay tags don't break... that's a really good point, unreal should fix that!
@Atl3m
@Atl3m 4 ай бұрын
also they need to expose tags for full support in ai behaivor tree @@thegamedevcave
@thegamedevcave
@thegamedevcave 4 ай бұрын
i do believe BTs already do a pretty good job. unreal has a standard decorator that checks if an object has a certain key and it's pretty easy to make tasks or services to set keys if need be. If you want a blackboard key for gameplay tags, that may be a slight bit more of an issue though, i'm not sure but I also dont see much reason to have a gameplay tag (container) as a key on the blackboard.
@Atl3m
@Atl3m 4 ай бұрын
@@thegamedevcave well gameplay tags replace enums, like AI state, it's alot more flexible to add new stuff to gameplay tags than edit enums that also can corrupt structs, if everything is gameplay tags you can edit it as you want not killing a huge struct. I ended up using BT they are handy for sure but then again you need to manually write and remember where Gameplay tags is more like a huge enum drop down of posebilities. (Cursed Enums)
@thegamedevcave
@thegamedevcave 4 ай бұрын
@@Atl3m Well, i personally am not sure I would use gameplay tags as a replacement for enums like that. Of course it's possible but not really it's intended use. But even if you want to use it like that, unreal already does have that support build in right? there literally already is a decorator that checks if something as a certain gameplay tag. (That might be a decorator added by the gameplay ability system though, which could be why I have it in my project) either way, it's pretty simple to write a few things to make use of gameplay tags for your AI :)
@RyouTheMad
@RyouTheMad 4 ай бұрын
sometimes I struggle a lot to get variables from other places/actors and such... since this is "global", this might be the best solution at first glance dayum
@thegamedevcave
@thegamedevcave 4 ай бұрын
the setup for what tags exist is global, the actual values are still on a per actor basis so i dont think this helps with that honestly. If you need actors to share information you should just made a reference variable to them and link them up inside the level editor.
@FluteboxFan
@FluteboxFan 4 ай бұрын
Basic, interesting, nice.
@S.Gamedev-zc2wp
@S.Gamedev-zc2wp Ай бұрын
I love you
@ComfortZoneComic
@ComfortZoneComic 3 ай бұрын
stunned by hammer ...... was that a MH reference XD?
@thegamedevcave
@thegamedevcave 3 ай бұрын
It wasnt but... it is now xd
@ComfortZoneComic
@ComfortZoneComic 3 ай бұрын
pog@@thegamedevcave
@denizforst
@denizforst 4 ай бұрын
why not just use enums?
@thegamedevcave
@thegamedevcave 4 ай бұрын
Enum can only have 1 value at a time
@Sweenus987
@Sweenus987 4 ай бұрын
@@thegamedevcave Was gonna say bitmask enum, I'm disapointed that Blueprints don't seem to support this, unless I'm missing something. Edit: I was missing something, bitmasks are supported but the value is stored as an integer
@OleksandrSe
@OleksandrSe 3 ай бұрын
So much British 😁😍
@thegamedevcave
@thegamedevcave 3 ай бұрын
i'm not but thanks anyway XD
@viwesvideos
@viwesvideos 3 ай бұрын
Just use an enum.... solved. works in ANY engine.
@thegamedevcave
@thegamedevcave 3 ай бұрын
gotten this comment a lot, but everyone seems to skip over the fact that an enum doesn't have the upside of the parent/child tag hierarchy, and more importantly, it only has 1 value at a time, so if you use it for status effects like the example in this video, you can't be both burnt AND poisoned. if you use it for a wider use case where you also have tags for when you're attacking, now you suddenly can't attack while you have any other effect applied to you, or you need to disable the effects whenever you do an attack. using enums for this is honestly a more messy setup than sticking with the idea of using a whole bunch of bools.
@viwesvideos
@viwesvideos 3 ай бұрын
@@thegamedevcave state machines are generally not happy with multi dimensional statusses anyways, its a way better practice to split them . sm's for buff and debuf, movement, health for example. Modularize instead of spaghetti'ing it. That makes it easier to add on one of them later too if you are going to do dlc or even if there is a cool new idea you want to add later in development.
@thegamedevcave
@thegamedevcave 3 ай бұрын
@@viwesvideos not sure where states machines suddenly came from? none of this really has to do with state machines. Take a look at the gameplay ability system for more in depth uses of tags, it's useful stuff. if you insist on not using them you're of course free to do it in any way you prefer but I think you are fundamentally misunderstanding what these tags are and how I show them in this video. Tags are easily expandable and really don't cause any spaghetti code so i'm not quite sure where you're coming from. that's the whole point of the parent/child tag thing. you can check for parent tags so instead of checking " is character X doing Y attack" you can simply check if it's doing ANY attack, so if you want to add something new to that, you simply add a new child tag, anything that involves that new thing directly can check for that while everything that just checks for attacks in general will now also pick up on this one.
@viwesvideos
@viwesvideos 3 ай бұрын
@@thegamedevcave i gave the tip to use enums instead of checking bools, because this works across any and all engines. If one would use enums, you should use them in state machines. This way you dont have to check single statusses over and over. For character status controls, sm's are widely used for the speed amd ease of use. In visual scripting its a bit hard to recognise but underlying it still works the same as in just coding it. Not saying that what you explained in the video is any less valid or usefull, just giving an alternative tip
@thegamedevcave
@thegamedevcave 3 ай бұрын
@@viwesvideos I would still recommend looking into unreal's gameplay ability system to see a more worked out implementation of how and why tags can be useful. the thing i you're not checking for a bunch of tags constantly, when you want to apply a certain action or effect, you check if there already is a tag active , and based on that you can write some logic to do, whatever you want really. does a character have a tag for healbock? you can just check for that tag in any healing ability and if it is present, cancel that ability. Is a character already attacking? simply disallow other attacking abilities to active, but it also works the other way around of course, checking if a tag is present to allow certain abilities. It's much deeper than the example I give in this video of course because all that hardly fits in a simple video. But getting a feel for gameplay tags , knowing they're an option and if you plan to use G.A.S. pretty much a requirement, it's just good to know how they work. Doing all that in a state machine would be a nightmare. it's pretty unreal specific though you're right about that without a doubt, but i'm making unreal tutorials so of course i'm not overly worried about other engines. I know that unity at least ahs something similar to this tag system though. All that to say, enums are great of course and you should use them, but they dont really fill the same roll as gameplay tags so if you're looking for an alternative to tags, i think enums are more bothersome in this specific use and role than a simple list of bools (which is messy, hence the idea for this video in the first place)
@jcd302
@jcd302 4 ай бұрын
This is amazing!... stunned for being stupid. Thank you! 😂
@thegamedevcave
@thegamedevcave 4 ай бұрын
it's amazing how easy it is to overlook simple things isn't it XD Glad I could help!
@cloodheegamedev
@cloodheegamedev 4 ай бұрын
like for stunned for being stupid
@fabulamcafee
@fabulamcafee 3 ай бұрын
dont tell me what to do - you would also not listen if i tell you to use c++ instead of these awful nodes
@thegamedevcave
@thegamedevcave 3 ай бұрын
i do use c++, so jokes on you? I just use blueprint for tutorials because its easier to understand for some people and c++ user can figure out the c++ functions for any given nodes easily
@fabulamcafee
@fabulamcafee 3 ай бұрын
@@thegamedevcave wish you good
@joshmiller5374
@joshmiller5374 23 күн бұрын
My new motto has become that you can tell how good of a programmer someone is by how many booleans are in their classes. GameplayTags are a way better and more flexible option. Great for anything using data as well(Maps, DataTable rows, DataAssets, etc)
@LudvikKoutnyArt
@LudvikKoutnyArt 4 ай бұрын
If you are a game developer, and your initial idea of grouping multiple booleans describing status of your actor is not using for example a map of string/name to boolean or a struct, but an array of unnamed bools the indices of which you remember/write down, then it's probably time to uninstall Unreal and try carpeting or something :) The map one is a decent solution, but no, both aren't decent solutions ;)
@thegamedevcave
@thegamedevcave 4 ай бұрын
ah yes, because gatekeeping beginner's on a tutorial video is always a good thing to do. Of course both methods, just a list of bools (if they're unnamed in an array, that is much worse), and the map with string/bools are workable if you're just getting started, there are so many more important things to put your attention on, those bad solutions work, and that's whats important , and then whenever people are a few steps further into learning game development, it becomes important to not get stuck with those sub-par solutions and put a little effort into learning The better solution like gameplay tags. Telling people who are learning that they're not good enough is a toxic as hell and unproductive way to teach them. do better.
@VampiricBard
@VampiricBard 3 ай бұрын
@@thegamedevcave Great response. I can't stand gatekeeping.
@instagalactix
@instagalactix 4 ай бұрын
Unity is better hehe.
@thegamedevcave
@thegamedevcave 4 ай бұрын
it is for people that REAAAALLLY like dying on hills
@buster5661
@buster5661 3 ай бұрын
This tutorial can be significantly reduced. Lots of unnecessary fat
@marcapouli7805
@marcapouli7805 4 ай бұрын
For years I've been wondering what was gameplay tags. But I never use string/bool combination so I guess I will never use gameplay tags either
@thegamedevcave
@thegamedevcave 4 ай бұрын
if you have any sort of thing in your games that you need to keep track of that are like "states" , that being like in this video "is burnt" or "is healing" But also things like actions like "is attacking" or "is searching for player". You probably should be using gameplay tags. I have a hard time imagining going through years of development and never running into a usecase for this.
@marcapouli7805
@marcapouli7805 4 ай бұрын
@@thegamedevcave "I have a hard time imagining going through years of development and never running into a usecase for this." 😅 Because I don't worth anything, I try to make games for almost a decade but since I'm not game designer I start projects and give them up because I don't know where I'm going, so I use enums if needed when I start a new project and it is good enough. I think real devs have plans before begining to code. I'll never be a real dev despite all my endeavors.
Stop Casting! use blueprint Interfaces Instead!
11:56
The Game Dev Cave
Рет қаралды 6 М.
SOFT Object References in Unreal Engine EXPLAINED
11:58
The Game Dev Cave
Рет қаралды 6 М.
INO IS A KIND ALIEN😂
00:45
INO
Рет қаралды 21 МЛН
How to ACTUALLY Load Levels in Unreal and Make Loading Screens
16:31
The Game Dev Cave
Рет қаралды 25 М.
UE5 Understanding Tick - Be a better game dev
21:35
LeafBranchGames
Рет қаралды 9 М.
Lets Talk About Asset Manager
20:07
Rukgul
Рет қаралды 6 М.
I solved Unreal Engine's Package Size Problem...
14:35
Cobra Code
Рет қаралды 41 М.
Unreal Gameplay Ability System - FULL COURSE
2:43:58
The Game Dev Cave
Рет қаралды 5 М.
Unreal Gameplay Ability System - #1 Ability System Component
10:58
The Game Dev Cave
Рет қаралды 7 М.
5 Tricks you (probably) don't know about Unreal Engine 5
10:44
Cinecom.net
Рет қаралды 338 М.
Simple Stylization Techniques in Unreal Engine | GDC 2024
29:13
Unreal Engine
Рет қаралды 36 М.
Subscribe for more Coding Tips! 🔥I wish I knew this When Istarted Programming #school #software
0:34