5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UnityでContentfulを使いたいなら

Last updated at Posted at 2022-04-18

image.png

UnityでContentfulを使う方法をいろいろ試してみました!

Contentfulとは?

Contentfulとは、ヘッドレスCMSとしておそらくもっとも有名なサービスです。

ヘッドレスCMSとは、コンテンツを管理することに特化したクラウドサービスです。

Webのフロントエンド側からは、WebAPIを介して利用できます。

たとえば、弊社の STYLY Studio というサイトには、以下のように STYLYアセット というもののリストを閲覧できるページがあります。

これらの

  • サムネイル
  • タイトル(Change Texture Torus と記載されている箇所)
  • 説明文(You can change the image, ... と記載されている箇所)

といった情報をContentfulで集中管理しています。

image.png

Windowsアプリなら contentful.net が便利

Unityに限らず、Windowsアプリを開発する際には、公式にNuGetパッケージが公開されているので、これを利用しましょう!

Contentful.net - Contentful .NET Library

このライブラリには、クライアントとして必要なクラス・メソッドがすべて定義されていてとても便利です!

ただし、 contentful.net はUnity用ライブラリではありませんので、Unityで使えるようにするには一手間加える必要があります。

UnityのWindowsビルドから contentful.net を使う

contentful.net はNuGetパッケージですので、これをUnityで使えるようにするには準備があります。

まず、NuGetから contentful.csharp を入手してください。

次に、Visual Studioで Contentful.Core.dll を生成してください。

最後に、 Contentful.Core.dll をUnityの Plugins フォルダー配下に設置します。
これで、Unity側のC#から Contentful.Core という名前空間へアクセスできるようになります。

image.png

NuGetパッケージをUnityに導入する詳しい方法は、以下がわかりやすかったので、よくわからなければ、合わせてご参照ください。

【Unity】AngleSharpをUnityに導入してみた

たとえば、エントリー(Contentful内のコンテンツ単位)の一覧を取得する時のコードはこんな感じです。(サンプルコードなので、細かいエラーハンドリング等はしておりません。)

using Contentful.Core;
using Contentful.Core.Configuration;
using System.Collections.Generic;
using System.Net.Http;

public class HogeDownloader
{
    private readonly string deliveryApiKey;
    private readonly string spaceId;
    private readonly string environment;
    
    public HogeDownloader(string deliveryApiKey, string spaceId, string environment)
    {
        this.deliveryApiKey = deliveryApiKey;
        this.spaceId = spaceId;
        this.environment = environment;
    }
    
	private List<Hoge> DownloadEntries()
    {
        var httpClient = new HttpClient();
        var options = new ContentfulOptions
        {
            DeliveryApiKey = deliveryApiKey,
            SpaceId = spaceId,
            Environment = environment
        };
        
        var client = new ContentfulClient(httpClient, options);
        var entries = await client.GetEntriesByType<Hoge>("hoge");
        return entries.Items.ToList();
    }
}

これで、Windowsアプリでは問題なく動作します。

しかし、この方法だと、WebGLアプリでは動きません!

なぜなら、 contentful.netSystem.Threading.Tasks.Task というマルチスレッド機能を利用しており、WebGLはこれに対応していないためです。

UnityのWebGLビルドならREST API直叩きしよう

UnityでWebGLアプリを開発する場合、いまのところ対応したContentfulライブラリはありませんので、ContentfulのREST APIを直に叩くのが無難です。

ContentfulのREST APIは以下の3種類ありますが、それぞれできることできないことがあります。

REST API 種別 Publishデータ閲覧 Draftデータ閲覧 データ書き込み
Content Delivery API :heavy_check_mark: :x: :x:
Content Preview API :heavy_check_mark: :heavy_check_mark: :x:
Content Management API :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:

Publish(入稿)データを表示するだけなら、 Content Delivery API を利用しましょう!一般的なViewerアプリなら、これで十分です。

もし、Draft(下書き)データもアプリに表示したい場合は、 Content Preview API を利用しましょう!

たとえば、運営向けのアプリで、データ書き込みもするのであれば、 Content Management API を利用しましょう!

たとえば、エントリー(Contentful内のコンテンツ単位)の一覧を取得するためのURLを作成するコードはこんな感じです!

public class HogeDownloader
{
    private static readonly string apiBaseUrl = "https://cdn.contentful.com";
    private readonly string deliveryApiKey;
    private readonly string spaceId;
    private readonly string environment;
    
    public HogeDownloader(string deliveryApiKey, string spaceId, string environment)
    {
        this.deliveryApiKey = deliveryApiKey;
        this.spaceId = spaceId;
        this.environment = environment;
    }
    
    /// <summary>
    /// ダウンロードURL作成
    /// </summary>
    /// <returns>ダウンロードURL</returns>
    private string MakeDownloadUrl()
    {
        var url = $"{apiBaseUrl}/spaces/{spaceId}/environments/{environment}/entries?content_type=hoge";
        return url;
    }
}

上記のように生成したURLに対し、以下のようにアクセスすれば、エントリー一覧を取得できます。

var request = UnityWebRequest.Get(url);
request.SetRequestHeader("Authorization", $"Bearer {deliveryApiKey}");

yield return request.SendWebRequest();

Unity無関係のブラウザアプリなら contentful.js を使おう

Unity無関係のシンプルなWebサイトの場合、公式にnpmパッケージが公開されているので、これを利用しましょう!

contentful.js - Contentful JavaScript Content Delivery Library

contentful.js を利用した場合のコードは、記事が数多くありますので、説明を省かせていただきます。

さいごに

本記事作成にあたり、以下のサイトを参考にさせていただきました。ありがとうございました!

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?