【Unity】自作のC#ライブラリをパッケージマネジャーでインポートできるようにするには

2024年5月30日

Unityで自作のC#ライブラリをパッケージマネージャーでインポートできるようにするには、Unityのパッケージ形式に従ってパッケージを作成し、それを適切な場所に配置する必要があります。以下の手順に従って進めてください。

制作者側

制作用のUnityエディタを起動して、Assetsフォルダの下に評価テスト用のフォルダを作りこれをgithubにアップして、使用者に使ってもらいます

1. パッケージの構造を作成する

まず、Unityのパッケージの標準的なディレクトリ構造をAssetsフォルダ下に作成します。

MyLibrary/
│
├── package.json
├── MyLibrary.asmdef
├── README.md
├── LICENSE.md
├── Editor/
│   └── MyLibraryEditorScript.cs
└── Runtime/
    └── MyLibraryRuntimeScript.cs
  • package.json: パッケージのメタデータを含むファイル。
  • MyLibrary.asmdef: アセンブリ定義ファイルです。このファイルにより、Unityがどのスクリプトを同じアセンブリ(コンパイル単位)として扱うかを定義します。
  • README.md: パッケージの説明と使用方法。
  • LICENSE.md: パッケージのライセンス情報。
  • Editor/: エディター用スクリプトを含むフォルダー。
  • Runtime/: ランタイム用スクリプトを含むフォルダー。

2. package.jsonを設定する

package.json ファイルを作成し、以下の内容を記述します。このファイルはパッケージのメタデータを定義します。

{
  "name": "com.yourname.mylibrary",
  "version": "1.0.0",
  "displayName": "My Library",
  "description": "A description of my library.",
  "unity": "2020.3",
  "author": {
    "name": "Your Name",
    "email": "your.email@example.com",
    "url": "http://yourwebsite.com"
  }
}

name:

  • 説明: パッケージの一意の識別子です。通常は逆ドメイン形式(com.companyname.packagename)を使用します。
  • "com.yourname.mylibrary"

version:

  • 説明: パッケージのバージョン番号です。セマンティックバージョニング(major.minor.patch)の形式に従います。
  • "1.0.0"

displayName:

  • 説明: Unityパッケージマネージャーに表示されるパッケージの名前です。ユーザーに対してわかりやすい名前を設定します。
  • "My Library"

description:

  • 説明: パッケージの概要説明です。パッケージの機能や用途を簡潔に記述します。
  • "A description of my library."

unity:

  • 説明: パッケージがサポートする最低Unityバージョンを指定します。特定のバージョン以上のUnityで動作することを示します。
  • "2020.3"

author:

  • 説明: パッケージの作成者に関する情報を含むオブジェクトです。
  • name:
    • 説明: 作成者の名前です。
    • "Your Name"
  • email:
    • 説明: 作成者のメールアドレスです。
    • "your.email@example.com"
  • url:
    • 説明: 作成者のウェブサイトURLです。作成者に関する追加情報を提供します。
    • "http://yourwebsite.com"

3.MyLibrary.asmdefを設定する

アセンブリ定義ファイルを作成します

下記はサンプルで、未設定のところはデフォルト値が使われます
後述のUnityエディタでの作成では、"name"項目のみ作成されることになります

{
  "name": "MyLibrary",
  "rootNamespace": "MyLibrary",
  "references": [],
  "includePlatforms": [],
  "excludePlatforms": [],
  "allowUnsafeCode": false,
  "overrideReferences": false,
  "precompiledReferences": [],
  "autoReferenced": true,
  "defineConstraints": [],
  "versionDefines": [],
  "noEngineReferences": false
}

以下は、Unityのアセンブリ定義ファイル(.asmdef)に関する設定項目の詳細説明です。このファイルは、Unityがどのスクリプトを同じアセンブリ(コンパイル単位)として扱うかを定義します。

インスペクターから作成すると、デフォルトで"name"項目のみが列挙されます
他の情報は、デフォルトの情報を使っているため

各項目の詳細説明

  1. name:
    • 説明: アセンブリの名前を指定します。この名前は、アセンブリの一意の識別子として使用されます。
    • "MyLibrary"
  2. rootNamespace:
    • 説明: アセンブリ内のスクリプトがデフォルトで属するネームスペースを指定します。これにより、スクリプトファイルごとにネームスペースを手動で設定する手間を省くことができます。
    • "MyLibrary"
  3. references:
    • 説明: このアセンブリが依存する他のアセンブリをリストします。依存関係にあるアセンブリの名前を含めます。
    • ["AnotherAssembly"]
    • デフォルト[](空のリスト)
  4. includePlatforms:
    • 説明: このアセンブリが含まれるプラットフォームを指定します。特定のプラットフォーム向けにアセンブリを制限したい場合に使用します。
    • ["Editor", "Windows", "iOS"]
    • デフォルト[](空のリスト)
  5. excludePlatforms:
    • 説明: このアセンブリから除外するプラットフォームを指定します。特定のプラットフォームでアセンブリを使用しない場合に使用します。
    • ["Android", "Linux"]
    • デフォルト[](空のリスト)
  6. allowUnsafeCode:
    • 説明: このアセンブリ内で「unsafe」コードを許可するかどうかを指定します。「unsafe」コードは、ポインタを使用するなどの特別な操作を含むC#コードです。
    • trueまたはfalse
    • デフォルトfalse
  7. overrideReferences:
    • 説明: Unityのデフォルトのアセンブリ参照を無効にし、カスタムの参照を使用するかどうかを指定します。
    • trueまたはfalse
    • デフォルトfalse
  8. precompiledReferences:
    • 説明: プリコンパイル済みのアセンブリ(.dllファイル)をリストします。このアセンブリが参照する必要がある外部のプリコンパイル済みアセンブリを指定します。
    • ["path/to/precompiled.dll"]
    • デフォルト[](空のリスト)
  9. autoReferenced:
    • 説明: このアセンブリが自動的に他のアセンブリから参照されるかどうかを指定します。このオプションをfalseに設定すると、明示的に参照を追加しない限り、このアセンブリは他のアセンブリから参照されません。
    • trueまたはfalse
    • デフォルトtrue
  10. defineConstraints:
    • 説明: このアセンブリが有効になる条件を定義するためのプリプロセッサディレクティブをリストします。指定されたディレクティブが定義されている場合にのみアセンブリが有効になります。
    • ["DEBUG", "UNITY_EDITOR"]
    • デフォルト[](空のリスト)
  11. versionDefines:
    • 説明: パッケージのバージョンに基づいて有効になる条件を定義します。特定のバージョン以上のパッケージが存在する場合にのみ、アセンブリが有効になります。
    • :
    • デフォルト[](空のリスト)
[
  {
    "name": "com.unity.somepackage",
    "expression": "1.2.3",
    "define": "SOME_PACKAGE_1_2_3"
  }
]

このアセンブリ定義ファイル(.asmdef)により、Unityプロジェクト内でスクリプトのコンパイルと依存関係の管理を効率化できます。これにより、プロジェクトのビルド時間が短縮され、特定のプラットフォームや条件に応じたカスタムアセンブリの作成が可能になります。

4. スクリプトを作成する

次に、RuntimeフォルダーとEditorフォルダーに必要なC#スクリプトを追加します。

Runtimeスクリプト例

Runtime/MyLibraryRuntimeScript.cs

namespace MyLibrary
{
    public class MyLibraryRuntimeScript
    {
        public void DoSomething()
        {
            // Your runtime code here
        }
    }
}

Editorスクリプト例

Editor/MyLibraryEditorScript.cs

using UnityEditor;

namespace MyLibrary
{
    [CustomEditor(typeof(MyLibraryRuntimeScript))]
    public class MyLibraryEditorScript : Editor
    {
        public override void OnInspectorGUI()
        {
            // Your editor code here
        }
    }
}

自作のC#ライブラリを他の開発者に配布するためには、いくつかの方法があります。以下はその手順です。

5. GitHubにホスティング

GitHubにパッケージをホスティングし、Unityのパッケージマネージャーで直接インポートできるようにする方法です。

MyLibraryフォルダ以下をGit管理します

GitHubDedkTopにMyLibraryフォルダをドラッグ&ドロップし、リポジトリを作成します

新規のリポジトリ作成画面で、.gitignoreファイルは、none未選択(Unityを選択する必要はありません)

上記の手順詳細については省略します

GitHubへパブリッシュ

リポジトリ名をMyLibraryとして、GitHubへパブリッシュします

リポジトリをpublic(公開)にします

PrivateであればPublicへ変更します

Unityで自作パッケージをGitHubからインストールする際に、パッケージが配置されるリポジトリがパブリックである必要はありませんが、プライベートリポジトリを利用する場合には、いくつかの追加手順が必要です。

パブリックリポジトリの場合

パブリックリポジトリを使用する場合は、特に追加の設定なしでUnity Package Managerからインストールできます。

  1. パッケージの作成:
    • パッケージのルートフォルダにpackage.jsonを配置し、必要なメタデータを記述します。
    • 他の必要なファイル(スクリプト、アセットなど)を配置します。
  2. GitHubリポジトリにアップロード:
    • GitHubに新しいリポジトリを作成し、作成したパッケージをアップロードします。
  3. Unityにインストール:
    • UnityエディタのWindow > Package Managerを開き、左上の+ボタンをクリックしてAdd package from git URL...を選択します。
    • リポジトリのURLを入力します(例: https://github.com/username/repository)。

プライベートリポジトリの場合

プライベートリポジトリを使用する場合は、アクセス権限を設定し、Unity Package Managerに認証情報を提供する必要があります。

  1. GitHubパーソナルアクセストークンの作成:
    • GitHubの設定で、パーソナルアクセストークン(PAT)を作成します。必要な権限(repoなど)を付与します。
  2. パッケージの作成とアップロード:
    • パブリックリポジトリと同様にパッケージを作成し、プライベートリポジトリにアップロードします。
  3. Unityの設定ファイルを編集:
    • UnityプロジェクトのルートにPackages/manifest.jsonファイルを開き、以下のように依存関係を追加します。
{
  "dependencies": {
    "com.example.mypackage": "https://github.com/username/repository.git#branch-or-tag"
  }
}

認証情報の設定:

  • Unity Package Managerに認証情報を提供するために、Gitの認証ヘルパーを設定します。
  • コマンドラインで以下を実行し、GitHubのPATを入力します。
git config --global url."https://<PAT>@github.com/".insteadOf "https://github.com/"

これで、Unity Package Managerはプライベートリポジトリからパッケージをインストールできるようになります。

まとめ

  • パブリックリポジトリの場合は特に追加の設定なしでインストール可能です。
  • プライベートリポジトリの場合は、GitHubのパーソナルアクセストークンを使用して認証情報を設定する必要があります。

これにより、GitHub上の任意のリポジトリからUnityパッケージをインストールすることが可能になります。

使用者側

パッケージマネージャからインストール

パッケージマネージャを開きます

+記号をクリックし、Install package from git URL…を選択します

入力欄に次のURL と.gitを足したのを入力し、インストールします

https://github.com/アカウント名/MyLibrary.git

旧バージョンのUnity

新バージョンのUnity

使い方

ライブラリのコードには、namespaceブロックを追加していますので、インストール後は、次のように使えます

using UnityEngine;
using MyLibrary;

public class ClassName : MonoBehaviour
{
    void Start()
    {
        // ここにコードを記述
    }
}

具体的な手順をサンプルチュートリアルを通して学習しましょう

では、実際に進めてみましょう

製作者側

MyLibraryPackageフォルダを作成

Assets/
└── MyLibraryPackage/

package.jsonの作成

上記のサンプルコードでテキストエディタで作成します

Windowsでは、エクスプローラでMyLibraryPackageフォルダに移動してメモ帳で作成するといいでしょう

直接、Unityエディタ上でCreateすると、スクリプトとして作成されますので、これを回避します

Assets/
└── MyLibraryPackage/
    │
    └── package.json

MyLibrary.asmdefの作成

Assets/
└── MyLibraryPackage/
    │
    ├── package.json
    └── MyLibrary.asmdef

プロジェクトウィンドウMyLibraryPackageフォルダ下で作成します

旧バージョンのUnity

新バージョンのUnity

ファイル名はMyLibrary.asmdefとします

次のようにインスペクタ上でなっていれば、ファイルは自動作成済みです

郵便番号をチェックしてくれるライブラリの作成

今回は、入力された郵便番号が正しいかをチェックして、bool型で返すライブラリを作成したとします

Runtimeスクリプト例

Assets/
└── MyLibraryPackage/
    │
    ├── package.json
    ├── MyLibrary.asmdef
    └── Runtime/
        └── PostalCodeValidator.cs

Assets/MyLibraryPackage/Runtime/PostalCodeValidator.cs

using System.Text.RegularExpressions;

namespace MyLibrary
{
    public class PostalCodeValidator
    {
        public static bool IsValidPostalCode(string postalCode)
        {
            // 日本の郵便番号の形式をチェックする正規表現
            string pattern = @"^\d{3}-\d{4}$";

            // 正規表現を使って郵便番号が正しい形式かどうかをチェック
            return Regex.IsMatch(postalCode, pattern);
        }
    }
}

使用する側スクリプト例

Assets/
└── CheckPostCode.cs

Assets/CheckPostCode.cs

using UnityEngine;
using MyLibrary;

public class CheckPostCode : MonoBehaviour
{
    void Start()
    {
        Debug.Log(PostalCodeValidator.IsValidPostalCode("123-123"));
        Debug.Log(PostalCodeValidator.IsValidPostalCode("123-1234"));
    }
}

実行してテスト

実際に実行して、コンソール画面に正しい結果が表示されるか確認します

Githubへのパブリッシュ

コミット後、パブリッシュして、Githubを更新します

(オプション)オブジェクトの移動をJoyStick入力されたデータで返してくれるライブラリの作成

JoyStick(またはキーボード)入力を受け付け、JoyStickを倒した方向をベクトルで返してもらいます
引数で進む強さを渡すことができます

Runtimeスクリプト例

Assets/
└── MyLibraryPackage/
    │
    ├── package.json
    ├── MyLibrary.asmdef
    └── Runtime/
        └── PostalCodeValidator.cs
        └── Movement.cs

Assets/MyLibraryPackage/Runtime/Movement.cs

using UnityEngine;

namespace MyLibrary
{
    public static class Movement
    {
        // プレイヤーの移動入力を取得し、移動ベクトルを返す
        public static Vector3 KeyMoveVector(float speed)
        {
            // 入力を取得
            float moveX = Input.GetAxis("Horizontal");
            float moveY = Input.GetAxis("Vertical");

            // 移動ベクトルを作成
            return new Vector3(moveX, moveY, 0f) * speed * Time.deltaTime;
        }
    }
}

使用する側スクリプト例

Assets/
└── Move.cs

Assets/Move.cs

using MyLibrary;
using UnityEngine;

public class Move : MonoBehaviour
{
    float speed = 5f;

    void Update()
    {
        transform.Translate(Movement.KeyMoveVector(speed));
    }
}

使用者側

パッケージマネージャを開きます

+記号をクリックし、Install package from git URL…を選択します

入力欄に次のURL と.gitを足したのを入力し、インストールします

https://github.com/アカウント名/MyLibrary.git

上記、使用する側と同じでいいですね

郵便番号チェック

Assets/
└── CheckPostCode.cs

Assets/CheckPostCode.cs

using UnityEngine;
using MyLibrary;

public class CheckPostCode : MonoBehaviour
{
    void Start()
    {
        Debug.Log(PostalCodeValidator.IsValidPostalCode("123-123"));
        Debug.Log(PostalCodeValidator.IsValidPostalCode("123-1234"));
    }
}

(オプション)オブジェクトの移動

Assets/
└── Move.cs

Assets/Move.cs

using MyLibrary;
using UnityEngine;

public class Move : MonoBehaviour
{
    float speed = 5f;

    void Update()
    {
        transform.Translate(Movement.KeyMoveVector(speed));
    }
}

Unity

Posted by hidepon