【Unity】アセットがどこで使われているか確認する方法

・この画像どこで使ってたっけ?
・この画像使ってない気がするから消したいけど、本当に使ってないけ?
 (てきとーに消して動かなくなる機能とか出てきたらやばいな…)

っていう場面はよくあると思うんだけど、そんな時に私がやっていること。

アセットのGUIDを grep する

grep -r [GUID] [Assetsとか指定したいフォルダを指定]

GUIDはどこでわかる?→metaに書いてあるよ!

調べたいアセットと同じフォルダ内にあるmetaをテキストエディタで開いて確認できる


実行例
「batsu.png」という画像は、common.spriteatlas で使われていることがわかる。

$ grep -r 619c2c1970fdcf7418b5ca361000652b ./Assets/
./Assets/Resources/SpriteAtlas/common.spriteatlas:  - {fileID: 21300000, guid: 619c2c1970fdcf7418b5ca361000652b, type: 3}
./Assets/Sprite/batsu.png.meta:guid: 619c2c1970fdcf7418b5ca361000652b

文字列検索

ファイル名の文字列検索もする。

Resouces フォルダにいれているものはソース上で以下のようにファイル名を指定しているはずなのでこれに対応するため。

Resources.Load<TextAsset>("Text/jsonFile01");

ちなみに、アセバンだったりでファイル名を文字列で指定して使っているところがあるので、Resouces 配下にあるファイルではなくてもした方がいい。

【自動化】JenkinsでFirebase App Distributionにアプリをデプロイする(Windows10)

Firebaseのサービスの一つに「App Distribution」というものがある。

DeployGate や TestFlight 等使ったことがある人ならわかるが、それらと同じような機能だ。
apkやipaをビルド→「App Distribution」にデプロイ→テスターや開発者に届くメール内のURLにアクセスすることで即インストールできる。 というもの。

そして今回は、「App Distribution」にデプロイ の部分を自動化するために、jenkinsを使う。
最終目標は、jenkinsで定期的にビルドをし、自動で「App Distribution」にデプロイする 環境を作ること。
毎朝、最新のビルドをPCを操作しなくても確認できる、そんな環境を作って開発を効率よくさせること。

今回の記事は、jenkinsで「App Distribution」に自動デプロイ する部分についてのみ記載しています。

  • 公式リファレンス
  • firebaseコマンドを使える環境を作ろう
  • アプリIDを確認しよう
  • jenkinsでログインするために認証トークンの発行しよう
  • firebaseコマンドでアプリをデプロイしてみよう
  • jenkinsからアプリをデプロイしてみよう
  • 引っかかったところ
    • スタンドアロン バイナリ(exe)だとjenkinsで実行できない
    • 既にデプロイされているアプリと同じものはデプロイされない
続きを読む

【C#】C#のenumでメソッドやフィールドを定義する方法

自分はjava出身のなので、C#のenumがメソッドやフィールドが定義できないのが不便だったのですが、
拡張メソッド使ってjavaのenumに近いことができる。
現場でもこれを使っている人が多いので割とスタンダードな方法っぽいです。


まずはこんなenumを例にして説明を書いていくぞ。

public enum SHOP_TYPE
{
    DECO, //デコ
    GROUND, //床
    FOOD, //ごはん
    GOOD, //備品
}

基本的な方法

まずは一番シンプルな方法。このenumの拡張メソッドを作ります。

public static class EnumExtension
{
    //ショップ商品タイプ名
    public static string GetShopTitle(this SHOP_TYPE shopType)
    {
        switch (shopType)
        {
            case SHOP_TYPE.DECO: return "デコ";
            case SHOP_TYPE.GROUND: return "床";
            case SHOP_TYPE.FOOD: return "ごはん";
            case SHOP_TYPE.GOOD: return "備品";
        }
        return "";
    }

    //ショップ商品タイプごとの説明
    public static string GetShopInfo(this SHOP_TYPE shopType)
    {
        switch (shopType)
        {
            case SHOP_TYPE.DECO: return "デコを購入して庭を飾り付けよう";
            case SHOP_TYPE.GROUND: return "庭の地面を変更するよ";
            case SHOP_TYPE.FOOD: return "キャラクター達の食料";
            case SHOP_TYPE.GOOD: return "いろいろなものが売っているよ";
        }
        return "";
    }
}

▼使う側はこんな形で使える

//unityなら「デコ-デコを購入して庭を飾り付けよう」とコンソールに表示されます
Debug.Log(SHOP_TYPE.DECO.GetShopTitle() + "-" + SHOP_TYPE.DECO.GetShopInfo());

この実装方法の良くないところ

ただこの実装方法には、懸念がある。
enumの定義を追加したら、拡張メソッドのcase文も追加する必要があるが、追加し忘れる可能性がある。
javaなら必ず各メソッド内の内容を定義しなおさないとコンパイルが通らない状態が作れるが、上述した方法だと、
case文に追加しなくてもコンパイルは通ってしまうので、実行するまでバグに気づくことができないのである。

とはいえ、これを解決しようとするとこのくらいの実装が必要になってくる↓

bleis-tift.hatenablog.com

【Unity】スクショとるエディタスクリプト

スクショとるエディタスクリプト

プロジェクトのルートディレクトリの直下(Assetsとかと同じ階層)に「ScreenShot」フォルダが作られ、そこに配置される。

using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Runtime.CompilerServices;

public class ScreenShotCapturer : MonoBehaviour
{
    private const string Path = "ScreenShot/";
    [MenuItem("MyTools/Caputure ScreenShot")]
    private static void Capture()
    {
        var assetPath = string.Format(System.IO.Path.Combine(Path, "ScreenShot_{0}.png"),
            DateTime.Now.ToString("yyyyMMddHHmmss"));
        SafeCreateDirectory(Path);
        ScreenCapture.CaptureScreenshot(string.Format(assetPath));
        Debug.Log($"スクリーンショットを保存しました: {(Application.dataPath).Replace("Assets", "") + assetPath}");
    }

    private static DirectoryInfo SafeCreateDirectory(string path)
    {
        var fullPath = (Application.dataPath).Replace("Assets", "") + path;
        return Directory.Exists(fullPath) ? null : Directory.CreateDirectory(fullPath);
    }
}

git ignore に追加を忘れないように

git管理しているプロジェクトなら、「ScreenShot」フォルダはignoreしておこう:)

【Unity+C#】メンバ変数のスコープはなるべく狭くしたい!定義の仕方まとめ~

変数やメソッドのスコープは 一番狭く、使う時に広げてね。
というのが私のいつもの方針である。賛否あるかもだけど、今回はその方針の元書きます。
C#の話がほとんどですが、Unityだとインスペクタに表示するかどうかも関係してくるのでまとめた。

続きを読む

【Unity2019.4】ポストプロセス:非URPとURPの適応の仕方の違い

URPと普通の3Dテンプレートから作ったプロジェクト(以下、非URPと書きます)で、
ポストエフェクトの適応方法が違うのでまとめました。

  • この記事を書いたときの環境
  • URPか確認する方法
    • Settingフォルダに設定ファイルがある
    • カメラの設定項目が異なる
  • 非URP
    • 光るオブジェクトを用意
    • 適応方法
  • URP
    • 光るオブジェクトを用意
    • 適応方法
  • 違いまとめ
続きを読む

【Unity】【疑問】SpriteAtlasに入れたSpriteをコードからでなく直接InspecterアタッチしてもSpriteAtlasがちゃんと使われているのか?

UnityのSpriteAtlasについて前から疑問だったのが、直接インスペクターでspriteをアタッチしても、
ちゃんとパッキングされたSpriteが使われているのか?ということである。

なぜそういう疑問を持つかというと、
インスペクタでアタッチした場合、SpriteAtlasでパッキングされているかどうか?どのアトラスに入っているか?
など、アトラス自体を意識しないで設定できるからだ。

  • 結論
  • 検証
    • パック前
    • パック後・Inspecter
    • パック後・コードでspriteを指定
続きを読む