2016年3月22日火曜日

UnityにSteamworksを導入する(Steamworks. NET)

こちらの記事はThe Knights Of Unityのブログ記事を許可をえて翻訳(抄訳)したものです。Thank you, Piotr!



UnityにSteamworksを導入する


開発者の多くはSteamへのゲームパブリッシングに興味があると思います。
SteamはPC、Mac、Linuxへゲームを配信できる素晴らしいプラットフォームですからね。

しかし、Steamはただの配信サイトではありません。
もしあなたがValveから許可を得ることができた場合は、ゲーム開発に役立つ様々な機能にアクセスすることができます。
それらは”Steamworks”と呼ばれています。

Steamworksの機能

・実績
あなたのゲームに「草の根マーケティング」の機会を提供します。(無料の口コミマーケティング?)プレイヤーが実績を解除すると、あなたのゲームについて彼らのフレンドが知る機会を提供することができます。

・エラーレポート
プレイヤー側でゲームがクラッシュした際のエラーを集めることができ、良く起きているエラーを素早く修正することができます。
簡単なAPIを呼ぶだけで、Steamはゲームプログラムのクラッシュレポートを自動的に集めてくれます。
エラーレポートはSteamworksの専用のページで確認することができます。

・クラウドセーブ
セーブデータを保存できる無料のクラウドストレージを提供します。(大きめの意訳)

・Steam Workshop
ユーザーが制作したコンテンツを保存、整理、ダウンロードが可能なシステムです。
これらはカスタムステージやスキンデータのほか、いわゆるMODの導入も簡単にすることができます。

このほかにも、統計データ、ランキング、マルチプレイヤーゲームのためのマッチメイキングなどの機能が提供されています。



(Greenlightやパブリッシャーを通じた契約などで開発者登録をし、)Steam SDKの規約にサインするとSteamWorksメンバーとなり、公式ドキュメントを読むことができます。

UnityにSteam Worksを導入する


Steamworks SDKはネイティブのDLLファイル(MacやLinuxの場合は.soファイル)で提供されています。
Unity開発で動作させる場合、C#から呼ぶことになりますので、何らかのバインディング処理を作る必要がありますが、その機能を提供するプロジェクトがすでにあります。

それたSteamworks.NETです。

これはMITライセンスのオープンソースラッパーで、商業利用も可能です。
.unitypackageファイルで提供されているので、Unityプロジェクトへのインストールは簡単です。

Steamworks.NETのいいところは、作者が互換性とシンプルさに重きを置いているところです。
これはつまり、公式のドキュメントの使用法とほぼ変わらない使い方でC#から関数を呼ぶことができるということです。
欠点としてはコールバックの設定にひと手間必要になるということですが、あまり問題ではありません。(翻訳不安個所)

実際の導入

Steamworks.NETを動作させるためには、Steamworksの開発者であること、AppID(Steamのデータベースに乗るプロダクトID)が必要です。
これはSteam Greenlightを通過すれば、Valveから入手することができます。
(翻訳者の場合はパブリッシャーを通しました)

AppIDを入手したら、まずはSteamworks.NETの.unitypackageをインポートしましょう。
この記事の執筆時点ではVersion7.0.0が安定版として提供されていますが、ドキュメントのInstallationページを必ず参照するようにして下さい。

Steamworks.NETのパッケージはWindows, Mac, Linuxそれぞれのx86,x86_64版が提供れています。
このパッケージさえインポートすれば、そのあとは何もプロジェクトに加える必要はありません。
さらに、公式のSteam DLL/soファイルが含まれているので、次の2ステップを行うだけで利用できます。

パッケージをインポートしたら、プロジェクトのルートディレクトリに作成されているsteam_appid.txtを開きます。(AssetsやLibraryを含む階層です)
開くと「480」とだけ書かれていますが、これをあなたのAppIDに置き換えます。

さあ、最後のステップです― 任意のSceneに空のGameObjectを作成し、SteamManager.csをアタッチしましょう。ほら!もう準備完了です!
(注 – ご想像の通りこのコンポーネントはシーンをまたいで生存させるため、DontDestoryOnLoad(this.gameObject)の処理を行っています。また、Managerクラスによくある、SteamManager.Instanceにインスタンスへの参照を持つ方法なので、何か別のコンポーネントと混ぜないほうが良いと思います。)

動作チェック

Steamクライアントを起動して、下記のスクリプトを作成してください。
using UnityEngine;
using Steamworks;

public class SteamScript : MonoBehaviour {
    void Start() {
        if(SteamManager.Initialized) {
            string name = SteamFriends.GetPersonaName();
            Debug.Log(name);
        }
    }
}


このスクリプトを新規のGameObjectとしてSceneに配置して「Play」を押してみましょう。
問題がなければ、Steam上のあなたのユーザー名がUnityEditorのコンソールに表示されるはずです

もしエラーが表示されてうまくいかない場合、何がミスっているのかをうまく読み取れないと思います。もしWindows環境で開発している場合は、MicrosoftのDebugViewアプリケーションを使ってみてください。Unityのゲームを実行する前にこのアプリケーションを起動し、エラーが出た後にalt+tabを押してDebugViewに切り替え、エラーの内容を確認してください。

さらなる情報とヘルプ
この後の使い方や、どのようにコールバックをハンドリングすべきかなどは、Steamworks.NETのドキュメント内でGetting Started ページを参照してください。不明点があった場合は、SteamworksDevディスカッショングループで聞いてみてください。このグループは招待制ですので、Steamにその旨問い合わせてください。それだけの価値がありますよ!

-----------------------------
というわけで、Steamworks SDKのUnityタイトルでの使い方の日本語情報があまりにもなかったので、一番わかりやすかった導入記事を参考に自分でやってみて、
ついでに翻訳記事を作りました。

ぶっちゃけ日本だとまだまだSteamに向けての個人開発者のタイトルリリース数は少ないと思うのですが、個人的にどんどん増えてほしいので参考になれば。



6 件のコメント:

  1. やっと昨日グリーンライトが通ったのに、情報が少なすぎて困っていました!
    神様に見えました!
    ありがとうございます!

    ビルド方法も教えていただけますととても助かります!

    返信削除
    返信
    1. Naoさん
      こんにちは。Greenlightおめでとうございます。
      ビルド方法というのは、具体的に何の作業で詰まっていますか?

      SteamSDKを組み込んで、普通にBuild Settings→Buildで実行ファイルが作れると思いますよ。
      その先のDRMパッケージングについてはよく知らないので、ご自身で調べて頂く必要があります。。。。

      削除
  2. ご返信ありがとうございます。
    ごめんなさい、言葉が雑でした。
    UnityビルドからSteamでの公開までのフローですね。

    Build Settings→Buildで実行ファイルを作成し、それをSteamPipeを使ってSteamworksに送る途中につまづいてしまったので、このフローで問題ないのかと心配になっているところでした。

    調べたところ、STEAM側の問題っぽいので、今VALVEに確認中です。

    返信削除
  3. 参考になりました。ありがとうございます!

    返信削除
  4. 参考にしているのですが以下のエラーが出て進めません。ネットで調べたところ権限がないやら出てきましたが,個人で開発しておりアカウントも1つなので問題ないかと思うのですが。。。アドバイスいただけたらと思います。

    ゲームはすでに公開しているゲームで,steam_appid.txtもちゃんと変更しました。

    [Steamworks.NET] SteamAPI_Init() failed. Refer to Valve's documentation or the comment above this line for more information.
    UnityEngine.Debug:LogError(Object, Object)
    SteamManager:Awake() (at Assets/Steamworks.NET-master/SteamManager.cs:106)

    返信削除
  5. 追加:以下のことをすればうまくいきそうなのでコメントします。
    Unityへの取り込みは.unitypackageで行う。
    steam_appidを書き換えたあと,Unityを再起動する

    返信削除