さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】Z書き込みアリのSpriteシェーダ

 UnityのSpriteシェーダはデフォルトだとZバッファに書き込みを行わない。

 そこでデフォルトシェーダを改造し、Zバッファに書き込むシェーダを作成する。その手順。

 Unityは5.5.1p3。

手順

1.デフォルトのシェーダを取得

 Unityのサイトからビルトインシェーダをダウンロードする。

 zipを解凍し、DefaultShaderExtra/Sprites-Default.shaderファイルがそれ。Unityにインポートする。

 ↓が今回のDL元。

unity3d.com

2.名前変更

 一行目、Sprites/Defaultになってるのを分かりやすい名前に修正する。

 今回はTSKT/Sprites/ZWriteにした。

3. Queue変更

 "Queue"="AlphaTest"

 説明は↓のあたり。Rendering Orderの項目。

docs.unity3d.com

4. RenderType変更

"RenderType"="TransparentCutout"

docs.unity3d.com

5. ZWrite変更

ZWrite OffとなっているのをZWrite Onにする。

6. アルファテスト追加

 fragメソッド内に↓を追加する。0.5は適当な数値に調整すれば良い。

clip(c.a - 0.5);

 これはいわゆるアルファテストで、αが一定以下のピクセルを破棄する。これがあるために、今回つくったシェーダでは半透明な領域やフチ部分は汚くなってしまう。

 まあ、やらないと透明な領域までZバッファが書き込まれてしまい、欠けてほしくない部分が欠けたりしてまずいのだ。半透明は諦めよう。

 ちなみにこんな感じで汚くなる。絶望的。

default

f:id:enuenupi:20170210181048p:plain

zWriteOn

f:id:enuenupi:20170210181123p:plain

できたコード

gist.github.com

【Unity】水面エフェクト2D

 やることはいたってシンプル。画面下半分に上半分を反転コピーするだけ。それっぽく見せるために色変えたりサインカーブつけたりすれば効果的だけど、その辺はデザインに依る。

コード

gist.github.com

【Unity】色分解しながら画面ゆらすエフェクト

コード

gist.github.com

 色収差とでも言いたいところだけど、別にレンズ特性の再現とかやってるわけではなくてマジにRGBごとにゆらしてるだけなので。

やること2017

 あけましてた。

MSTリリース

 いま開発中のやつ。

 上半期を目標。ただ完成したら即リリースするかっていうとそうでもなくて、ある程度外的要因によって前後するかも。…いや、早くなることはないか。イベント合わせにするとかでズレる。まあそれでも上半期中には何とかなってるっしょ。

 あと今回はパロディではなく一次創作なので、リリース後はその辺を活かしてなんかできればなあ、とか。皮算用な。

例大祭、遊宴雀参加

 なんか出すよ。ちょい他力本願になる予定。

bitsummit5

 ブース申し込んでみたけど、どうなるかは知らね。

ブログ

 技術的な記事をちょろちょろ参照してもらえたりがあったので、引き続き書いていければなあと。幸か不幸かUnityはまだ枯れそうにないわけだし。

下半期

 なんもわからん。生きる。

ゲームの紹介ページにOGPを設定すること

ページを作ったら

moetoku.sakura.ne.jp

 ゲームの紹介ページなんかを作ったら、TwitterとかブログにURLを張る。

 そのとき、ブログカード形式でリンクが表示されればいいよね。ということで、表示されるようにする。

OGP設定する

 htmlにメタデータを埋め込んでやればよい。詳しくはOGPでググろう。

 だいたいこんなん。

<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
    <meta charset="utf-8" />
    <meta property="og:title" content="MagicScrollTactics" />
    <meta property="og:type" content="website" />
    <meta property="og:url" content="http://moetoku.sakura.ne.jp/mst/" />
    <meta property="og:image" content="http://moetoku.sakura.ne.jp/mst/img/thumb.png" />
    <meta property="og:site_name" content="同人ゲームサークル オートリ電子" />
    <meta property="og:description" content="横スクロールSRPG MagicScrollTacticsのページ" />
    <meta name="twitter:card" content="summary">

twitterにも適用する

 Card validatorに登録してやる必要がある。

はてなブログで使う

 はてなでブログでカード形式リンクを使うには、index.htmlまで記述しなきゃいけないぽい。これで躓いた。

 ふぇーすぶっくはつかっていないのでしりません。

【Unity】CloudBuildでうまくいかない場合対応

概要

 以下の条件において、UnityCloudBuildでビルドしたものが上手く動かない場合の対応方法。

条件

  • windows環境で開発していて
  • Resourcesフォルダ下のファイル名に濁点/半濁点がある

 上記の条件をみたすとき、Resources.Load, Resources.LoadAsyncに失敗してコケる。

ナンデ?

 UnityCloudBuildのログを見ると、ファイル名がNFDになっていることがわかる。このためにファイルが見つからずにロードに失敗する。

5871: [Unity] Updating Assets/Resources/AbilityEffects/ヤンシャオグイ.asset - GUID: 407fd122216a3674f90de5822614aed0...

 テキストエディタとかにコピペしてみよう。

対応

 ロードする際のパスをNFDに変換してやれば良い。

1.シンボル定義

 処理を分けるため、CloudBuildの設定でシンボルを定義する。

f:id:enuenupi:20161219133230p:plain

2.ロード処理時にstring.Normalize

public T Load(string path)
{
#if CLOUD_BUILD
    path = path.Normalize(System.Text.NormalizationForm.FormD);
#endif
    return Resources.Load<T>(path);
}

 そもそもファイル名に日本語を使わないのが無難だけど、なんだかなあ。

+

【Unity】複数個所から安全にTime.scaleを操作する

あかんパターン

 たとえば一時停止処理などでTime.scale0fを入れて時間を止め、なんやかんやした後に1fを入れて戻す処理を書くとする。

 この時、なんやかんやしてる内部でTime.scale1fを入れてしまうと、勝手に時間が動き出してしまいマズイ。

やること

 いろんなところでTime.scaleを操作すると何かと問題が起こりやすい。そこで管理クラスを作る。

コード

gist.github.com

使い方

Time.scale = 0f;

// なんやかんや

Time.scale = 1f;

としているところを

var timeScaler = new TimeScaler();
timeScaler.SetScale(0f);

// なんやかんや

timeScaler.SetScale(1f);

 とする。

 変更した本人が1fに戻さないと永遠に戻らないので注意。それが流儀。