勉強不足で至らんブログ

勉強不足ですが色々と書いていきます。

UnityのlayerをenumにしてくれるEditor拡張を作った

たまにしてる、自分のQiita記事転載です(ブログ更新と言いたい)

GameObjectのTag管理を楽にしたくて調べてたら、これをみつけました。

UnityEditorInternal.InternalEditorUtilityを使う - けいごのなんとか

Tagを扱いやすくするクラスの自動生成…なんと甘美な響き…!! 結構前の記事ではありますがUnity5.6.3とかでも動作してくれるので、すごく助かります。

…ここでTagだけでなくLayerも扱いやすくできれば…どうせならEnumに…と思いまして、上記の記事のクラス自動生成を見よう見まねでLayerからEnumスクリプトの自動生成を作ってみました。

using UnityEngine;
using UnityEditor;
using System.Linq;
using UnityEditorInternal;
using System.Collections.Generic;
using System;

[InitializeOnLoad]
public class LayerEnumCreator
{
  private const string LAYER_ENUM_HASH_KEY = "Layer_Enum_Hash";

    [MenuItem("Assets/LayerEnumCreator")]
    public static void _layerNameCreator ()
    {
        if (EditorApplication.isPlaying || Application.isPlaying)
            return;

        BuildlayerName ();
    }
    
    static LayerEnumCreator ()
    {
        if (EditorApplication.isPlaying || Application.isPlaying)
            return;

        BuildlayerName ();
    }

    static void BuildlayerName ()
    {
        System.Text.StringBuilder builder = new System.Text.StringBuilder ();

        builder = WriteTagManagerClass (builder);


        string text = builder.ToString ().Replace (",}", "}");
        string assetPath = currentFolderPath + "../LayerEnum.cs";
        
        if (AssetDatabase.LoadAssetAtPath (assetPath.Replace ("/Editor/..", ""), typeof(UnityEngine.Object)) != null && EditorPrefs.GetInt (LAYER_ENUM_HASH_KEY, 0) == text.GetHashCode ())
            return;

        System.IO.File.WriteAllText (assetPath, text);
        EditorPrefs.SetInt (LAYER_ENUM_HASH_KEY, text.GetHashCode ());
        AssetDatabase.Refresh (ImportAssetOptions.ImportRecursive);
    }

    static System.Text.StringBuilder WriteTagManagerClass (System.Text.StringBuilder builder)
    {
        List<string> layerNames = InternalEditorUtility.layers.ToList();

        builder.AppendLine ("public class LayerEnum");
        builder.AppendLine ("{");

        {
            WriteLayerEnum (builder, layerNames);
        }

        builder.AppendLine ("}");
        return builder;
    }
    
    static void WriteLayerEnum (System.Text.StringBuilder builder, List<string> layerNames)
    {
        builder.Append ("\t").AppendLine ("/// <summary>");
        builder.Append ("\t").AppendFormat ("/// Access Layer Number Enum").AppendLine ();
        builder.Append ("\t").AppendLine ("/// </summary>");
        builder.Append("\t").Append ("public enum Layer {").AppendLine ();
        layerNames.ForEach ((layerName, i) => {
            var comma = (i == layerNames.Count() - 1)? "" : ",";
            if(i >= 3) {
                i += 1;
                if (i >= 6) {
                    i += 2;
                }
            }
            builder.Append("\t").Append("\t").AppendFormat (@"{0} = {1}", layerName.SymbolReplace(), i + comma).AppendLine();
        });
        builder.Append("\t").AppendLine ("};");
    }


    static string currentFolderPath {
        get {
            string currentFilePath = new System.Diagnostics.StackTrace (true).GetFrame (0).GetFileName ();
            return "Assets" + currentFilePath.Substring (0, currentFilePath.LastIndexOf ("/") + 1).Replace (Application.dataPath, string.Empty);
        }
    }
}

UnityのEditorの方でLayerの3, 6, 7は入力ができず空白なのでenumに含めず、スキップする処理にしてますが…あまり気に入ってないです… あと、実はこれだけでは動かないです。クラス拡張も行なっているので…

using UnityEngine;
using System.Linq;
using System.Collections.Generic;
using System;

public static class ClassExtension
{
    public static string SymbolReplace(this string name)
    {
        string[] invalidChar = new string[] {" ", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "-", "=", "^", "~", "¥", "|", "[", "{", "@", "`", "]", "}", ":", "*", ";", "+", "/", "?", ".", ">", ",", "<"};
        invalidChar.ToList ().ForEach (s => name = name.Replace (s, string.Empty));
        return name;
    }
    
    public static void ForEach<T> (this IEnumerable<T> collection, Action<T, int> action)
    {
        int i = 0;
        foreach (T t in collection) {
            action (t, i++);
        }
    }
}

この拡張を加えれば動くと思います。 ただ、注意点なのはLayerは8から入力できますが、8を入力せず9を入力すると番号がズレるため、その辺は ご自分でよしなにお願いします。 初めての自動生成スクリプト(見よう見まね)なのでツッコミ所があれば突っ込んでいただければと思います。

デフォルトの結果だとこうなります。

public class LayerEnum
{
    /// <summary>
    /// Access Layer Number Enum
    /// </summary>
    public enum Layer {
        Default = 0,
        TransparentFX = 1,
        IgnoreRaycast = 2,
        Water = 4,
        UI = 5
    };
}

第1回 八時間耐久作品制作会(仮) in 東京 開催!

福岡にある八耐と同じような空間が欲しいと思ったので、東京で開催してました!

 

f:id:MakeTake:20170626000033j:plain

 

 

それと同時に福岡では第50回となる、八耐が行われていました。

同時開催ができて、良かったです。中継も中々楽しかったですし!!

実は、一週間早く宮崎八耐が立ち上がりました!今年は新規に宮崎東京と新たな土地で八耐が立ち上がりました。参加のできる範囲で、機会があれば是非とも参加してください!!

 

ちなみに東京八耐には、福岡でも参加していただいてた方や、新しく八耐に参加してくださった方…と様々な方が参加してくださいました!!

 

参加者の方々が、もくもくと作業したり、福岡中継とふざけたり…自然に八耐の雰囲気になっていた気がします。

f:id:MakeTake:20170626000445j:plain

 

もくもく会や、ハッカソンとは違う雰囲気の会場になったのではないかと…

 

さて、第1回目となる東京八耐に参加してくださった方々の作品を一部抜粋していきます!

写真の数が少ないのは、色々な作品を見ているうちに撮影を忘れていた自分のせいなのです…申し訳ないです……

 

まずは、 卑猥.city

f:id:MakeTake:20170626001635j:plain

なんとも印象的なタイトルですw

気になる方は

hiwai.city

リンクに飛んでください…百聞は一見に如かず!

 

説明の通りなのですが、新しい防犯共有サービスです。これを、八耐の中で作り上げドメインまで取得しているのがすごいところ!!

いや、もう良い感じに気持ち悪いossanが出ていていいですねw

 

次に、ファイヤーベーススーパートルネード!

firebaseを使用したコンテンツ?のようです。

f:id:MakeTake:20170626002035j:plain

hogeと書いた下にテキストフィールドがあるのですが、そこに「tornado」と入力すると…実は扇風機と連動していて扇風機のスイッチが入るというものです!

これからの季節に使える?ものになりそうです!

 

次に、BBQ風のシンセサイザーです

f:id:MakeTake:20170626002910j:plain

火が一定周期で左から右へと移動します。網にBBQの具材を置いていると火が当たる瞬間に具材それぞれの音が出ます。

ただ、具材に火が通る処理までは実装してなく、生焼けの状態が続く……

 

上記の作品以外にも様々な作品がありましたよ!

・Unicessingを使用したWallpaperEngine用のコンテンツ

XCodeiOS開発で為替のレートの上下の理由をTwitterから収集するアプリ

・アカン映像のVJ用ムービー

・・・etc 本当に様々なやろうとしていること、やったこと等があり面白かった!!

f:id:MakeTake:20170626003845j:plain

 

参加してくださった皆さま、運営をしていた皆さま、本当にお疲れさまでした!

また、差し入れにお菓子を頂いたりもしました!!ありがとうございました!

 

これからも、東京八耐を行っていきますので、ご参加下さい!

Unity1Weekに参加しました

最近、Twitterでよく見ていたハッシュタグ #unity1week に参加しました・・・

まぁ、参加したと言ってもオンライン上ですしお手軽です

 

twitter.com

 

んで、作ったゲームがこちら「球牢」です

 

球牢 | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

 

f:id:MakeTake:20170529010557p:plain

 

そして、頂いたコメントがこちら

 

 

難しくて、すみません!!

実はマウス操作を取り入れようとしてたんです!でも、Webブラウザ外にマウスポインターが出ると実装してたアルゴリズムでは正常動作しない!…oh

苦肉の策の矢印キー実装なんです…

 

さらには、ツイートの文章にミスがあってスコアを入れ忘れてビルドという凡ミス…手動で入れて頂けたやさしさ……

 

 

この方もunity1weekに参加していらっしゃいました

 

 

個人的に好きなゲームのひとつですw

目的がわかりやすい、操作しやすい、難易度難しい

うん、こういう感覚のゲーム好物なんですよー

 

いやはや、他にもたくさんの方がアップしていますね。なんと100作品以上あるそうです。

 

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

 

参加するのも遊ぶのもアリアリですね

 

次回も参加します!!

Smile Editor for VSCode 作成&公開しました!

Smile Editor

今回、Smile EditorというEditor拡張を作って公開しました。 https://marketplace.visualstudio.com/items?itemName=ItalangMong.smile-editor

demo.gif

Qiitaにも記事は書きましたが、こちらでも書きたいと思います。

初めてVSCodeのEditor拡張を作った

今回、初めてのjs開発、そして公開を行いました。くだらないエディタ拡張でありながら10installを超えるのは想像してませんでした。正直、3installかなとか思ってました。世界は広いですね。

どんなものかというと、笑顔じゃないとタイピングができないエディタ拡張となっています。便利でも何でもないです。とりあえず、プログラミングするときなのどのタイピングの時は笑わない…でも、笑った方がいいんじゃないか!?という発想の元作りました。ブラック感ありますね。

笑顔じゃないと、ファイルの今まで書いた部分が消されます。WebCamに顔が映ってなくても消します。とにかく、笑いましょう。

概要は、こんなものとしてjsでの開発でajaxというものを使おうとしていたのですが…画像をbase64にして、APIを叩くことがうまくできませんでした。何故…迷った末、ライブラリを使用しました。 jsの勉強不足感は否めないです…しかし、今後も便利じゃないエディタ拡張を作っていくためにがんばります!!

君の名は。 Another Side:Earthbound読みました!

 今年、かなりヒットした映画…「君の名は。」の別の視点または描かれなかった部分を補間してくれる小説です!

 

まず、個人的には、「君の名は。」面白かったです!つい、2回観てしまいましたww

新海作品は、元々好きなので尚のこと楽しめました!!

ネタバレは控えます。

…「君の名は。」を少し面白くするポイントとして…言の葉の庭秒速5センチメートルを観ることをおすすめします。

 

秒速5センチメートル [Blu-ray]

秒速5センチメートル [Blu-ray]

 

 

さてさて、本題に戻ります。Another Side:Earthboundですね!視点としては、主人公視点はもちろんのこと他のキャラクターの視点も……というか表紙にあるキャラクターの視点で物語が進行します。

映画のあのシーンではあの人はこう思っていたのか…とわかるようになっているため想像がしやすく読みやすいと思います。

これもネタバレを控えますが、個人的には四葉視点が好きですね!まさか…四葉がこんな体験をしていたとは…となります…w

是非是非、気になる方は読んで欲しいと思います。また、映画を観た人は是非おすすめします!!

君の名は。 Another Side:Earthbound (角川スニーカー文庫)
 

VRGameJam 参加してきた

11/27 28で行われていたVRGJ参加してきました!

 

VRハッカソン二度目でした!楽しかった!

 

福岡会場で参加していたのですが、スーパー銭湯的な場所の近くで温泉にすぐ入れる環境で、サイコーでした!!

 

はてさて、VRのゲームジャムってことで様々な作品ができていったんですよ…

自分たちは、ViveとMyoというデバイスをワンセットにしたFPS対戦ゲームを作ることにしました!!…オンライン対戦をしようとしたのですが難しいのなんの…UNETを使うことにしたのですが…うまくいかず…同期がーーー!!!っと悶えつつ開発してました。

 

結果?遊べるとこまで後1歩でできなかったです。楽しかったんですけどね(重要)



f:id:MakeTake:20161128135015j:image


 

コントローラーの新しい使い方とか模索してました。この状況でMyoで手をグーにすると弾のチャージをして腕につけたViveコントローラーのトリガーを押すと弾発射という中々いいコントローラーできましたよ!

 

空いてる時間に対戦が完璧にできるようにはしたい……できればw

大八耐2016!!

9月の24、25で行われた大八耐に参加してました!!

 

記事書くの遅れた…

 

まず、大八耐とは何ぞや!ってとこなんですけど、福岡で開催されているハッカソンです!以下参照

大八耐

たくさんの方々と交流ができる他、サイトにあるゲストとの方とも交流ができます!!こんなチャンスは滅多にないですよ!

 

さてさて、どんなものを作ったか紹介します!

Unityを使用して4人チームで制作しました!


f:id:MakeTake:20161009095826j:image

 

これ!…ぱっとわかんないですよね…

イメージとしてはプレイヤーはルービックキューブの中にいると考えてください。

敵をぶっ倒してスコアを競うゲームです!

ただ、倒し方が特殊です…今は背景が緑ですよね?これは、青の敵が倒せる状態なのです。

ルービックキューブのイメージでくるっと、背景を回転させることができます!…青の背景にすると赤の敵が倒せます…

 

わかりづらくて…申し訳ない…そして、画像も少ない…

 

今回、自分はシェーダーを初めて触ってみました!ShaderForgeは触ったことがあったのですが全てコードで書くのは、中々難しかったです…でもUnityが使いやすいように関数を用意していたので助かりました…

 

今後もシェーダーは触りたいですし、できれば追加で画像もシェーダーのコードも載せたいと思います…時間があれば…

 

…また、ハッカソン参加しながらニコニコでラジオ放送もしてました!「いたらじ」「ItalangMongラジオ」で検索すると出てくるかも…