勉強不足で至らんブログ

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

LICENSEファイルの中身を一つにまとめてくれるEditor拡張

自分のQiita転載です

qiita.com

GitHub等からAssetsを持ってきて、アプリをリリースする時などにLICENSEファイルをまとめるのがめんどくさいなぁと思ったりしませんか?僕は数回やってめんどくさいと思いました。

なのでEditor拡張でAssets配下の"LICENSE"ファイルを検索して"Assets/USE_ASSETS_LICENSE"にまとめるようにしてみました。

これで、ライセンス表記をする際に"Assets/USE_ASSETS_LICENSE"からtextを読んでもいいですし、開いてコピペでもいいと思います。良しなに使っていただければと思います。

public static class CreateUseLicenseFile
    {

        private const string USE_LICENSE_FILE = "use_assets_license_file";
        private const string fileName = "USE_ASSETS_LICENSE";

        [MenuItem("Assets/Create/Used LICENSE File")]
        static void CreateUsedLICENSEFile()
        {
            System.Text.StringBuilder builder = new System.Text.StringBuilder();

            string[] files;
            string assetPath = Application.dataPath + "/" + fileName;

            AssetDatabase.MoveAssetToTrash(assetPath);

            files = AssetDatabase.FindAssets("LICENSE");
            foreach (var guid in files)
            {
                if (Path.GetFileName((AssetDatabase.GUIDToAssetPath(guid))) == "CreateUseLicenseFile.cs" ||
                    Path.GetFileName((AssetDatabase.GUIDToAssetPath(guid))) == fileName) continue;
                var path = AssetDatabase.GUIDToAssetPath(guid).Substring("Assets".Length);
                StreamReader reader = new StreamReader(Application.dataPath + path);
                builder.Append(reader.ReadToEnd()).AppendLine();
                reader.Close();
            }

            string text = builder.ToString();

            if (AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object)) != null && EditorPrefs.GetInt(USE_LICENSE_FILE, 0) == text.GetHashCode())
                return;

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

こういう拡張があったら二番煎じですみません。。。

最近、作り始めたフレームワークの中に入れています。もし、ご興味のある方は是非。 https://github.com/MizoTake/MomijiFramework/blob/master/Editor/CreateUseLicenseFile.cs

シンプルなアクションゲーム Reviver を公開しました!

 約4ヶ月ほどの開発を得て、ひとまず公開できるレベルになったので公開しました!

現在、Androidのみ対応です。片手でタップするだけでも遊べます。

 結構シンプルにまとめたつもりです。操作も簡単ですが、人によっての遊び方に幅が少しでも出るようにしたつもりです。是非、インストールしてください!

 

play.google.com

 

 ちなみに、これはゲームエンジン Unityで制作してます。

 今回、デザイナーと一緒にやらず1人でどこまでできるのか試すために作ったのですがキャラクターはCubeのままで公開まで行きました。開発途中でちょうどテラシュールブログの方で

tsubakit1.hateblo.jp

が公開されてタイミングがすごくよかったです。これを見て参考に実装しました。人間のようなキャラクターがなくてもCubeをアニメーションさせるだけで全然違いますね。

 

また、今回使用したAssetsは

UniRx

DoTween

Material UI

上記3つです。

Material UI はAssets Storeからではなく古いバージョンであればGitHubから使用できたので使用しました。

https://github.com/InvexGames/MaterialUI

 

 気になって買ったAssetsもあったんですが開発途中だったのもあり使用しませんでした。
 ・Arbor2

GUIで状態管理ができるようになるAssetsです。次回から使っていこうと思っています。 

 

また、アイコンに関してはGoogleが提供している

material.io

を使用することで1人で作っても、アプリっぽい見た目になったと思います。

 

音は

dova-s.jp

を利用させていただきました!結構、色々な雰囲気の音があってBGMもSEもここで見つけました。

 

 そして、ランキング機能があるのですが、Google Spread Sheetを使用したGoogle App Scriptで実装しています。なので、ランキングはアプリのプレイヤー全員が相手ということになります! 

 無料で使えて簡単にランキング等なら作れるのでおすすめです。

 

 今回、社会人になって初めて作ったのですが思ったよりも時間がとれなくて焦ってしまいました。学生のうちにサクサク作って、公開していればよかったとしみじみ思います……でも、作れる時に作ればいいので、これを皮ぎりに作っていこうと思います!

UnrealEngine4をGPD Pocketで動かしてみた

大八耐というイベントにGPD PocketでUnity動かして参加していました。

 

途中で、ふと疑問…UnrealEngine動かしたらどうなるんだ?

 

動かしました。

www.youtube.com

 

ついでにFPSを表示しています。平均20くらいですかね。

全く動かないわけではないです…軽いものであれば電車でUnrealEnigneも…?

大八耐2017 in 東京参加してました!

ちょくちょく記事に書いている八耐…の大きいやつ大八耐が10/7, 8であっていたのでゲーム作っていました。

 

Sphicと言います。

www.youtube.com

 

球を数珠のようにつなげて蛇にするのですが、あまりうまくいっておりません。

さらには対戦させたかったのですが間に合いませんでした。

チームで分担していたものの、うまく分担できてなかったような気もしてみます。

 

自分はゲームのメインロジックは触ってないので何ともです。精進せねば…

 

大八耐の他の方の作品は、面白いものから完成度の高いもの…料理…様々なものが作られていました!

福岡の記事ですが、雰囲気としてはこんな感じ…

大八耐2017 中間発表会が終わりました!|新着情報|大八耐

 

モノ作りの幅がないハッカソン…様々な作り手の方がいるので面白いです。。。

 

余談ですが、GPD Pocketで参加しておりました。

f:id:MakeTake:20171009012326j:plain

怖かったです。

なんとか復旧はしましたけど…

f:id:MakeTake:20171009012432j:plain

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

6月に引き続き第2回の東京八耐を開催しました!!

 

www.facebook.com

 

今回も前回同様、20名程の参加者の方々が来てくださいました!

 

そして、今回は…発表時に写真を取り忘れることが多く…手元にあまりないですが、紹介していこうと思います!申し訳ないです!

 

・Lazy Kの処理経過を表示するプログラムの作成

・Swiftで大喜利のお題を出すアプリの制作

・アプリのアイコンを変化させるYES NO枕アプリ

・気温が一定以上になると怪談話を話し出すIoTデバイス

・Processingで花火を打ち上げる壁紙作成

・リアルな背景等を利用したコンセプトアート

・EDM風ゲーム音の作成

・Unityでノイズをパーティクルやキャラクターに適応させるシェーダー

Blenderでエフェクトの作成

f:id:MakeTake:20170828011018j:plain

・Sprite Lampを用いた2D絵の作成

・pixivの画像を制作者好みに扱うソフトウェアの作成

f:id:MakeTake:20170828011453j:plain

・あくびが伝達する……ソフトウェア?

f:id:MakeTake:20170828011553j:plain

・暗号化をテーマにしたアナログゲームのルール作成

 

以上が今回の八耐で発表されていたものです!

制作が途中までしかできなかったものや、前回の八耐から改良されていっているもの…様々ですが色々な作品が見れておもしろかったです!

 

www.facebook.com

 

次回の八耐は、10月 7, 8日 大八耐 という2日間あるイベントになります!

場所は、前回、今回と変わらずドリコム様の会場を借りる予定です。いつもの八耐とは違い少し大きなイベントになりますのでご興味がある方は是非お願いします!

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

 

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

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

 

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