なんだかんだでプログラムが好き

私 すずきかつーき が主にプログラムに関する事を書いたり書かなかったりします

public static implicit operator

自分用

たとえば

    public class IntHolder
    {
        public int Value {private set;get;}

        public static implicit operator IntHolder(int value)
        {
            return new IntHolder() {Value = value};
        }
    }

こんなクラスを作ると

        public void Main()
        {
            IntHolder holder = 100; //この=での代入式がstatic implicit operatorの中身にすりかえられる
            var data = holder.Value;//100がdataに入る
        }

すなわち、ただのintを代入しているようで、実は内部ではIntHolderのインスタンス化が走る。

        public void Main()
        {
            IntHolder holder = new IntHolder() {Value = 100};
            var data = holder.Value;
        }

をやっているようなものだけれど、Valueはprivate setなのでもちろんこんなことはできない。

さらにGenericsを使ったりすると

    public class ValueHolder<T>
    {
        public T Value { private set; get; }

        public static implicit operator ValueHolder<T>(T value)
        {
            return new ValueHolder<T>() {Value = value};
        }
    }
        public void Main()
        {
            ValueHolder<int> holder1 = 100;
            ValueHolder<string> holder2 = "ほげほげ";
            var data1 = holder1.Value;  //100が入ってる
            var data2 = holder2.Value;  //"ほげほげ"が入ってる
        }

こんなことが出来たりする。 (たぶんNullableとかも同じような感じになっているはず。)

しかし、これだと、<int>や<string>など、右辺から推測できそうな型の推論が出来ないので、さらにこんなクラスも用意してあげる

    public static class ValueHolder
    {
        public static ValueHolder<T> Create<T>(T value)
        {
            return value; //この時点でValueHolder<T>への代入扱いになるので、implicit operator ValueHolder<T>が走る
        }
    }
        public void Main()
        {
            //ValueHolder<int> holder1 = 100;
            //ValueHolder<string> holder2 = "ほげほげ";
            var holder1 = ValueHolder.Create(100);
            var holder2 = ValueHolder.Create("ほげほげ");
            var data1 = holder1.Value;  //100が入ってる
            var data2 = holder2.Value;  //"ほげほげ"が入ってる
        }

意味があるかないかでいうとない。

1週間GameJam お題:Space に参加しました。

naichi (@naichilab) | Twitter さんが管理されているunityroomさんで開催された

Unity 1週間ゲームジャム | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

Unity 1週間ゲームジャムに参加してみました。

今回のお題は「Space」

即座に辞書を調べると「空間」でもあるし「空白」でもあるし、「宇宙」でもあります。

どれを題材として絞り込もうかと考えた時に日本人が日常会話で一番しっくりくるspace(スペース)が良いなと何となく思いました。

例えば宇宙という意味でspaceを解釈したとして、「俺、将来はスペースに行きたいんだよね。」って言われたら。 あー?、あー、うん。宇宙ね。 ってなるわけで。

なんとなく宇宙は無しだな。となりました。

では、僕らの日常会話に出てくる「space(スペース)」ってなんじゃろう。 と考えた時に

「ちょっと、そこのスペース開けてくれない?」

みたいな使い方が一番自然かな。と(個人の感想です)

そんなことから

「スペース(空間)」を「開ける(操作する)」ゲームにしよう! と決めました。


しかし、そこから全然アイデアが浮かばず。時間ばかりが過ぎていくので、外枠から埋めていくことに。

①大枠はちょっと前に作ったluminesクローンのプロジェクトを流用しよう!
②グローバルランキング用意するぞ! ③グローバルリプレイ(ランキングからそのリプレイが見れる)も作るぞ!
④てことは、タイムアタック系だな。 (リプレイデータ容量が確定できないと困るので)

→テト・・・リス・・・?

そんなわけで、出来たゲームがこちらです。

https://unityroom.com/games/spaceslide

テトリス風の見た目ですが、大分違います。 操作するのは落下ブロックではなく、配置済みブロックという、一味二味違う感じにしました。

途中、

からもわかるように「面白くないのでは・・・?」と何度も思いましたが、完成して、エフェクト付けてからやると、そんな悪くないな。と(手前味噌、奥豆腐) そもそもテトリスは上手く設置してスペースを管理するゲームですが、設置済みブロックを操作することで、スペース管理している感が大きくなったかな。と(気のせいかもしれません)

配色はその時たまたた食べた冷蔵庫で溶けていたチョコミントを基本セットとしました。

正直失敗だったと思ってますが、この世の中にある配色を基本とするのはよっぽど変な事しない限りは一体感が出るので良いと思います。

そして、何気に気を使っているのが「スムーズ(アナログ)感」です。

マウスによるドラッグや、落ちてくるブロックの移動、ネクストブロックなど、1ブロック分の移動でもゲームとして成り立ちますが、ズズズイっとスムーズに動いた方がなんだか凝って見えるかな。と。

これを下手にやると、ブロック同士が重なってしまったり、ブロック移動で何故かブロックが吸収されてしまったりと、バグの温床になりがちなのですが、クオリティアップのためにはしょうがない!!

この「アナログ感」に関してはまた日を改めて書きたいと思います。


使用ASSET

ファンタジー用音源のてんこ盛りですが、非常に大量に入っているので今回はパズルゲームですけどちょこっと使用しました。

普通のパーティクルの爆発よりもちょっとポップよりにしたかったので使用。 アメコミ風な「Bomb!」みたいな文字をランダムで使ってくれるScriptも入っていますが、文字はいらないので削っちゃいました。

これ!ちょっとお高いですが非常によかったです。 ある程度のアニメーションがPresetに入っていて、uGUIで作ったTEXTもそれなりにアニメーションしてくれて、すごく簡単なのにゲームのクオリティが1段階ぐらい上がった感じします。 さらに自分で細かくアニメーション作ることも出来るので、一生付き合うつもりなら自作アニメーションセットを作っておくとすごく資産になりそうです。

言わずと知れたUnityでReactiveExtension(RX) イベントのマージや、並列処理など、若干学習コスト高めですがUnityにかぎらず使える技術なので損にならずやらない理由がない技術。みなさん使いましょう。


まとめ

しかし、毎回思うのが、「なんだかんだで1週間でゲーム出来るのすごいよね」という。 締め切りの力なのかUnityの力なのか。

普段からそれくらいのポテンシャルを発揮したいもんです。 ではでは。