2016年4月3日日曜日

Back in 1995で使用しているUnityを使ったPS1風描画について

ジーパラドットコムさんでシシララ安藤さんとの対談記事シリーズ

『Back in 1995』一條貴彰”90年代のゲーム文化を楽しむムーブメントを日本からおこしたい”シシララ安藤武博のインディーズを見ずに死ねるか!

が完結しました。全4回です。

『Back in 1995』にかける思い、日本国内のクリエイターさんに対して思うこと、PSMについて、シンラについてなど、過去についても積極的に触れていくスタイルでぶっちゃけています。
ぜひご笑読ください。

安藤さんと対談して、「新しいフィールドに自らつっこんで切り開いていくスタイル」は自分とかなり共通しているなと思いました。そして彼はプロデューサー視点から、私は開発者視点から、ゲーム産業どげんかせんといかんと考えているようで、そこらへんうまくシメジーおいしいーとかにならないかなと画策しています。
 
また、私個人にとって安藤さんは「鈴木爆発」の人、というイメージがありまして、その思いも込めて例のゲームの序盤に登場する「みかん爆弾」をつかった"技術デモ"を持って行ったんですね。
二次創作行為をして当時のPに見せに行ったわけで、今考えるとバカ行為だった気もします。

さて、その技術デモが以下で、Back in 1995で無駄に培った初代PlayStation風描画の仕組みを端的に表現しているものです。
UnityのWebGLであっさりビルドできてしまったので、こちらからその実際のデモを試せます。マウスでつかんでぐりぐり動かせるのよ。


この「PS1風描画」ですが、やっていることは以下の3点です。

・ 頂点座標変換の精度を下げる
・ テクスチャのパースペクティブコレクションをオフにする
・ 内部的に低解像度描画を行う

初代PlayStationの座標変換は、固定小数点演算で行われています。(後づけ知識)
だから独特で味のある「ポリゴンのズレ」が出るんですね。

また、テクスチャのパースペクティブコレクションを切ることによって、ポリゴンがカメラに近づくと独特の「歪み」が出るようになります。
美しい。

実は「Back in 1995」を発表した当時、座標変換の精度を下げるところは完成しておらず、トレイラームービーでは「ポリゴンデータ側を壊してそれっぽく見せる」という荒行で対応しておりました。
非常に見栄えが悪くできたので、製品版にも採用しています。

そして忘れもしない1年前のUnite 2015 Tokyo。
本業をほっぽって「Unity相談コーナー」に出向き、高橋啓治郎さんに「Unityで描画精度を固定小数点演算にすることはできませんか?」というトンチキ質問をしたわけです。
「お前は何を言っているんだ」という顔で見られたのも良い思い出です。

冷ややかな目で見られながらも、技術的な助言はばっちりいただき、
まんまと精度をそれっぽく下げるシェーダーが完成しました。ありがとうございました。
高橋さんはその後、自らパッケージにまとめてGithubに成果をあげています。

Retro3D




3点目の「低解像度描画」ですが、これは猛烈に単純で、一回通常のカメラで描画した結果を低解像度なRenderTextureに書き込んでカメラの前に置いているだけです。
参考にTsubakiさんの記事を参考にしています。みんな大好きテラシュールブログ。

単にUnityの設定で低解像度にしたり、あるいは描画パイプライン上で直接何かする方式を取っていないのは、「さまざまなプラットフォームでの対応」 を想定しているからなんですね。
描画システム側に深いことをやるとマルチプラットフォームの時に固有の問題が起きそうだと思ったので、すごく単純な方法で実装しようという方針です。

さいわい描画負荷がかなり軽いゲームなので、こういう力技を使っても全く問題ありません。
(ふつうはRenderTextureは重い処理なので、、、)
 おかげで開発初期で利用していたPlayStation Mobile、すなわちPS Vitaでもしっかり動いていました。
覚えていろ地べたを這いどろ水をすすってでもPlayStation platformに戻って来てやる


あとブラウン管シェーダーというものも入れて、モニターの雰囲気を出しています。
[Unity3D]ブラウン管風シェーダーを作った  


そういうわけで、技術的にPS1風描画は割とすぐ試せるので、開発中のゲームでちょっとやってみたいなと思った人はぜひチャレンジしてみてください。


初代PS風の格ゲーやRPGを開発する同士よ、ぜひ!(アドベンチャーゲームは作らないでお願いTT)

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に向けての個人開発者のタイトルリリース数は少ないと思うのですが、個人的にどんどん増えてほしいので参考になれば。