Committing game dev crimes to finish my game
Vložit
- čas přidán 9. 09. 2024
- FEED THE DEEP IS OUT NOW! store.steampow...
Next time someone asks me why I don't make tutorials on game dev or programming or Unity, I'm going to point them to this video.
#gamedev #development #devlog #indiegame
Well I will certainly be contacting my lawyers about this grave injustice against me 😂😂😂
can you publish a video explaining please?
@@KindOfWitch This was sarcasm, hes not gonna sue...
@@tylergust8881 no I mean explaining the thing that he was interrupted with. did you even read the comment? edit: ratio lol
I really wanted to see the explanation. Getting enemy AI to work is my current biggest roadblock for my game 😅
@@fonzy675 search "navmesh" and "A-star" and it should give you the info you're looking for
Luke talking about how rare clipping out of bounds is:
speedrunners: *taking notes furiously*
I would say its more of a
Speedrunners: *ramming into a wall furiously*
Speedrunners slow the video from 8x to 7x speed.
The best kinds of bugs are ones that require deliberate effort and allow things like sequence breaking.
@@VGamingJunkieVT My favourite one was a glitch in Two Worlds that allowed you to complete the whole game in just 2-3 minutes. All you had to do was run past the guards at the start then the final boss was spawned somewhere in the distance. Reach him, attack him, some NPCs join in, he dies - final cutscene rolls showing a completely different part of the game world.
It was truly remarkable and I've never seen anything like it.
I also heard aboue one of the Test Drive games where you could apparently cheat the time trial stages by reversing. Never seen that one in action though.
"Is it really a crime if everyone does it?" lol
I don't think this holds up in court hahahahah
I always tell this to myself everytime I play in my Dungeon & Basement.
Prohibition moment
I think you'll find that the answer to to that question depends on how much the authorities dislike you.
@@Nevir202 unfortunately true.
The "chum" thing is the craziest crime, i'm going to have nightmares about that one
Haha yeah I know it's actually so bad. There are a few like that and I am not proud.
Why's checking by it name bad, and what's the correct solution to identify it?
@@edwardperkins1225 I'm not a programmer/dev, but I thought you could just refer to a specific defined game object for the game to react to
A better way, in Unity, is to have attach an empty script onto the chum object called Chum and when checking it in code if that object is Chum is to call the TryGetComponent function. This way when checking, you check via the component/script attached to the object. The reason it isn't recommended to check by name is that one small typo can lead to headaches in the future when debugging.
@@edwardperkins1225 afaik searching by name is cringe because if you have another thing called a chum bucket then your code will still think its the chum
and not sure but afaik the proper way to know what type of thing is the right type of thing, is to use "tags", where you can tell any object that it's any tag you want
so then you'd have your chum object and give it a custom chum tag, and then it should all work fine
for the raycasting to find if the player is stuck:
1. cast upward ray to hit a wall, note the coords of hitting the wall as coord1
2. move a smidgeon upwards, cast a ray down, if the coords of the hit wall match coord1, count one intersection, and repeat step 1, otherwise, count 2 intersections, and repeat step 1.
This assumes your walls are infinitely thin.
also it IS possible to pass by more than 2 intersections while doing this and fail, but at that point just blame the map.
He could have evaded the problem entirely by using physics2d.raycastAll, but oh well
Ohhhh thats a great idea!
@@lukemuscat Hey, does RaycastAll not work? I see that you are using it in your code snippet. It should not stop at the first point hit and be exactly what you are looking for?
can't he just check if the players position is within the navmesh enemies use to path around the map rather than doing any raycasts at all? If the position is outside the auto generated navmesh of the cave, then you should be able to know via .NavMesh.SamplePosition. Can have it check after the map is regenerated, then move player to the nearest sampleposition found (this returns closest position on navmesh within radius).
Or just use RaycastAll :)
Skipping the “correct solution” is how I finally finished a game. And finding a balance between the “correct” and “fast” solution is something I’m still trying to learn
While what I am about to say is purely opinion, I hope it can help you in finding the right balance for you:
"Correct solution" is extremely case by case basis. Just because something was the best solution in some game, doesn't mean it will be the same in yours.
The fast solution will usually be best, because you get to see how it affects everything you made quicker and can readjust sooner to hone in on the design that feature needs and then you slowly turn it into the "correct solution" over time.
Also, going with the "correct solution" from the start puts restrictions on future design of other stuff, and will usually result in less flexibility in how you can add new things. Whereas with fast it'll be easier to add new things and then you can just correct everything once you have all needed features added. One, because it's not very sophisticated yet. And two, because there is less attachment and less of sunk cost fallacy creating a barrier in redesigning it.
Being stuck with the "correct solution" will force you into planning rather than developing... And you won't get the "correct solution" right of the bat anyways, no matter how much you plan, unless it's something you already have a huge amount of experience making.
Reconsider *_"correct_*_ solutions"_
Consider: *_optimal_*_ solutions;_ the upper intersection of *_best_*_ and _*_fast_*_ solutions._
Contrast: *_suboptimal_*_ solutions._
Game Jams are fantastic to help figure that out
Granted, theyre basically a hackathon from beginning to end, but youll get a feeling for when its a good time to hack, and what/how to
@@marcsh_dev I completely agree. I had about 8 months of experience but never finished anything. Entering a game jam was the only reason I finished my first game
Trying to find the golden ratio between the correct and fast solution is the dichotomy at the center the working man
"In months of testing I've only seen this bug twice"
You'll end up getting 10 reports of it on launch day lmao
So true haha. I remember we had some bad bug in Fruit Ninja early on and we got like over 3000 complaints or something nutty in like 24 hrs :|
I have wish listed this, and will buy it.
Will I be able to name my character . . .Chum?.
They'll probably be "Player"
Only when you call them “Link” will something special happen…
“Good practices” isn’t in my vocabulary. My projects are one mechanic away from imploding at all times
Edit: Thanks for the likes🙏! I create video game content creation on my channel. Feel free to check it out if you’re interested! If not all good, keep living your life😁!
I just use nested if statements for everything
A true game dev veteran
Same here.
I use Scratch, so my projects are always imploding until I FINALLY do what the Scratch gods demand of me.
@@randompandemonium4823 :(
your footbal game looks cool, good luck
"Except it's not quite that easy, is it?" Hahaha, so relatable
I love all the subtle humour in the video, from cutting off Szevvy, to the whole "but it's never that easy is it" bit. It doesn't seem overdone and is just put in very slickly into the video while not diminishing the final quality. Actually brilliant.
Hollow knight pfp w
0:52 I do everything by the book, it's just that I made my own book...
So, we name our player "chum" got it
I love that you used the summoning salt music for the speedrun joke lmao
I’m a solo indie dev and this is super refreshing to see. A lot of game dev is concrete, but even more is smoke and mirrors, especially as the project progresses. Dodgy checks, scanning every object in the world and checking if it’s name contains “chum”, and brute-forcing extremely edge-case physics is all part of the process, and I’m really happy I’m not the only one. It only has to work just well enough, it doesn’t have to be perfect, and that’s all part of the fun imo. It does increase the nerves when I think about releasing someday and having everything break for a week or two, but we’ll cross that bridge when we get to it, if we get to it! Staying strong, we’ll finish this project eventually here’s hoping
I mean Szevvy really is just that efficient.
The brute force raycast wiggle is really clever, even if it makes me cry a little.
Also congrats! Can't wait to play on the 16th :)
12:24
Bro is NOT summer salt 😭🙏
2:41 damn szevvy is quick
Can I just say thank you again for sharing your game dev journey with us? I know similar things have been said before, but you had a huge impact on my childhood, and I am now a game developer myself. It is just so flippin' cool to get to watch your creative process, and to know you're out there doing the stuff that I want to do.
Thank you for sharing your journey! Looking very much forward to playing the game!
0:20 so you're telling me that in the code of the game I'm about to play, there's a house made of ascii characters? :o
Probably not, since the code that's in the release version is compiled into a format that's only readable to the computer. I don't actually know for sure that's how compilers work, but I'm guessing they remove comments (comments being stuff in the code that isn't run but is there for humans viewing the code)
I mean comments by definition are not included in compiled executables, unfortunately.
A programmer and a silly-ous humor walks into a bar. The bar burst up in flames.
@@cloud_and_prouddepending on the unity build settings, it's possible to build the game with the whole source code available to anyone, but I doubt he would do that
@@yugiohk574even if he does build it that way, the comments are still removed.
16:24 Rhythm game inside a diving game made by the developer of fruit ninja and jetpack joyride before gta6 is crazy 💀💀🙏🙏🙏🙏
14:35 “If it works, Don’t touch it”
I really needed this, iv been working on a project and was losing confidence in my work cause I felt like I was jerry rigging somethings to just work. 😅
When I was working on my game earlier today, there was a glitch that caused the player to rocket through all 10 levels in less than a second. Instead of trying to find the cause of it, I just made it so that when you entered a new level, it waits one second before unlocking the door. It worked like a charm and I still have no idea why that happened.
14:49 Reminds me about undertale's massive if statement for the dialogue!
The only crime you committed was to cut poor Szevvy like that 😭2:41
True! And, unfortunately for Szevvy, also hilarious.
Haha yeah I asked him to record something and I told him I was going to cut him off. He had a great little rant about reticulating splines, but the shorter I cut it, the funnier I thought it was :D
@lukemuscat ahh man i really wanna hear the rant now it sounds interesting 😔
@@lukemuscat Sims reference? :D
Haha yes!
In my game, I'm planning to have just a single dark tile that can only be placed out of bounds, and have it have a trigger, which teleports you straight to the backrooms as a little secret level lol
Props to the including the "unofficial" speedrun synthwave track.
For those who know, and appreciate that genre, it was a nice add.
"But it's not quite that easy is it"
This line and the discussion of edge cases for raycasting gave me traumatic flashbacks to my uni Computational Geometry course
The summoning salt reference is brilliant!
"could not repro" triggered some trauma 😂
lol, love the ”interview” with the guy that built the nav system.
GIVE US THE SZEVVY CUT
3:47 PANNENKOEK REFERENCE!!! ur so real for this thank you mr Muscat
Love this video. It’s great to see how you work around, mitigate and hack through difficulties in your game design.
Thanks!
this is honestly inspiring, it's important to remind ourselves that "done" is infinitely better than "perfect" as an objective to give yourself!
So when it comes to player being outside the map, if you already have a NavMesh for the enemies, you can utilize that one to teleport player to closest NavMesh point. You can also generate a special NavMesh for the player that lets you filter all playable areas. If player is not close to a NavMesh point, you teleport to the closest or last point the player was standing on. This eliminates the issues of dealing with raycasts and edge cases where you teleport outside the map. Worst case scenario is teleporting to other side of a wall, but at this point you would need a wall you can get into for it to be effective.
as a software engineer and unity developer i find this video not only entertaining to watch, but also very funny and educational. true crimes is deep branching in your code and comparing with strings
3:39 That's fairly reasonable, sometimes I impulsively decide to program something formatted weirdly then have to constantly reformat all my data because of it, in this case you did that but without you being the one responsible for the strange formatting.
Genius! Why have I never thought about adding an ascii house to my code?! I've been just looking at my ugly code like chump.
Wait, if you needed to give the enclosed caves a tiny hole for shadows to work, wouldn't that mean that you are never "inside" a shadow zone unless stuck in a wall? Why not just use the same check to deal with clipping into walls instead of a dozen raycasts?
Really good point! I actually started doing it this way, but then realised that there are a few areas where there is level geometry that isn't part of the cave check system (think set pieces and level objects that are not cave walls). So I figured the ray might be a more thorough check!
Writing code is like setting up cables behind the TV. As long as it works, nobody has to know about the tangled horrors that are behind.
This is my favourite video of yours tbh. Gave me a good laugh
_"Game development is all about figuring out ways to get things done without actually doing them."_
- Chad Cuddigan (Delver dev)
100% agree. I was having an issue with some particles firing up when a scene loaded, and couldn't figure out how to make them not do that. So instead, I added a transition and some animations at the start of the scene (also to make it more juicy) and while that runs, the particles are set to be completely transparent. So they still fire, but they can not be seen for 1 or 2 seconds while the scene "intro" is running. If it works, it works.
I dont have the money, but I'm also making a game, and try to see every other game/gamedev with a sense of critique.
Without seeing your page: This game has such a unique and creative gameplay, and also the graphics really complement it, I would say it's a hit :D
After seeing the page:Maaan you nailed it :D I would've put the seconds video first tho, since people want to see just the game first, and If it's interesting to them, they will want to know more, and that's when I would've show the "introduction" video :)
Keep in mind, I never delivered a game, and hope this changes with my current scope, and the help of my friends, and also money, so I'm saying all this from a developer background, and a lifelong gamer pov. Hope I can try out your game once, I bet it's DEEPLY engaging :D
3:40 - There's an official Unity NavMesh Component package that solves this exact issue. You can have NavMeshes on walls, ceilings, whatever, you want. It also works like the current NavMesh system, it just localizes on the object you attach the component to, so whenever you edit the map, you can update that in one click.
11:04 - This is... odd? RaycastAll should, by definition, not stop on it's first target -- at least, that's how it works in 3D. At that point it is behaving like a standard raycast. I suspect this is a bug related to something else other than the RaycastAll behavior. How I would solve this is doing what you did with the RaycastAll, check if it is an odd number of points, then sort the hits by distance and getting the point closest to the player and having that point + offset in the direction of the raycast + tolerance to be the teleport point. Alternatively, if I'm still wrong, you could, for precision, do a second raycast going the opposite direction and get the point closest to the player. And if for some reason that doesn't work at all, assuming all traversable places a player can go are on the NavMesh, you could sample the NavMesh at the player's position and teleport them to the closest point (this is more compute intensive). Also, I don't know how your player object is set up, but if it is a physics object and a collider suddenly spawns on it, the physics object like CharacterController, if a collider is suddenly spawned on the player and they move a bit, Unity will "autocorrect" them by jumping them to a valid point, but it's not reliable as it might teleport the player outside the playable area.
Sorry, I know you mentioned this is shipped and done, but in case you were still wondering, I didn't want you to gaslight yourself thinking these were impossible. Maybe keep in mind for your next project. At the end of the day, if it works it works.
1. Oh I had NO IDEA about the NavMesh solve, that's really good to know!
2. So I just went back and looked at the RaycastAll stuff and now my brain is broken haha. Like I could have SWORN the documentation said RaycastAll in 2D stops (it doesn't).I remember trying to do it as a single ray as I assume that's how it works, and then ran into the issue... but as you mentioned maybe that was actually an unrelated bug and I conflated the two?
And yes this is all excellent learning for the next project, thanks! :)
Ohhhh wait I think I remember now. Although the RaycastAll 2D does indeed continue on, I believe it wont return the SAME collider multiple times. It only returns an array of unique colliders, not every instance of it crossing any collider. So it will only return the first crossing, not the crossing out to the other side. So it doesn't exactly stop like I said in the video, but for the purposes of testing the same collider again, it does.
@@lukemuscat Ah, wait, I think you're right -- it's not that RaycastAll will only return unique colliders, it's that it can only return hits where the side of the collider is facing opposite of the direction of the raycast. So think of "backface culling" in 3D graphics, it will register the raycast going INTO a collider, but OUT OF the collider on the other side -- if that makes sense. In that case, yeah, you'd have to run two RaycastAlls in opposing directions to get points away from and points towards the player, then append them to a combined list of Vectors and sort them by distance from the player.
Sorry, I guess I'm invested because I had to do something similar in my project in 3D (RaycastAll, checking odds/evens, etc.) to solve a different problem, and now that you mentioned it, I remember running into what I described above.
"tentacle monster rat king" is a wonderful thing and would be amazing to find
2:48 if the enemy run fast enough that you cant follow him, you can just teleport him when offscreen to the desired destination.
it will save a lot of processing power
Race conditional load/save system is horrifying, good work
why not just shoot a single ray from the camera at the players location, and have a layer mask for all the meshes that are not water, so if the ray collides then you know the player is out of bounds, then shoot 4 rays in each direction (Up, Down, Left Right) and get the closest change and teleport the player there, that way you're only using 1 ray when the player is not stuck every time you decide to shoot a ray, and not how ever many rays is needed to reach the top, and 5 rays in total, not how ever many rays to reach the top times 3? + it also fixes the possibility where you go into a wall, but the first possible safe space is quite away up from where you currently are, I would imagine this to be quite frustrating if it did happen and fixes the edge case of the gap being so small you could jump over it bc you're never sending out another ray.
Good question, and I hadn't thought of that approach. But I THINK the issue is that the cave mesh is a tilemap composite collider, which is essentially a collection of edge colliders. So I believe a ray from the camera to player will never intersect that line. (assuming you mean firing a ray "in" to the screen). The other option would be for the tilemap collider to be a polygon composite instead, but that hadn't occurred to me until right now!
@@lukemuscat hahah Glad I could help ^-^ Im super excited to play your new game.
1:07 How have I gone my whole life not noticing! Great video.
the most common cause of me abandoning projects is the code not feeling airtight. I think that's too unrealistic, so thank you for sharing.
I read the title and thumbnail as "committing game dev war crimes"
Me too. And I haven't realized it until I see your comment.
Theoretical fix to getting stuck in the walls you could detect if the background of the character is a solid wall or not and then teleport the player to the nearest playable space in using a circle around the player to find the nearest playable space
As a programmer who also makes games, some of these are funky, but like, it's not thaaaat bad (gotta love that programming sorcery!)
One of my favorite personal game dev crimes is when I was making a 2D platformer/metroidvania style game (still need to go back and finish it...) and I implemented variable jump height by just making the jump button reverse gravity for only the player. It's stupid, it's silly, but it works great and is somehow actually super customizable.
Very clever “crimes”! I enjoyed this it makes me feel less bad about some of the hack things I do! Game looks awesome as well!
“1. Battle pass”
*“NOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!!!!!!!!!”*
12:28 not the HOME music playing LOL
For the chum, you could probably use collision masks. Just make it so nothing collides with the deep except chum or vice versa.
Learning about collision masks was a total game-changer(pun intended) for me.
Hey Luke, i just wanted to say thank you. Of course for fruit ninja and so, but i want to say THANK YOU specifically for this video.
Currently i too work on a solo project, (with no prior expierience, just from watching tutorials) which is way to ambitious for me. It already took me 1.5 years and i still need at least another year to finish it. And the last couple weeks i struggled with a lot of bugs, and i was really frustrated and down, thinking about quitting this project. Somehow, i was able to solve most of the problems. But my game feels like duck tape is holding everything together.
And after you said that its normal in game development, that everything is a card house barely holding together, you really gave me some new energy.
This video really brought me back on track. So from a random dude on the internet, to another random dude on the internet. Thank you from the bottom of my heart.❤
It's kind of depressing we now live in a world where when you talk about AI in video games you have to explicitly make clear that we're not talking about a large language model or neural network >.
I will never get used to how you talk about how you made two of the best mobile game ever like if it was nothing
Ironically, I found this video on August 16th.
About the Navmesh thingy. The A* Projects Free Version is perfect for 2D Pathfinding on a few enemies, as the free version does not provide multi-threading, but the paid version does. It even supports local avoidance. I really use it everywhere.
Thank you so much for this video, I wish there were more of this.
Honestly using the same texture for multiple effects should be commended. Lowers file size (not by much but still) and if it's properly instanced it improves performance as well.
To determine if a point is inside or outside a collision shape, you can traverse the path from the perspective of a point (in this case the players position) and add up the amount of turning along the way. If it adds up to a full 360 rotation, it's inside. If it adds up to zero its outside.
You've got me thinking. From the images for the hacked enemy movement it looks like a "perpendicular universe". Great hack btw!
Be unclean when prototyping to iterate fast, be clean during development to avoid a mess, be unclean shortly before release to get things done.
Man casually builds a Klein bottle to fix shadow occlusio.
This is the most motivational game dev video ever! Thank you.
As a game Programmer myself i definitely want to see the bad code you wrote. Massively entertaining
The hack house better be an unlockable hidden level too
Damn, you did Szevvy dirty!
For Physics2D.Raycast, one solution I could see is grabbing the bounds or vertex data of the first Collider2D you intersect with.
Specifically, if your tile map uses the same collider for each generated piece (I'm assuming a PolygonCollider2D or EdgeCollider2D), then it could be a problem of just detecting whether or not you're inside the polygon (youtube isn't allowing me to send links, but I was able to find a C# implementation on StackOverflow quickly).
Not sure what your setup looks like though, and I'm sure the solution you have is perfectly workable. Congratulations on shipping the game!
The in wall check would be easier if you produced two simultaneous rays, one horizontal, the other vertical. If the player is inside a wall then both would produce an odd number.
3:12 when I eventually try making a game myself, I'll remember to orient it correctly
im still confused why you mentioned "unless something goes wrong, you should never be in an odd number of ShadowCasters" and then proceeded to not use that to check if something went wrong :P
it felt like you were foreshadowing the solution to being inside collision
Since its procedural generation..
My aproach for detecting open areas and how avalible/spawnable they are is generating circles when generating the map..
Just an idea.. Dont know if it would work in practise..
After generating the map make another iteration through the map in a tiled order and spawn a circle thats as big as the "spawnable area".
If the circle collides with the map, destroy it and move to the next tile.
If the circle fits, dont destroy it, and run a resize function on the circle before continuing tiled iteration of the map.
resize function is just to make the circle fit better inside the map, it might scale until it hits a wall, when hitting a wall it takes the point it collided with, moves the circle in the oposite direction by like half or a third of a tile, then continues scaling, maybe it tries the reposition twice before rescaling incase it is inside a weird cave with multiple edges sticking out, and when the resize function fails due to collitions like 3 times, it stops, returns the function and the tiled map iteration continues, also circles detect collitions with themselves so not too many spawn, then just use these circles as a list of spawnable areas with the circles size being an indicator of what fits inside it, also while playing the game, you could have more circles spawn on map changing events around the area a change happens, by firs resizing circles in the area and then tiling through that area specifically, of major map changes occur, put the circles that should change in a list and iterate the list each frame with a set iteration speed.. ETC ETC...
OMG i feel like i can go ON and ON about these kinds of "tricks and cheats", i love the video man, keep it up!
Your video popping up on my feed is making me now move on and look for more videos like this because these things are such an integral part of game development its almost fundamental id say. again thanks for the vid!
Also quick FYI, i wrote this in the span of 2 min and the idea came from the top of my head, reading it again i already see things that are problematic, but i can also list how to instantly fix them lmao, ask if you are curious, im aware that its doggo poopoo as it is lmao, if u wanna use it, flesh it out or be creative and take inspiration, imma go watch more content like this 🤤
Can't wait till speedrunners find the wall clipping glitch
10:00 Ah, I've used this method before, for a filling algorithm! I just used a quad tree where each branch would check if it intersects a line of what you want to fill in, if it does then the branch is too big for the level of complexity so it will split, otherwise it will check if the center of the branch is contained in the shape using this method then fill in the whole branch if even one pixel is contained since assuming the branch doesn't intersect the lines then all pixels contained in it will be the same in terms of whether they're contained or not, and if the branch shrinks too much it will simply be rendered as an outline.
12:28 I love the summoning salt haha
also parallel universes
Haha yeah, the @SummoningSalt and @GeoWizard soundtracks are just so iconic to me.
Imagine navigating in the fourth dimension in order to get to like, burger king 😂
"I guess theres like enough layers of duck tape on this boy to keep it solid" is an amazing quote
Great video; I love seeing how others solve problems like this. Game dev is hard and we do the best we can with the tools and knowledge we have. Nothing is perfect, but that doesn't mean it doesn't work! Finishing and shipping is a huge mountain to climb, so I've got nothing but kudos for you!
Becoming a developer taught me that it’s a miracle that any game works at all. Game looks great by the way! Can’t wait to play it
perpendicular universe made me chuckle
The best practice is shipping, everything else is optimism!
11:35 You could just store a list with all the lines then do it with your own solution. Additionally, if you use your own solution then you can optimize it better, for instance, since you're only looking at the lines above the point you don't need to worry about ones to the left and right, so you can segment the X axis into an array where each segment stores all the lines in the range of the X axis it covers, by doing this you can significantly reduce the number of lines you need to check, however in a game that takes place on an infinite plane you'll have to do some clever trickery, luckily you don't have to segment consistently, a float loses precision at large ranges so your segments don't need to be smaller than the float precision meaning you can scatter your segment's unevenly, however it is still too many segments to store all at once so you can use a binary tree spanning across the entire floating point range to tell you which segments are needed to be stored at a given time. However, there is another problem, if you check for intersection and your ray lies right on a vertex between two lines then it will count twice for both lines, but this can be solved fairly easily.
„Jaywalking“ is just crossing the street. So weird that it is criminalised.
I’m breaking one of the fundamental rules: I’m not planning!
I’m making a video game driven by inspiration (the engine as a canvas) I know the story I want to tell and I’m building everything around it
PS:. I’m making videos with advances each day I could work on it. I don’t know how to get financing or exposition. I’m gonna check this channel out!
PS2:. I rather use an art product making approach that a software development one. I have not experience working with the video game industry but I’m Sr. Software developer. I’m looking for work as a tech artist (IDK the pipeline)
Oh my god that navmesh hack lmao, that's wild. I respect the hustle really
Looks like a cool game! Good job. Congrats on your release :)
i am working on a godot tile-based 3d game, for 3d godot uses gridmap(basically a 3d tilemap) but godot doesnt have gridmap autotiling, so i use an invisible tilemap, set my 3d tiles as vector2's, add a few rules by code, and translate them back to the gridmap, problem solved =)
I love this videos showing what we do sometimes to fix the problems, great job!
The first one about re-using texture for VFX… that’s just normal VFX stuff lol
With the chum one, if you're going to do string comparison better at least to do it as a tag instead of as part of the name, have a tag for "Chum" and gameObject.tag instead. But a safer way would be one of two things, you could create a marker component and add it to the Chum and check if the component exists, or better yet, properly setup physics layers, have a custom physics layer for Chum and make the collision detection have a layer filter that only allows that physics layer. Obviously as the game is done not that useful, but if you run into similar situations later.
I also noticed in your code you use a fair amount of hardcoded magic values basically, probably best to turn them into constants, that way you can name what each represents, and if you change them the change is automatically available everywhere it was used. For example say the string "Chum" was used in multiple places but later you want to rename it, you may update it in some places but forget it elsewhere.
But overall, these crimes are pretty small compared to ones other games have committed, the Chum one is the only one in this video that may give me nightmares.
Though with your out of bounds detection it seems exploitable if done well. When in bounds if the ray hits the vert corner it may incorrectly report an odd number of collisions, this is fine as you said because you perform multiple tests offset and if even a single one returns even you count it as in bounds. Well if you're out of bounds and a single ray hits the tip of a spike it would incorrectly report an even value and consider the player in-bounds.
Furthermore the next point above the player when they go out of bounds may be far from where they entered, and thus could be used to teleport up large distances if it can be reliably performed. A possibly better option would be to store the player's last in-bounds location periodically and if they're detected out of bounds put them back there. Alternatively if you want a really hacky way to do this, have locations defined within the playable space, and when out of bounds move player to the closest of those in-bound locations, though similar to the upwarping such a system may be exploitable if people can reliably trigger it.
I may or may not have committed one or more of these game dev crimes. Maybe. I refuse to elaborate on the grounds that it may incriminate me.
I don't know about Unity, but in Godot there is a "Group" system. This would allow you to put the chum into it's own "Chum" group, then you can check if any object entering the area is part of that "Chum" group and then do whatever. Similar to what you did I guess, but does prevent the naming issue if you made a new fish called "ChummyFish" or something.