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に向けての個人開発者のタイトルリリース数は少ないと思うのですが、個人的にどんどん増えてほしいので参考になれば。
やっと昨日グリーンライトが通ったのに、情報が少なすぎて困っていました!
返信削除神様に見えました!
ありがとうございます!
ビルド方法も教えていただけますととても助かります!
Naoさん
削除こんにちは。Greenlightおめでとうございます。
ビルド方法というのは、具体的に何の作業で詰まっていますか?
SteamSDKを組み込んで、普通にBuild Settings→Buildで実行ファイルが作れると思いますよ。
その先のDRMパッケージングについてはよく知らないので、ご自身で調べて頂く必要があります。。。。
ご返信ありがとうございます。
返信削除ごめんなさい、言葉が雑でした。
UnityビルドからSteamでの公開までのフローですね。
Build Settings→Buildで実行ファイルを作成し、それをSteamPipeを使ってSteamworksに送る途中につまづいてしまったので、このフローで問題ないのかと心配になっているところでした。
調べたところ、STEAM側の問題っぽいので、今VALVEに確認中です。
参考になりました。ありがとうございます!
返信削除参考にしているのですが以下のエラーが出て進めません。ネットで調べたところ権限がないやら出てきましたが,個人で開発しておりアカウントも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)
追加:以下のことをすればうまくいきそうなのでコメントします。
返信削除Unityへの取り込みは.unitypackageで行う。
steam_appidを書き換えたあと,Unityを再起動する