🍏

UnityでOpenApi Generatorを使ってみる

に公開

https://www.docswell.com/s/torisoup/ZRX7ER-2023-12-10-160647#p33
こちらを参考に進める
これの通りで動くようになる

環境

mac: Apple M2 Max
untiy: 6 (6000.0.38f1)
openapi-generator-cli: 7.12.0 (generatorはcsharp)

手順

1. openapi-cliの準備

今回はnpmでインストールしたものを使う

npm i -g openapi-generator-cli

2. specとconfigからコードを生成する

openapi-generator-cli generate -i <specのjsonかyml> -g csharp -o <出力先> -c <config (--additional-propertiesで設定しても良い)>

筆者はこんなscriptなりました
色々docとか不要なものも生成されるので、Temp以下に出力してから必要なフォルダのみをAssets/Plugins/以下に移動させてます。

openapi-generator-cli generate -i https://******.com/api-json -g csharp -o Temp/Api -c api-generate-config.json
mv Temp/Api/src/Client Assets/Plugins
rm -rf Temp/Api
  • api-generate-config.json
{
  "library": "restsharp",
  "optionalAssemblyInfo": true,
  "optionalProjectFile": false,
  "packageName": "Client",
  "targetFramework": "netstandard2.1",
  "validatable": true
}

httpclientはいくつか選べますが、restsharpが良さそうです。
targetFrameworkはunityで使用しているバージョンを指定 (ProjectSettings->Player->OtherSettings->Configrationに記載があります)
設定できる項目については以下を参照
https://github.com/OpenAPITools/openapi-generator/blob/v7.12.0/docs/generators/csharp.md

3. dllの追加

このままだと、依存するdllがいくつか足りないので、追加していく
※今回はnetstandard2.1用に必要なものを追加しています。
そのため、netstandard2.0や.Net framework**などでは追加のpackageがあるかもしれないです。

  • Newronsoft Json
    unityのpackage managerから追加できる
  • RestSharp
    NuGetで検索すると見つかる


https://www.nuget.org/packages/RestSharp/112.1.1-alpha.0.4

ここのDownload packageからダウンロードしたものにdllが入っている

そのままだと回答できないので、.nupkgを.zipに書き換えて開く
中のlibの下にdllがあるので、unityのproj内にコピーする

  • RestSharpの依存

https://www.nuget.org/packages/System.ComponentModel.Annotations
https://www.nuget.org/packages/System.Text.Json/
https://www.nuget.org/packages/System.IO.Pipelines/
https://www.nuget.org/packages/System.Text.Encodings.Web/

  • Polly関係

https://www.nuget.org/packages/Polly

https://www.nuget.org/packages/Polly.Core/

https://www.nuget.org/packages/Microsoft.Bcl.AsyncInterfaces/

https://www.nuget.org/packages/Microsoft.Bcl.TimeProvider

他にも必要なpackageあればNuGetなどから探してプロジェクトに追加してください

試用

private async Task Init()
{
    var config = new Configuration();
    config.BasePath = "https://****.com";
    var api = new V0Api(config);
    var res = await api.FindAllWithHttpInfoAsync();
    Debug.Log(res.StatusCode); // OK
}

operationや、apiのcall方法もいくつか用意されていて便利そうでした。

Discussion