読者です 読者をやめる 読者になる 読者になる

さけのさかなのブログ

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

Unity

【Unity】ETC1(Split alpha channel)形式テクスチャをUIに使う

やること Android環境において、アルファつきテクスチャ画像をETC1(Split alpha channel)形式でインポートし、UIで使う。その手順について。 手順 テクスチャインポート設定 SpritePacker有効時のみ有効なので、PackingTagを設定。 FormatをRGB Compressed…

【Unity】パーリンノイズで陽炎っぽいエフェクト

パーリンノイズによる陽炎めいたやつ pic.twitter.com/uUDwLtQ03E— enu (@_enu) 2017年3月1日 コード for Unity5.5.2f1 gist.github.com 必要ファイル パーリンノイズのコードは↓から。 github.com

【Unity】ダメージっぽい数字表示

Unity5.5.1p4 数字 pic.twitter.com/20R8Ictytm— enu (@_enu) 2017年2月18日 コード BaseMeshEffectを継承して作る。Shadowコンポーネント等と一緒にアタッチすると変になったりするけど、処理順の問題なので、コンポーネントの順番を入れ替えれば良い。 gis…

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

UnityのSpriteシェーダはデフォルトだとZバッファに書き込みを行わない。 そこでデフォルトシェーダを改造し、Zバッファに書き込むシェーダを作成する。その手順。 Unityは5.5.1p3。 手順 1.デフォルトのシェーダを取得 Unityのサイトからビルトインシェーダ…

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

やることはいたってシンプル。画面下半分に上半分を反転コピーするだけ。それっぽく見せるために色変えたりサインカーブつけたりすれば効果的だけど、その辺はデザインに依る。 水面エフェクト© UTJ/UCL pic.twitter.com/PXgovJxh90— enu (@_enu) 2017年1月2…

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

色分解しながら画面ゆらし pic.twitter.com/gtrFTXjZGk— enu (@_enu) 2017年1月16日 コード gist.github.com 色収差とでも言いたいところだけど、別にレンズ特性の再現とかやってるわけではなくてマジにRGBごとにゆらしてるだけなので。

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

概要 以下の条件において、UnityCloudBuildでビルドしたものが上手く動かない場合の対応方法。 条件 windows環境で開発していて Resourcesフォルダ下のファイル名に濁点/半濁点がある 上記の条件をみたすとき、Resources.Load, Resources.LoadAsyncに失敗し…

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

あかんパターン たとえば一時停止処理などでTime.scaleに0fを入れて時間を止め、なんやかんやした後に1fを入れて戻す処理を書くとする。 この時、なんやかんやしてる内部でTime.scaleに1fを入れてしまうと、勝手に時間が動き出してしまいマズイ。 やること …

【Unity】Resources.LoadAsyncするけどパス指定したくない

やること ロード処理においてResources.LoadAsyncを使いたい。が、いちいちパス指定するのが嫌、という場合のための仕組みをつくる。 コード gist.github.com 使い方 アセットのクラスごとに継承したクラスを作る。 using UnityEngine; using System.Collect…

【Unity】ResourceLoaderクラス

やること Resources.LoadAsync<T>を処理する便利クラスをつくる。 これによって、たとえば、Resources.LoadAsync<T>はせっかくジェネリックメソッドなのに、assetを取り出すときにはキャストが必要、とかの煩雑さを解決する。 コード gist.github.com 使い方 newし</t></t>…

【Unity】Spriteで高さフォグっぽいやつ

やること Spriteで高さフォグっぽいものを実装する。ワールド座標で低いところにあるとフォグがかかるやつ。 Lightingビューのfog設定を反映させられれば完璧だったんだけど、よくわからんかったのでmaterialで色などを設定するような作りにした。 コード Un…

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

やること キャラクターの立ち絵画像で、左右に無駄な透明部分が生まれる場合がある。無駄なので、これを自動で処理するようなエディタ拡張スクリプトを作成する。 サンプル UnityChanの立ち絵でやってみると、テクスチャの横幅が2524pxから1988pxになる。 な…

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

かゆいところ Unity標準機能のColorUtility.TryParseHtmlStringを使うと、#RRGGBBAAで指定された文字列をColorにパースすることができる。 けど、世の中にはAARRGGBBもあるわけでして。 コード Unity5.4.0p1 static public class ColorUtil { static public …

【Unity】 WebGL版の落とし穴

先日Tactics.YokoのWebGL版を公開したわけですが。その時ひっかかった点。 ThreadNinjaは動かない マルチスレッド処理を行うのにThreadNinjaというアセットを使ってるんですが、これが例外を吐く。 なので↓のようにマルチスレッド処理をあきらめる。 public …

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

横スクロール2Dゲームのステージで、背景がスクロールしたときちょっとずつズレるみたいなのを実装する。 素直にスクロール値を計算して毎フレーム位置を動かして……、とかやっても全く問題ないんだけど、まあ、とくに支障がないならカメラの機能だけでやって…

【Unity】 SystemInfoをコンソールに出力するエディタ拡張

SystemInfoのプロパティを全取得して一覧する。 gist.github.com

【Unity】文字がふるえるエフェクト

海外のゲームで見る(きがする)文字がふるえるエフェクト pic.twitter.com/eKUTVS1ux3— enu (@_enu) July 5, 2016 こんな感じ。 一文字一文字をGameObjectにして座標をいじって……なんてやってられないので、いくつか問題があるもののBaseMeshEffectを継承し…

【Unity】 カスタムコルーチンでこのコールバックからの卒業

Unity5.3からカスタムコルーチンを使えるぞ!これで何ができるの?いろんな条件で処理を止められるぞ ……という他に、コルーチンの戻り値を受け取るのにコールバックを使ってる部分をマシにできたりする。 普通のコルーチンメソッドで書くとこんな感じなのを …

Unity Matrix4x4で連立方程式を解く

// 四点を通る三次関数を得る static public void CalculateCubicFunctionBy4Points( float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { var matrix = new Matrix4x4(); matrix[0, 0] = x1 * x1 * x1; matrix[0, 1] = x1 …

徐々に消えるライト

やること 爆発エフェクトなんかを作るとき、オブジェクトにライトを持たせる場合がある。 このとき、普通にエフェクトオブジェクトにライトコンポーネントを持たせただけだと、オブジェクトがDestroyされた瞬間にライトもパッと消えてしまう。余韻をもってじ…

【Unity】MultiModeなSpriteの参照を取得し直す

問題 MultiModeなSpriteの参照をGameObjectだかScriptableObjectが持っているとき。 画像の変更か何かがあってSliceし直すと、Spriteへの参照がMissingになる。これをなんとかする。 理屈 Spriteが生成し直されるのはどうしようもない(多分)ので、Texture…

【Unity】範囲指定可能なブラーエフェクト

そもそも、2Dベースなら真面目に被写界深度エフェクトをやることもないよね! というわけで、範囲指定ができるブラーエフェクトを作った。 理屈 ImageEffectのDepthOfFieldエフェクトは深度バッファを参照してブラー範囲を決めることでピンボケを表現してい…

【Unity】Orthographicカメラで被写界深度エフェクトを使う

Sprite+Orthographicカメラという極北で被写界深度エフェクトテスト pic.twitter.com/4VAVI4N5sj— enu (@_enu) 2016, 1月 30 やること ImageEffectに含まれるDepthOfFieldエフェクト。 これはperspectiveカメラで使うことを前提にしており、orthographicカメ…

非同期シーン追加ロード、からの復帰

やること RPGのフィールドで敵に遭遇 -> ブワッ -> バトル -> フィールドに戻る、みたいな流れを作るためのシーンロード処理。 具体的にやるべきなのは ブワッとなってる間にバトルシーンを読み込む(非同期ロード) バトルが終わったらフィールドに処理を戻…

Preferredサイズに上限を設定する

やること たとえば文章を表示するウィンドウを作った時。 文章が短いうちは文章に合わせてウィンドウが大きくなる。 ある一定サイズ以上にはウィンドウは大きくならず、文章は改行されて表示される みたいな機能をつくる。 イッテイサイズイジョウデカイギョ…

ビルボード

ふつうのビルボード 3Dカメラに対して常にSpriteが正面を向くようにする gist.github.com 鉛直なやつ Spriteが鉛直に立っている状態を保ちつつ、カメラの方を向くようにする [DisallowMultipleComponent] [ExecuteInEditMode] [RequireComponent(typeof(Rend…

ScrollRect.OverScrollを取得する

ElasticやUnrestrictedなScrollRectで、はみ出したスクロール量を取得する処理。 なんで前回normalizedPositionでガタガタ言ってたかというと、これがやりたかったからなんだよね。結局使わなかったが。 Vector2 GetOverScrollRanges(ScrollRect scrollRect)…

ScrollRectの罠!

UnityUIのScrollRect.normalizedPositionの変な挙動について。確認したUnityのバージョンは5.3。 なお、中身は return new Vector2(horizontalNormalizedPosition, verticalNormalizedPosition); なだけなので、厳密にはhorizontalNormnalizedPosition, vert…

神か悪魔か日本語コーディング

C#だとクラス名やらメソッド名やらに日本語が使えるぞ!なーんつってクソコードが出来上がる経験は、誰しもあるはず(個人差有)。 というわけで頑張って英語の辞書とにらめっこしながらコーディングするわけですが、 enumぐらいは日本語でも良くね? [Syste…

GetCharacterInfoが動かない?

表示されてる文字の情報を取ろうとして失敗する現象に遭遇した。 CharacterInfo characeterInfo if (Text.font.GetCharacterInfo(c, out characterInfo)) { // 通らない } 原因はどうやら、 GetCharacterInfoの第三引数を省略するとフォントのデフォルトサイ…

Unity5.2.1のUIエフェクト

またIF変わってんじゃねえか! public class Hoge : BaseMeshEffect { public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } var list = new List<UIVertex>(); vh.GetUIVertexStream(list); ModifyMesh(list); vh.Clear(); vh.AddUIVert</uivertex>…

ヒエラルキーでの位置を比較する

やること 共通の親オブジェクトをもつ複数のオブジェクトがあるとして、ヒエラルキー上でのオブジェクトの上下関係をしらべる。 今回しらべる上下関係というのは、ヒエラルキーウィンドウを展開したときにオブジェクトが並ぶ順番であり、これはUnityUIだと描…

uGUIでグラデーション文字 その2

toriden.hatenablog.com 前にuGUIの文字にグラデーションをつけるコンポーネントを作った。 が、Unityが5.1から5.2になるにあたって、Textの頂点生成処理が変更されており(1文字4頂点だったのが6頂点に変更)、上記のやりかただとパラメータを再設定する必…

uGUIでモーダル

ダイアログなんかを表示したとき、下にあるボタン類が押せなくなるアレを実装する。 Unityは5.2.0f2。 ※修正 非アクティブなときにも有効なのを修正しました ※修正2 Unity5.2.1対応コードを追記 ぱっと実装する alpha=0にしたImageを全画面に配置し、raycast…

スプライトアニメーションを使いまわす法

概要 Unityの標準機能で、Spriteの切り替わりによるパタパタアニメーションを実装することができる。 が、たとえば複数のキャラクター画像で同じアニメーションを使いたいとき、どうするか。 (Unity5.2.0b4) 1.Spriteを紐づける ベースになるスプライトア…

Unity5.2のUIエフェクト

文字にグラデーションをつける 以前にUnityUIのUIEffectを作成し、文字にグラデーションをつけるスクリプトを書いた。 が、BaseVertexEffectの引数がUnity5.2(まだβだけど)では変更されていて、書きなおす必要がある。 5.1までのコード public override vo…

フルスクリーン時に黒帯を表示する

Unityではフルスクリーンモード時、解像度をどう設定しても、モニタに合わせていっぱいに引き延ばして表示される。このため、モニタアスペクト比とゲームのアスペクト比が異なれば表示が潰れてしまうことになる。まずい。 この問題を、とりあえず、黒帯を出…

イージング処理

iTweenは便利だけど、ValueToをonupdateで受けて……については流石にアホか!となったので、それならいっそとMonoBehaviourに依存しないイージング処理を書いた。 コールバックとかはない。Valueを呼んだときにその時の値を計算するだけ。 namespace TSKT { p…

文字にグラデーションをつける

すでにありそうなもんだけど、uGUIの文字にグラデーションをかける機能を書いた。 これが こうなる using UnityEngine; using System.Collections; using System.Collections.Generic; namespace TSKT { public class Gradation : UnityEngine.UI.BaseVertex…

Unity5にはGetSortingLayerUserIDがない

エディタ拡張してSortingLayerを扱うとき、レイヤーIDが欲しければUnity4まではGetSortingLayerUserIDを呼べばよかったけど、5からはGetSortingLayerUniqueIDにメソッド名が変わっている。

テキストファイルを新規作成する

Unityのエディタからテキストファイルを作れないっぽかったので拡張してみた。 試してみると、どうもTextAssetをUnityの機能で新規に作るのは無理?じみていたので、File.CreateTextを呼ぶことに。 いちいち書き方がダサいんだけど、ほんとにあってんのかし…

コルーチンを復帰させる

問題 Unityのコルーチンは、オブジェクトがinactiveになると停止し、その後activeにしても動き出さない。 これをなんとかして、activeにしたら再びコルーチンが動き出すようにしたい。 コード public class ResumeTest : MonoBehaviour { IEnumerator routin…

とうふがない話

開発 今更の話題だけど、NotoFontが便利なのでオススメ。 Unity 4.6が出た。と思ったらCandidateとは。 コルーチン 知っての通り、コルーチンは複数フレームまたぐような重い処理を書くときに使える。 で、コルーチンは要するにIEnumeratorを渡せば動くもの…

2D見下ろし型マップ

問題 斜め上から見下ろしたような画面をつくるとき、まず困るのがキャラの描画順。 2D的にキャラを並べただけだとこんな感じになったりする。 OrderInLayerを使えば解決することはできるけど、毎フレーム処理するのも鬱陶しいなあ、とか、他にも色々問題がで…

Tiledを使う

Tiledとは http://www.mapeditor.org/ いわゆるマップエディタ。 前まではPlatinumを使ってたのだけど、ちょっと機能的に不満があったので、切り替えることにした。 ファイルごと、レイヤーごと、タイルセットごと、タイルごとといちいちプロパティを持たせ…

法線無視ライティング

法線情報を無視ししたライティング(画像右4つの豆腐)。ライトからの距離だけで明るさが決まる感じ。 左4つはデフォルトのシェーダ。 使い道はこれから考える。

ScriptableObjectからAnimationClip作成

前回言ってた、フレームアニメーションの作成スクリプト。 (フレームアニメーションはいわゆるパタパタマンガのことを指してる……でいいと思う) 最終的にはAnimatorControllerが一発で作成できればいいなあ、と考えているのだけど、どこまで機能を持たせる…

いつもの機能

スペースキーでスクショ保存。 using UnityEngine; using System.Collections; using System.IO; public class Screenshot : MonoBehaviour { [SerializeField] KeyCode key = KeyCode.Space; void Update() { if (Input.GetKeyDown(key)) { Save(); } } pub…

試作

現状、さけのさかなのパッチ作成作業と並行して、次のゲームの準備を仕込んでいるところ。気が向いてるほうをやる。 次に創るならとりあえずUnityやろ、みたいな(いや、ちゃんとした理由はある!)ので、共通機能をぼちぼち作っている。 で、今回はこれ。 …