さけのさかなのブログ

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

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

 こんな感じ。
 一文字一文字をGameObjectにして座標をいじって……なんてやってられないので、いくつか問題があるもののBaseMeshEffectを継承して楽に作成する。

コード

gist.github.com

イケてない点

  • 他のMeshEffectと衝突する。
    • 何が起こるかというと、outlineとかをつけた時、アタッチ順によっては輪郭と文字がバラバラに動いたりする。
    • まあ、アタッチ順でイケてないことになるのはどのMeshEffectでも割とそうなので、致し方なしか。
  • 1文字6頂点決めうちの作りなのでUnityの変更に弱い。
    • ずっと前は1文字4頂点だったのが、あるとき今の6頂点に変更されたことがある。この値をとるAPIとかあればいいんだけど。
  • SetAllDirtyの使い方あってんの?
    • ModifyMeshを発火させる正式な手段ってあんのかな。

使う上で

  • NestedCanvasを使うこと

四倍剣^2パッチ1.02公開

 しました。  ここからダウンロードできます。

修正内容

  • ユニットウィンドウがクリックを阻害しないよう修正
    • ステータスウィンドウの向こうのにあるマスを選択できないやつの修正です
  • 詠唱メッセージの自動送り/手動送りを設定画面で切り替えられるよう修正

 という感じでプレイがちょい快適になるかもしれんやつです。

あと

 夏コミでスペースもらえてました。土曜日 西地区 "d" ブロック 51b。

紹介ページ兼オンラインマニュアル作成しました

幻想四倍剣^2 悔悟棒の謎 オンラインマニュアル

 というわけでこんな感じ。

 締め切り前の修羅場で取説つくるのはキツいナー、と毎回思ってたので、今回は細かい説明をオンラインマニュアルに放り投げて、入稿後に後付けで作れるようにしたのだった。

 意外と疲れた。

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

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

 普通のコルーチンメソッドで書くとこんな感じなのを

    IEnumerator Routine(System.Action<int> callback)
    {
        var result = 0;
        for (int i = 0; i < 100; ++i)
        {
            yield return null;
            ++result;
        }

        callback(result);
    }

 こう書ける。

public class Keisan : CustomYieldInstruction
{
    public int Result { get; private set; }
    IEnumerator routine;

    public Keisan()
    {
        routine = Routine();
    }

    public override bool keepWaiting
    {
        get
        {
            return routine.MoveNext();
        }
    }

    IEnumerator Routine()
    {
        for(int i=0; i<100; ++i)
        {
            yield return null;
            ++Result;
        }
    }
}

 メソッドで書くほうが短いやんけ!

 まあ、コールバックとかツライときありますし。

 呼び方を比較するとこんな感じ。

IEnumerator Start()
{
    int kekka = 0;
    yield return Routine(result => kekka = result);
    Debug.Log(kekka);

    var keisan = new Keisan();
    yield return keisan;
    Debug.Log(keisan.Result);
}

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 * x1;
            matrix[0, 2] = x1;
            matrix[0, 3] = 1f;
            matrix[1, 0] = x2 * x2 * x2;
            matrix[1, 1] = x2 * x2;
            matrix[1, 2] = x2;
            matrix[1, 3] = 1f;
            matrix[2, 0] = x3 * x3 * x3;
            matrix[2, 1] = x3 * x3;
            matrix[2, 2] = x3;
            matrix[2, 3] = 1f;
            matrix[3, 0] = x4 * x4 * x4;
            matrix[3, 1] = x4 * x4;
            matrix[3, 2] = x4;
            matrix[3, 3] = 1f;

            var inversedMatrix = matrix.inverse;

            var rightMatrix = new Vector4(y1, y2, y3, y4);

            var a = Vector4.Dot(inversedMatrix.GetRow(0), rightMatrix);
            var b = Vector4.Dot(inversedMatrix.GetRow(1), rightMatrix);
            var c = Vector4.Dot(inversedMatrix.GetRow(2), rightMatrix);
            var d = Vector4.Dot(inversedMatrix.GetRow(3), rightMatrix);

            // a * x^3 + b * x^2 + c * x + d
        }