Skip to content

Third-Party Notices Generator

Editor tooling that builds a consolidated THIRD_PARTY_NOTICES.txt from your resolved UPM packages and a curated hand-written file — so buyers can meet OSS attribution obligations without maintaining the package half by hand.

Unity: 6000.0+ — for the current engine version see package.json or CHANGELOG.md

Convenience tool, not legal advice — you own your attribution obligations. The generator automates the UPM-package half of attribution. Licenses for assets you drop into Assets/ (fonts, art, audio, .unitypackage-imported plugins) are not discovered; put those in your curated file. This tool does not guarantee legal compliance.


Overview

Piece Role
Manifest (ThirdPartyNoticesManifest) Committed source of truth: paths, product name, opt-in build flags, exclude / force-include lists
Generate menu Scans registered packages, merges curated text, writes the notices file
Package Manifest… window One checkbox per package; state mirrors the generator's include decision
Build hooks Opt-in regenerate before build + opt-in fail-if-missing/empty validator (both off by default)
Display sample the Third-Party Notices sample under Samples/ThirdPartyNotices/ — loads the file from StreamingAssets and shows it in a scroll view

This is editor tooling (like the Setup Wizard), not an IOxHeartService. There is no ServiceConfiguration toggle and no runtime API.


Quick Start

  1. Open Tools > OxHeart > Legal > Package Manifest… (creates a manifest at Assets/Legal/ on first use).
  2. Edit Curated Source Path / Output Path on the manifest if your layout differs from the defaults:
  3. Curated default: Assets/Legal/THIRD_PARTY_CURATED.txt
  4. Output default: Assets/StreamingAssets/THIRD_PARTY_NOTICES.txt (matches the sample)
  5. Put buyer-owned licenses (fonts, art, etc.) in the curated file. The Generate menu creates a stub curated file if it is missing.
  6. Run Tools > OxHeart > Legal > Generate Third-Party Notices.
  7. Optionally enable Regenerate On Build and/or Validate On Build on the manifest.
  8. To show the file in-game, import the Third-Party Notices sample or copy its load pattern.

What gets included

Include decision, in order:

  1. Force-include list → always included
  2. Built-in modules (PackageSource.BuiltIn) → dropped
  3. Exclude list (exact name or trailing .* wildcard, e.g. com.unity.ide.*) → dropped
  4. Otherwise → direct dependencies only (transitives omitted)

Default excludes (editable on the manifest): com.unity.ide.*, com.unity.collab-proxy, com.unity.test-framework, com.unity.ext.nunit, games.moomoo.oxheart.

License text is read from the package root, probing in order: LICENSE.md, LICENSE.txt, LICENSE, Third Party Notices.md. Packages included but with no discoverable license are listed in a trailing "review manually" footer — they do not get an empty section.


Manifest window

Tools > OxHeart > Legal > Package Manifest…

  • One checkbox per resolved package; checked state is exactly IsIncluded (direct / transitive / module + LICENSE present shown in the row).
  • Unchecking adds the package to Excluded; checking removes it from Excluded and force-includes only when it would still be dropped (module or transitive).
  • Generate Notices runs the same pipeline as the menu item.

Opt-in build flags

Both flags default to false. Enabling them is a deliberate buyer choice:

Flag When on
Regenerate On Build Rewrites the notices file in a pre-build step (order −100)
Validate On Build Fails the build if the output path is missing or empty (order 0)

Output format

PRODUCT NAME THIRD-PARTY NOTICES
================================

<curated block, if any>

----------------------------------------
PACKAGE: com.example.pkg
----------------------------------------
<license text>

Packages with no discoverable license — review manually:
- com.example.no-license

Product name comes from Product Name Override on the manifest, or Application.productName when that field is empty.


Risks (read these)

  1. Package half only. Loose Assets/ licenses stay in your curated file.
  2. Not legal advice. No warranty of compliance.
  3. Shallow license probe. Only the four root filenames above are read; unusual layouts need a curated entry or a force-include plus manual text in curated.
  4. .unitypackage install. If OxHeart was imported as a .unitypackage rather than UPM, games.moomoo.oxheart will not appear in the package list (the default self-exclude is harmless).

  • Editor Menu Reference — menu paths
  • Third-Party Notices sample under Samples/ThirdPartyNotices/ — in-game display reference (ThirdPartyNotices.unity is camera + component only; no engine initializer)