さけのさかなのブログ

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

【Unity】立ち絵の透明部分をトリミングする

やること

 キャラクターの立ち絵画像で、左右に無駄な透明部分が生まれる場合がある。無駄なので、これを自動で処理するようなエディタ拡張スクリプトを作成する。

サンプル

 UnityChanの立ち絵でやってみると、テクスチャの横幅が2524pxから1988pxになる。

 なお、左側に透明領域が残っているのは、処理前後で画像中心軸が変わらないようにするため。

before

f:id:enuenupi:20160908171405p:plain

after

f:id:enuenupi:20160908171514p:plain

© Unity Technologies Japan/UCL

コード

Unity5.5.0b2

gist.github.com

使い方

 Resources/Dialogsフォルダに画像ファイルを入れると、テクスチャをリサイズして左右の透明部分を削ってくれる。

使えないケース

  • SpritePackerを使う場合はUnityが上手くやってくれるので不要。
  • というか、そもそもSpriteだとテクスチャのリサイズ時に頂点が変なことになるので使えないっぽい。
  • 画像作成時点でトリミングしてるなら不要。
  • テクスチャサイズが変わるので、二べきにする必要のある圧縮形式は使えなくなる。

四倍剣^2ダウンロード版公開しました

 最近の脱・メディア頒布な卒業する流れに乗っかるべく、四倍剣2のダウンロード版を用意しました。本日公開です。

 サイトはメロンブックスDL、DLSite、DMMの3サイトでの取り扱いです。何ぞ都合の良いところでどぞ。なおDMMはR18ゾーンになるので青少年諸君は注意な。

www.melonbooks.com

www.dlsite.com

www.dmm.co.jp

【Unity】ARGB文字列をパースする

かゆいところ

 Unity標準機能のColorUtility.TryParseHtmlStringを使うと、#RRGGBBAAで指定された文字列をColorにパースすることができる。

 けど、世の中にはAARRGGBBもあるわけでして。

コード

Unity5.4.0p1

static public class ColorUtil
{
    static public bool TryParseArgbString(string argb, out Color color)
    {
        if (ColorUtility.TryParseHtmlString(argb, out color))
        {
            var a = color.r;
            color.r = color.g;
            color.g = color.b;
            color.b = color.a;
            color.a = a;
            return true;
        }
        return false;
    }
}

 αのないRGBを入れたら変なことになるんだけど、そこまで対応するなら自分で書いた方がよさげ。

public static Color32 ParseArgb(string argb)
{
    var value = System.Convert.ToInt32(argb.TrimStart('#'), 16);
    var a = (value >> 24) & 0xff;
    var r = (value >> 16) & 0xff;
    var g = (value >> 8) & 0xff;
    var b = value & 0xff;

    return new Color32((byte)r, (byte)g, (byte)b, (byte)a);
}

argb parser · GitHub

【Unity】 WebGL版の落とし穴

 先日Tactics.YokoのWebGL版を公開したわけですが。その時ひっかかった点。

ThreadNinjaは動かない

 マルチスレッド処理を行うのにThreadNinjaというアセットを使ってるんですが、これが例外を吐く。

 なので↓のようにマルチスレッド処理をあきらめる。

public Coroutine StartCoroutineAsync(IEnumerator routine)
{
#if UNITY_WEBGL
    return StartCoroutine(routine);
#else
    return CielaSpike.ThreadNinjaMonoBehaviourExtensions.StartCoroutineAsync(this, routine);
#endif
}

 マルチスレッド処理はステージオブジェクトの構築やAIの思考とかに使っているので、そういう箇所で画面が固まるんだけど、どうしたもんかな。他のアセットだとうまくいくんだろうか。

 普通のコルーチンで同じような負荷分散をやろうとするとドエライ大変なので、残念ながら妥協のしどころか。

CloudBuildは動かない

 CloudBuildでビルドしたWebGL版がエラーを吐いたけどローカルでビルドすれば動いた。つらい。自前でやるしか。

 これについては、Windows環境で開発してるとCloudBuild環境ではエラーになるケースがあるとかじゃないかな。知らんけど。

toriden.hatenablog.com

Logは動く

 PlayerSettingsでDebug.Log出力をオミットでき……できねえ! ↓のコードで止める。

#if !UNITY_EDITOR
        void Start()
        {
            Debug.logger.logEnabled = false;
        }
#endif

参考

qiita.com

C90のゲーム公開と、これからのこと

C90お疲れ様でした。

 というわけで、頒布してた新作をWebでも公開します。

 Tactics.Yoko(kari)ダウンロード

 横スクロールでSRPGというやつです。プロトタイプ版なので絵は仮だし音はほとんぼ出ないけど、とりあえずこんな感じで動きますよ、的な。

ブラウザ版

Unity WebGL Player | Tactics.Yoko

 技術検証的な目的もあって、ブラウザで動くバージョンも作りました。

 ダウンロードめんどい、とか、UnityのWebGLビルドに興味がある人とか向け。

これから

 というわけでTactics.Yokoの開発が本格的に始まります。

 ゲーム内容は、まあ、がんばるのは当然として、今回は活動範囲を広げる感じで色々やってみようと企んでます。具体的にはスマホ版のリリースとか。この辺を自由にやれるのはオリジナルならではなので、欲張っていくスタイルでいきたいね。

C90のこと

 あと一週間どころの話ではないですが、コミケ参加します。

 スペースは2日目西d51b オートリ電子で。

出し物

例大祭作品

 今年5月の例大祭で出したやつ持っていきます。幻想四倍剣2。1000円。

 例大祭に行かなかった人も行ったけど買わなかった人も買った人もどうぞ。

f:id:enuenupi:20160418092020j:plain:w240

新刊

 あとは今開発中のやつを持っていきます。無料。

f:id:enuenupi:20160806180820p:plain

どういうゲーム?

f:id:enuenupi:20160806181349p:plain:w240 f:id:enuenupi:20160806181250p:plain:w240 f:id:enuenupi:20160806181213p:plain:w240

 プロトタイプ版、つまり、とりあえずシステム組んであって、一応動いて、なんとか遊べる。みたいなんです。こんなシステムなのね、というのが伝われば良いなと。

 ディスクにダウンロードURLも印刷しとくので、今どきの光学ドライブがないマシンでも安心。webでも公開します。

ジャンルについて

 申し込みジャンルと異なるものになってるのは決意の弱さ故の話で、例大祭で出せるかどうか自信のなかった四倍剣2を結果として出せて、じゃあ夏コミでは何を出すか?ミニゲームを出すという選択肢はあるんですが、なるべく早く次回のゲームにとりかかった方が良いだろうという判断です。
 開発スケジュールとしてはもともとの予定通り進んでると考えて頂ければ。申し訳のない話ではあるんですが。

【Unity】Perspectiveカメラで2D画面の多重スクロール

 横スクロール2Dゲームのステージで、背景がスクロールしたときちょっとずつズレるみたいなのを実装する。

 素直にスクロール値を計算して毎フレーム位置を動かして……、とかやっても全く問題ないんだけど、まあ、とくに支障がないならカメラの機能だけでやってみようと。LateUpdateとか使って処理順意識するの嫌じゃん?

カメラ設定

 遠くのものがゆっくりと動く(ようにみえる)ために、Perspectiveカメラを使う。Orthographicカメラではこの現象は起こらない。

定数を決める

カメラ~基準オブジェクトの距離

 カメラがズレを起こさないメインとなるオブジェクト(基準オブジェクト)とカメラとの距離を決める。

 距離はカメラのニアクリップ、ファークリップ内に収めて(まあ普通おさまるけど)、あとはまあ、なんやら使いたい機能があったらそれに都合がいいようにする。スプライトだけの世界なら特になんでもいいはず。

で、コード

float 基準オブジェクトとカメラの距離;
float 背景オブジェクトとカメラの距離;
GameObject 背景オブジェクト;

背景オブジェクト.transform.localScale = Vector3.one * 背景オブジェクトとカメラの距離 / 基準オブジェクトとカメラの距離;

 という感じに、「遠くにあるものは小さく見える」を打ち消すように背景オブジェクトを拡大してやれば、いい感じに等倍に背景が描画されつつスクロールがズレてくれる。

 あとは背景の端が見えないように調整とかが要るんだけど、まあ、そこはオブジェクトの構造依存の話なので知らない。

使えないパターン

 横方向にはスクロールするけど縦方向はスクロールしない、とか、摂理に反することをしようとするとゴリゴリと毎フレーム位置を入れる処理が要る。しかたないね。

こっちも参考

gamesonytablet.blogspot.jp