Getting started

On this page

Every Gully Studio game starts from gully-labs/gully-studio-unity-template, a Unity 6 LTS project with the studio's version-control, package and CI conventions already set.

Heads up

The template and every repo created from it are private. Gully Studio games use Unity Asset Store content, which may ship inside a built game but must never be redistributed as source. The template's hygiene CI fails if the repo is public. See Asset Store licence.

#1. Create the repo

On GitHub, open gully-labs/gully-studio-unity-template, choose Use this template, and create a private repository under the gully-labs organisation.

#2. Clone with Git LFS

Binaries (textures, models, audio, video, fonts, plugins, archives) are stored in Git LFS. Install LFS once per machine before you clone:

Shell
git lfs install
git clone https://github.com/gully-labs/<your-game>.git
cd <your-game>

#3. Register UnityYAMLMerge

Scenes and prefabs are merged with Unity's Smart Merge tool, which understands Unity YAML. .gitattributes already marks them with merge=unityyamlmerge; each clone registers the merge driver once:

Shell
# macOS, Linux, Git Bash
./Tools~/setup-merge-tool.sh
Shell
# Windows PowerShell
./Tools~/setup-merge-tool.ps1

docs/unityyamlmerge.md in the repo explains the setup and how to resolve a conflict by hand.

#4. Open in Unity 6 LTS

Open the folder with Unity Hub, using exactly the editor version in ProjectSettings/ProjectVersion.txt. CI builds with the same version (unityci/editor image), so a different local editor causes needless diffs.

On first open, Unity generates the rest of ProjectSettings/ and Packages/packages-lock.json. Commit both:

Shell
git add ProjectSettings Packages/packages-lock.json
git commit -m "Unity first open: generated settings and package lock"

The template enforces two settings and re-applies them if they drift (Assets/_Project/Scripts/Editor/ProjectRulesCheck.cs):

Setting Value Why
Asset serialization Force Text scenes and prefabs diff and merge as text
Version control mode Visible Meta Files every asset carries its .meta in git

#5. Name the game

In Project Settings > Player, set the product name and the bundle id xyz.gullystudio.<game>, then commit.

#6. Add the CI secrets

Open Settings > Secrets and variables > Actions in the repo and add these secrets. Nothing in the repo holds them, and they must never be committed.

Secret What
UNITY_EMAIL, UNITY_PASSWORD the Unity account that owns the licence
UNITY_SERIAL Unity Pro or Unity Industry serial, required for an organisation above the Personal revenue threshold
UNITY_LICENSE contents of a Personal .ulf file, an alternative to the serial while prototyping
ANDROID_KEYSTORE_BASE64, ANDROID_KEYSTORE_PASS, ANDROID_KEYALIAS_NAME, ANDROID_KEYALIAS_PASS Android release signing, optional until a store build

Then set the repository variable UNITY_CI to true. Every Unity job in CI is gated on it, so a fresh repo does not use runner minutes before the licence exists.

#7. Push

Push to main. Two workflows run:

Workflow Needs a licence What it does
hygiene.yml No checks the repo is private, settings match, binaries are in LFS, and no .unitypackage or .ulf file is committed
unity.yml Yes (UNITY_CI=true) EditMode and PlayMode tests, then builds for Windows, Linux (dedicated server), Android and WebGL

See Release and CI for targets, artifacts and runners.

#Folder layout

Text
Assets/
  _Project/            everything the studio writes (sorts first)
    Scenes/            one scene per level or screen
    Scripts/Runtime/   GullyStudio.Runtime.asmdef
    Scripts/Editor/    GullyStudio.Editor.asmdef (editor tools, rule checks)
    Prefabs/  Art/  Audio/  Settings/  Netcode/
  ThirdParty/          Asset Store packages, one folder each, listed in its README
  Tests/               EditMode and PlayMode test assemblies
Packages/manifest.json
ProjectSettings/
Tools~/                merge-tool setup, .meta generator (Unity ignores folders ending in ~)
docs/

#Never commit

Unity's working folders are in .gitignore and stay out of git: Library/, Temp/, Obj/, Build/, Logs/, UserSettings/. Licence files (.ulf), keystores and API keys never go in the repo either.

#Next