Notes
This is where I keep notes for things I keep revisiting throughout my work. Entries are sorted alphabetically.
General development
When setting up an email account, make sure to enable SPF, DKIM, and DMARC to properly authenticate messages and help prevent outgoing email from being marked as spam. Use https://www.dmarctester.com to test this.
When sending email through a third party SMTP service for a Google Workspace account, “Allow per-user outbound gateways” must be enabled in the admin panel to avoid email being silently rejected.
Git
Commit without a message
git add -A && git commit --allow-empty-message -m '' && git push
Submodules
Git submodules are a nice way of setting up project dependencies.
You can add a dependency into a repo by running:
git submodule add https://github.com/marcospgp/steamworksnt.git <target-folder>
To update dependencies or download them after a fresh git clone
, use:
git submodule update --init --recursive --merge --remote
Unity game dev
Analyzers
As of 2023-10-06, and since a new Unity extension for VSCode has been released, there is no official way to support adding Roslyn analyzers for C# code (perhaps other than reverting to using Omnisharp).
There should be an official way of adding these directly in the Unity editor, but I was unsuccessful in doing so.
I may revisit this later, but at this point it might be wiser to wait for the VSCode extension to become more mature.
Animations
Importing
- “bake into pose” root transform changes that shouldn’t be applied to the gameobject on each animation.
Mixamo
Downloading animations “without skin” prevents wasting memory with unnecessary models. However, the avatar generated by Unity for these won’t work properly. That can be fixed by downloading the default Mixamo character (Y Bot) in T-pose and generating an avatar from it, which can then be used with “without skin” Mixamo animations.
Movement without foot sliding
Goal: set up player movement that is script controlled (as opposed to root motion based, for better responsiveness), but sync up animations to minimize discrepancies such as foot sliding.
- Set up blend tree
- 2D simple directional (no idle animation)
- 8 directional animations (minimize velocity difference when blending - for example, blending a forward with a sideways animation can result in diagonal movement that is slower than either of the other animations individually. Blending animation root motion is poorly documented.)
- Adjust animation speeds so that each has a resulting velocity of 1m/s
- Compute positions -> Velocity XZ
- Divide animation speed by norm of velocity
- Reset animation positions to unit circle coordinates
- Set blend tree animation direction through X and Y parameters connected to user input
- Adjust blend tree speed by setting a parameter to be equal to the player’s speed
- Transition to/from idle animation
- Idle animation cannot be in blend tree as the blend tree’s speed will be modified
- Blending between idle and movement animations is unreliable anyway in terms of resulting velocity (unpredictable, non-linear)
This is what the resulting blend tree looks like:
It may be possible to still blend between movement and other animations by nesting blend trees, although copy pasting a blend tree you previously created requires a simple workaround.
More info at https://kybernetik.com.au/animancer/docs/manual/blending/mixers/#synchronisation
Blender
Settings
- Disable saving
.blend1
files
Unity interop
- Store
.blend
files directly inside the Unity project’s “Assets” folder - There doesn’t seem to be a way to store textures in
.blend
file, so keep them in “Assets” folder and use them in both Blender and Unity
Color banding
Fix color banding by checking “enable dithering” in the camera inspector.
LODs
- Only the last LOD matters
- Impostors > LOD meshes
- Advancements like Nanite can change 3D lore fast
Based on https://medium.com/@jasonbooth_86226/when-to-make-lods-c3109c35b802
Math
Frame rate independent lerp
Use a frame rate independent form of linear interpolation instead of the default Mathf.Lerp()
.
Ready to use code should be available in the Unity utilities repo.
Multithreading
Use the SafeTask
wrapper:
- https://github.com/marcospgp/unity-utilities/blob/main/Async/SafeTask.cs
- https://marcospereira.me/2022/05/06/safe-async-tasks-in-unity/