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



2015年9月26日土曜日

[Unity]データセーブ支援&暗号化アセットPerlib


レジストリぶっこみマンで有名なPlayerPrefsに代わるセーブシステムは色々あるが、シンプルさ優先でPerlibを購入・使ってみた。


2016/3/22: 追記
削除されていました。oh....


Perlib - Unity Asset Store

↑にアクセスするとパブリッシャー名はUnity Sucksになっているわ、サポートへのリンクはUEのトップページになっているわで悲惨な状態に....
代替アセットを探すか、自前でxml読み書きするクラス作らんとですわ。

指定のフォルダに暗号化したセーブデータとファイルを書きだす。
暗号化キーはサンプルそのままだとアレなので皆はアレしような。

セーブデータを生成してSetValueで保存、GetValueで読み込み。大変シンプル。
気に入ったのは、自作クラスをシリアライズして保存してくれる点。

現在はPC/Mac用に Environment.SpecialFolder.MyDocuments でドキュメント内にセーブフォルダを作っている。
iOS/Androidはやってないのでわからないが、Application.persistentDataPathあたりで保存と読み込みをすれば大丈夫だと思う(投げやり)。
STEAMWORKSに対応させるときにどうなるかは追記予定。

仕組みとしては、内部でXMLにしてから暗号化してるようだ。
そのため、Dictionary及びHashSetを含むクラスは保存できないので注意。
(自分は途中で気が付いてListで管理するよう書き換えた)

ちなみに暗号キーを間違えると「Bad PKCS7 padding~~」というエラーが出るので、こいつを目撃した人は読み込もうとしているセーブデータのキーが間違ってないか確認だ。

2015年6月20日土曜日

Blenderでポリゴンの裏を描画しないようにする手順 (メタセコからの転入者向け)

メタセコで形を作って、テクスチャアトラスやモーションをBlenderで作る、という方式をやろうとしている私です。

Blenderはmqoインポーターが付いているのはいいんですが、デフォルトだと片面ポリゴンも両面描画する仕様になってまして、建物内の部屋データとか作るときにしんどいんですね。

で、片面描画だけにする手順を見つけたのでメモします。



※注意
筆者はBlenderおよびDCCツール初心者なので、これが正解とは限りません。マサカリ歓迎。 

[追記]

ファッキンファック!


苦労してマテリアルをイジる手法で片面表示を指定ましたが、オプション一つでシーン全体の片面表示が可能であることが判明しました。

3Dビューで「N」キーを押してプロパティー一覧を出し、「シェーディング」の「裏面の非表示」を選択。


おわり。

俺より後に似たようなことに挑戦した方が、時間をドブに捨てずにすみます。本当にありがとうございました。

以下はその無駄な手順です。

まず、エディター「アウトライナー」から片面描画にしたいオブジェクトを選択。



エディター「ノードエディター」を開いて





「ノードを使用」にチェックを入れる。
※筆者はこれが分からなくて2時間ドブしました。ノードエディターなのにノードを使うがデフォでオンになってないって何やねん自己否定か。



デフォルトのノード構成はこんな感じ

「マテリアル」の丸いマークをクリックして、編集対象のマテリアルを選択(ややこしい、正確な呼び方不明)






ノードエディターの「追加」「入力」「ジオメトリ」の順に選択してジオメトリノードを追加。
同様に「追加」「コンバーター」「カラーランプ」でカラーランプノードも追加。





画面には合計4つのノードになる。
ジオメトリノードの一番下「前後」をカラーランプノードの「係数」に接続。
カラーランプノードの「カラー」を出力ノードの「アルファ」に接続。

はいこれで指定マテリアルの裏面が描画されなくなりました!!






うーんこういうのオプションでポチッと切り替わらんもんなのかのう....



参考:
ポリゴンの裏側を表示しない方法について
Blenderで裏面ポリを描画しない方法
ノードエディタのマテリアルノード

2015年6月14日日曜日

[Unity]NavMeshAgent.Stopのワンポイント ピタッと止める in Unity 5

Unity 5から、NavMeshAgent.Stop()のstopUpdatesオプションが削除されたので、どうにかしようとした。

[Unity]NavMeshAgent.Stopのワンポイント ピタッと止める
http://ttwco.blogspot.jp/2015/04/unitynavmeshagentstop.html 

デフォルトのStop()はアクセラレーションが効いて即座に止まらず少し滑ってから止まるので、
ゲームポーズとかの実装に支障がある。
そこでUnity 4まで NavMeshAgent.Stop(true) としていたのが、Unity 5で使えなくなったので代替手段を探したというお話。

結論、Stop()を呼ぶ前にvelocityの値を0にすることで解決。
 navMeshAgent = GetComponent<NavMeshAgent>();

        navMeshAgent.velocity = Vector3.zero;
        navMeshAgent.Stop();

こうね。

ここに辿り着くまでの軌跡はUnity Communityにも投稿しました。
http://forum.unity3d.com/threads/solved-how-can-i-stop-navmesh-agent-sliding-in-unity5.332233/

"NavMeshAgent.updatePosition = false".で行けるかなと思ったんですが、このオプションはNavMeshAgentを止めるわけではなく、親コンポーネントをAgentに追従させるのを辞めるという謎挙動。
シーンビュー見てるとキャラクターからNavMeshAgentだけ剥がれて動く様子が見れます。なんのために使うオプションなんだろう...

2015年4月11日土曜日

新作"Back in 1995" 発表しました

公式サイト立てて告知していたので、こっちの存在を忘れていた...

新作「Back in 1995」発表しました。




本タイトルは、初代PS風の絵作り・サウンドにこだわった"3D"アドベンチャーゲームです。

最近はインディーゲームから大企業のスマホアプリまで、さまざまな形でレトロゲーム回帰をテーマにした作品が世に出ております。
しかしながら、その多くがファミコン~スーパーファミコンの「ドット絵レトロゲーム」です。
弊スタジオではその後の時代、PlayStationやSega Saturnの質感を目指して開発しております。





今回の映像は初期開発版となりますので、今後、グラフィックもより一層「デチューン」を行い、
現在20歳後半~30代中盤の元ゲームキッズの皆さんへ、ピンポイントに響くゲーム体験をお届けいたします。

■タイトル情報
タイトル:「Back in 1995(仮)」
ジャンル:"3D"アドベンチャーゲーム
発売時期:2015年冬
プラットフォーム:未定
プレイ人数:1人
開発:Throw the warped code out
公式サイト:http://backin1995.com/

■イベント出展情報
「Tokyo Indie Fes 2015」 http://tokyoindiefest.com/ プレイアブル出展を予定しております。


■メディア掲載情報

Automaton
http://jp.automaton.am/articles/IotW/iotw-087-back-in-1955/

ファミ通.com
http://www.famitsu.com/news/201504/10076378.html

Game Spark
http://www.gamespark.jp/article/2015/04/10/56191/comment.html

窓の杜
http://www.forest.impress.co.jp/docs/serial/indiedigest/20150410_697261.html

思ったより反響が多く、驚いています。
まずは5月プレイアブルのクオリティアップ...もといクオリティダウンを頑張ります。

2015年4月3日金曜日

[Unity]NavMeshAgent.Stopのワンポイント ピタッと止める

NavMeshAgent.Stop();と普通に呼ぶと、ヌルッと慣性が働いて止まる。

ゲームのポーズなど、ピタッ、バシッと直ちに止まらせたい場合は

NavMeshAgent.Stop(stopUpdates:true);

とする。

(名前付き引数で見やすくしているので NavMeshAgent.Stop(true); でも良い)

ところがこれ、古い方のスクリプトリファレンスだと載ってるんだけど
http://docs.unity3d.com/412/Documentation/ScriptReference/NavMeshAgent.Stop.html

Unity 5以降?からのやつからは消えてる。隠しパラメータってやつ??

http://docs.unity3d.com/ScriptReference/NavMeshAgent.Stop.html

謎い。

[追記]
Unity 5 からはこのオプションが消されたので、別の手段を取る必要があります。
http://ttwco.blogspot.jp/2015/06/unitynavmeshagentstop-in-unity-5.html