【Live2D入門①】Live2Dのモデルをunityで表示する

サンプルをダウンロード

www.live2d.com

サンプルデータは上記からダウンロードすることができる。

今回は、一番難易度が低い「マークくん」をダウンロードしてみた。→「mark_free_jp」というファイル

Unityで2Dプロジェクトを作成

unity hub で new Project

今回は普通の(URPじゃない)2D テンプレートを選び、任意のプロジェクト名を付けて Create Project をする

使う用途によりますが、今回はプラットフォームをandroidに変えておきます。

Live2D Cubism SDK for Unity を導入

www.live2d.com

CubismSdkForUnity-4-r.5.unitypackage がDLされる(数字はバージョンで変わると思われます)

Assets -> import Package -> Custom Package からDLしたパッケージを選んでインポートする

インポートされるとこのようになります。

モデルのインポート

最初にサンプルとしてDLしておいたマークくんのモデルを取り込みます。
DLしたファイル「mark_free_jp」をそのままProjectビューのAssets配下の任意の場所へドラックアンドドロップします。

今回はとりあえずモデルの取り込みのみ行いたいため
以下のファイルだけインポートしました。

※今回はAssets直下に置いてます

読み込み時にプレハブが自動で作られます。

プレハブをシーンに配置して、ゲームを起動するとモデルが表示されます。
※初回はゲームを起動するまでは表示されないらしい。

マークくんの目が表示されない時


↑こんな風に表示されてしまった場合、おそらく最初のプロジェクト再生で2Dではなく、3Dを選んでしまっている可能性が高い。

そんなときは、カメラの設定のProjectionを「Orthographic」に変更すれば表示される。

【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の拡張メソッドを作ります。
※拡張メソッドは、static class にしか書けないので注意

public static class FadeEnum
{
    public enum FadeType
    {
        BASIC,
    }

    //enum -> string
    public static string GetFadeTypeVal(this FadeType fadeType)
    {
        switch (fadeType)
        {
            case FadeType.BASIC: return "透過フェード";
        }
        return string.Empty;
    }

    //string -> enum
    public static FadeType GetFadeType(string val)
    {
        foreach (FadeType value in Enum.GetValues(typeof(FadeType)))
        {
            if (value.GetFadeTypeVal().Equals(val))
            {
                return value;
            }
        }
        return FadeType.BASIC;
    }
}

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

string val = FadeType.BASIC.GetFadeTypeVal();
FadeType type = FadeEnum.GetFadeType(val);

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

ただこの実装方法には、懸念がある。
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
    • 光るオブジェクトを用意
    • 適応方法
  • 違いまとめ
続きを読む