A downloadable game

Download NowName your own price
Random stuff that I made for some school projects, mainly based on the standard unity 2D platformer kit, and a very-very early prototype of my swordfighting sim




Project C...

For the build of Project C please scroll down to the very bottom.

Controls: 

  • Esc... Pause
  • WASD... move
  • QE... look left/right
  • Space... jump
  • Mouse... look up/down; control the sword
  • Tab... Lock camera movement to allow mouse recalibration




Devlog...

Date: 2.3.2022

Activity:

- I already had Unity installed 

- Created the project

- Modified according to tutorials


Notes:  I totally forgot about the HW and had to do all of it after midnight at the final day - try to avoid that next time. Due to the state I'm in while writing this, it proves to be really difficult to come up with any other constructive criticism or anything.

Invested hours: 

Tutorials: 40 min

Setting up itch.io page: 10 min

Writing devlog: 20 min


Outcome: I'm totally dead and not well prepared for the next lecture, otherwise everything is ok





Date: 6.3.2022

Activity: Creating level in 2D Game Kit

Notes: 

- Creating a level in Unity is really tedious for an unexperienced man - many inconveniences that do add up (eg. having two Project panels open is buggy; sometimes hard to select the whole gameobject and not its subcomponent by clicking in Scene view; scene hierarchy quickly becomes messy;... ); also many things that seem simple turn out to be actually really complex only for me to find out there was an easy solution afterall after I have already wasted lot of time implementing the difficult one (eg. making the background roll slower than the character movement so that it looks interesting and doesn't run out when the level is long - there was no easy way to tie its transform to the transform of the camera (produced unbearable shaking because the camera itself has its position controlled by some strange black magic) but then I found out by random experimenting that it's enugh to just set its position to far away and compensate that by increasing the scale)

- I haven't played many 2D platformers and those that I did didn't seem much fun to me so it's quite difficult to make a fun 2D platformer

Invested hours: 

Creating the level: 5 h

Analyzing the prebuilt levels: 30 min

Writing devlog: 40 min


Outcome: Don't know, I hope it somehow counts as finished homework. From the beginning I've been out of inspiration so this is the best anyone will get from me



Date 13.3.2022

Activity: Creating one page design document for level 1

Notes: Unexpectedly difficult to insert images into Adobe Sketchbook workspace - easier to not do it and just let  everything be a crappy hand drawing

Invested hours: 1h

Outcome: Finished first few sections concerning player character. Decided the style I want to go for with the document (seems as acceptable compromise between quality and time demandingness to me).


Date 14.3.2022

Activity: Creating one page design document for level 1

Notes: Going through the desing inspired me to increase the mellee strike dash force and smallify Spitter enemies

Invested hours: 2.5h

Outcome: Finished 1st draft of the design doc 



Date 30.3.2022

Activity: Finishing the Scripting Walktrough - powerup, animations, ...

Notes: 

I spent much more time on this task than I expected to, and even then, I have a feeling I barely scratched the surface and didn't use the things from the tutorial in any particularly interesting way. So much time was spent just figuring out why something doesn't work.

Coroutines...

- They tend to just refuse to continue (WITHOUT ANY WARNING) when the GameObject owning them is destroyed (wasted cca 40 mins figuring that out) 

- Why the f**k are they weakly typed?! (Why not force IEnumerator<YieldInstruction>?) If I choose to use IEnumerator<T>, does Dispose() get called at the end? How did anyone come up with that brilliant idea to use yield return null (seriously this is so hostile to any normal person who figures things out mainly by browsing through intellisense docs)?

- It's nice that I can call another coroutines from a coroutine by just iterating through them and yielding all their 'return values'. 

- Overall I can't deny it's really useful to have something like this at my disposal, though I do not like some things about the particular way it is implemented.


Animations...

- They seem really powerful, but the GUI for them is not much beginner friendly. There's a lot of things that seem to behave randomly (e.g. Inspector panel for Animation Event has two different modes (just dropdown for function name / text field for function name + int, float,etc. variables) and I can't figure out  what I am supposed to do different to control which of them opens; Key frame editor is also strange, I can do basic things with Curve editor in a way so that they work in game but totally can't understand the Dopesheet panel)

- Animations with speed other than 1 (e.g. 0) don't behave always nice (also something I spent a lot of time debugging)

- The animation state machine seems quite ok

- Setting up Animation Event was real pain. In the tutorial, you just say to "add an Animation Event to the animation which will call our callback" without any additional explanation how the callback will be found and invoked. As we are in a strongly typed language, having a callback defined by a function name written in a string is (at least for me) literally the last thing I would ever expect :D. Only after I wasted much time by trying every other possibility that I thought made sense and examining the official docs (only to find out they are just as vague as the tutorial :D ) did I began to consider the possibility that maybe that Function Name field isn't just an identifier for recognizing the AnimEvent while debugging or something like that. 

- Had to add an additional check for Renderer.isVisible - otherwise the sound effect would play no matter where on the map the player is which was quite annoying

Invested hours: 3.5h (21:30 tue - 1:00 wed) + 1.5h (1:00 - 2:30) writing devlog

Outcome: Finished the mandatory part of the Scripting Walktrough


Date 10.4.2022

Activity: Implementing  the design doc - Intro part

Notes:  Nice that in the design doc, I only put a wery rough idea of the level overlay. I think the details are much better left for improvisation than if all of them were pre-planned in the doc. When I think about it, even if I had wanted to have a design doc with such level of detail, I would first prototype everything in Unity anyway, playtest it etc. and then just rewrite that into the doc (because Unity is just so much more flexible and pleasant to use in this usecase than a general purpose graphics editor, not mentioning how priceless the option to playtest is).

Invested hours: 4h

Outcome: First draft of the first few segments of the level is somehow complete


Date 19.4.2022

Activity: Implementing the design doc - the rest ( +  polishing the Intro)

Notes:

- Tile drawer does become incredibly slow and laggy as soon as the level gets a bit complex

- Passthrough platforms are bul***it - they just don't work reliably out of the box and I wasn't able to come across any way to remedy that (tried approach with second Trigger-hitbox that selectively disabled collisions for objects that hit it, but it seems Physics2D.IgnoreCollision() I used for that just doesn't even do what it's meant to :D ). For now just left them as is and hoping to fix them in the future. Their current state makes the Big Arena really quite hardcore (tested to be finishable, but totally not on first try)

- Discovered quite an elegantly hacky way to refresh enemies on player death:

Each arena must be organized to have a single parent object. The parent is disabled by default and serves as a template. A Refresher object references the template and creates its instances (just `Object.Instantiate(template).SetActive(true)`). It keeps track of the current one and when it's requested to reload it, it just Destroys the current one and Instantiates the template again. Here, for simplicity, the request is made just by entering a trigger hitbox that's positioned in a smart way so that only way to trigger it is when respawning.

Invested hours: 13h (nonstop cca 13:00 P.M. - 2:00 A.M.)

Outcome:

- The whole design doc should now be implemented, the game seems playable, was tested to be finishable

- I'm completely exhausted, no energy left for writing detailed log


Date: 7.-9.8.2022

Activity: Experimenting with active ragdolls

Notes: Spent three days experimenting with active ragdolls while heavily procrastinating and overall fighting with motivation issues. I had this grand idea for Project C that it could be cool to make a physics-based swordfighting game with quirky controls, where one could chop of his opponent's limbs and something.

The physics part was going well - I was no problem able to create a rigidbody humanoid figure that copied movement of a non-physics animated model, but the big problem turned out to be I still need to animate that model figure and have no idea how to do that, neither time left to learn :D Preanimated models on Asset Store all used some SkinnedRenderer thing which didn't seem to go well at all with the idea of being chopped into individually existing pieces during fight.

So I rather scrapped everything.

Maybe next time it might be not such a bad idea to start work on a 3week project earlier than the last few days before deadline.

Invested hours: can't really tell because of all the procrastination that happened during work but something like 3x 5hours = 15hours  probably could be a reasonable estimate, though much of that time wasn't  a heavily focused work

Outcome: Gained valuable knowledge and experience with Unity's physics but not much progress for Project C


Date 10.8.2022

Activity: Creating Project C - Some kind of physics-based puzzle game focused on destroying environment with a sword

Notes: Had to scrape together something to qualify for the project preview in single day because I was id**t and scrapped the idea I had worked on before as too megalomaniac at the last moment. So I just took the bachelor thesis swordfight demo in the state that it currently was in and threw it together with some random stuff to create something distantly resembling a game level.

The current version only contains a most basic intro into few game mechanics (drawbridges and cannonball-shooting-punch-boxes) and a single very simple puzzle at the end. In the version I'll be working on during the additional week, I most definitely want to add more puzzles where the current mechanics will interact with each other in more interesting ways and new ones would be introduced (drawbridge falling over a punchbox to activate it; ropes with cuttable segments; test cubes; ... ).

It would be nice if I managed to implement a way to generate an iron chain of arbitrary length connecting two bodies programmatically - that would give me much more flexibility with drawbridge puzzles.

I also need to implement a death screen and add some sounds so that the game feels a bit friendlier. I was afraid I'd waste a lot of time if I tried to deal in any way with TextMeshPro so that's why the current endscreen is how it is :D .

Also noteworthy is the fact that I actually had to quite heavily tweak the sword so that it would work reasonably with other objects (Turns out collisions between two rigidbodies behave really strange when one rigidbodybody has weight 1 and the second 10e6). The physics overall are funny - in the  final puzzle for example, the final punchbox requires different rotation to be able to hit the drawbridge pillar depending on whether I run Unity editor preview or a final build :D

Invested hours: 14h (10:30 A.M. - 0:30 A.M. , only small breaks for eating something etc.) implementing + 1:30h writing devlog

Outcome: a demo for Project C 


Date: 14.5.2022

Activity: Project C - (futile) attempt to implement automatic chain generation

Notes: Made some progress - put together the idea how to do it and some of the math equations needed - but in the end it was quite complicated and I got bored and had other stuff to do so I rather gave up. 

Invested hours: 2h

Outcome: Decision to not use automatic chain generation


Date: 17.5.2022

Activity: Project C - polishing, implementing baseball room, sound design,...

TODO: Write this devlog entry


Date: 18.5.2022

 Activity: Project C - polishing, composing music,...

TODO: Write this devlog entry


Date: 12.6.2022

Activity: Trying to remember and finish the last devlogs

Notes: Postponed too long, I can't remember anything

Invested hours: 10 min

Outcome: Total failure

Download

Download NowName your own price

Click download now to get access to the following files:

hw1-build.7z 21 MB
hw2-onePlatformerLevel.7z 51 MB
DesignDocument-first_draft.png 6 MB
DesignDocument-classmate_feedback_applied.png 6 MB
hw-onePlatformerLevel-withPowerupEtc.7z 52 MB
BigHW2-FirstPrototype.7z 52 MB
BigHW2-Final.7z 45 MB
ProjectC_demo.7z 21 MB
ProjectC_final.7z
ProjectC_trailer.mp4 13 MB