Programming Serendipity

プログラミングを中心に種々雑多に書き留めます

フォルダを再帰的に生成する

この記事はさいたまげーむす Advent Calendar 2016 16日目の記事です。

AssetDatabse.CreateAsset()でScriptableObjectを作ろうと思い、パスの途中のフォルダは存在しなければ自動的に作られるかと思ったら、フォルダは明示的に作る必要があることに気づく!しかし面倒くさい!ならばいっぺんに作るメソッドを作ろう。ということで作りました。

続きを読む

ScriptableObjectの中にScriptableObjectを入れる方法

この記事はさいたまげーむす Advent Calendar 2016 11日目の記事です。

通常、ScriptableObjectにはSerializableなものを格納することができますが、ほかのクラスオブジェクトは一度は入れることはできるものの、一度再生してしまうと情報を失ってしまいます。

そのため、ScriptableObejctの中にクラスごとデータを入れたい場合、そのクラスもScriptableObjectにする必要があります。その手法を紹介しましょう。

続きを読む

Unity開発に便利なVisualStudio拡張

この記事はさいたまげーむす Advent Calendar 2016 && Visual Studio Advent Calendar 2016 11日目の記事です。

ここでは、Unityでゲーム開発(C# + ShaderLab)をするうえで便利なVisual Studio拡張機能を紹介していきます。

続きを読む

Unity開発向けGit LFS 追跡対象リスト

この記事はさいたまげーむす Advent Calendar 2016 10日目の記事です。

開発に必須のGit。ゲーム開発ではリソースが大きいことからリポジトリのサイズが肥大化しがちです。リポジトリのサイズに制限をかけているサービスも多く、例えばBitBucketでは2Gを超えると問答無用でプッシュを受け付けなくなってしまいます。これを解決するのは結構しんどいです(体験談)

このような問題への解決策として注目を集めてきているGit LFS(Large File Storage)をご存知でしょうか。これは、ユーザー側で指定した拡張子を持つファイルを別サーバーに置いて、本線のリポジトリにはそのリソースへのポインタだけを持つことでリポジトリ本体のサイズを抑えるもので、無料で使えます(偉大な開発チーム様に感謝)。

続きを読む

object型には気を付けよう!

この記事はさいたまげーむす Advent Calendar 2016 4日目の記事です。

UnityというよりはC#ですが…

string配列の0番目を除いた1番目以降を可変長引数のメソッドに渡し、それぞれの型を復元したいケースがありました。 このとき、一度 List<object>に入れてから渡してしまうと、渡した先でstringへのキャストに失敗してしまうようです。

void Method1()
{
    string line = GetLine(); // ファイルから読み込んだ内容の1行分と仮定(tsv)
    var items = line.Split('\t'); // 長さは不定
    List<object> objects = new List<object>();
    for(int i = 1; i < items.Length; i++)
    {
        objects.Add(items[i]);
    }
    Method2(objects);
}


void Method2(params object[] parameters)
{
    // blah blah blah...
}

本来はもともとstringだったものはobject型に格納されてもキャストすれば復元できるのですが、こうすると経由する過程で型情報が落ちてしまうのか、キャストに失敗します。

「俺は昔stringだった…。だがその記憶はもう失われてしまった…。今の俺はただのobjectさ。」

LINQを使い、line.Skip(1).ToArray();とすることで解決しました。こうするとobjectを経由するのは引数に渡される1回のみですむためか大丈夫なようです。

というかそもそも自分のケースの場合、可変長引数である必要すらなく、string[]で十分でした!(下らないオチ)

object型には気を付けよう!