0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Unity]AssemblyDefinitionを跨いだ共通クラスの作成

Posted at

前提
・Assetをインポートしすぎて60個くらいAssemblyDefinitionできちまったぜ!てへっ!
・グローバルなDebugクラスはHighBridRender(ver8.2.0)で定義されててこっちで定義するとビルドエラー!うへっ!
 ⇒やめてほしい
・AssemblyDefinitionに共通クラスを追加するの面倒だな(今後も含めて)
・ECSとか何万個のオブジェクトをゴリゴリ動かすから少しでも負荷になることは避けたい…ンゴ。

やることは大まかに以下の通り。
<手順>
1.クラスライブラリ(DLL)を作成。
 ⇒VisualStudioで適当にプロジェクト作ってビルドでおk
2.クラスライブラリをAssets/Pluginsのどこかにおく。
 ⇒Assets/Plugins/DLLとかネストしてておk
3.どこででも1.で作成したクラスライブラリが使えるようになる。
 ⇒\(^o^)/やた

<メリット>
・AssemblyDefinitionにわざわざ追加しなくていい。
 [Plugins]⇒[各AssemblyDefinition]⇒[Assembly-CSharp]の順で参照されるらしい。詳しくは知らんが動く。
 #最初はクラスライブラリをUnityのクラスライブラリ群に突っ込んだりしていろいろ試してた。
 [Plugins]にAssemblyDefinition作って置けばいいんじゃね?っていってもできんかった。
 ワイももっと楽がしたかった

<デメリット>
・クラスライブラリのビルド忘れとかがある場合がある。
・クラスライブラリから[Assembly-CSharp]とか[各AssemblyDefinition]の参照ができない。
 ⇒1回目はプレイボタンをエラーなく押すと動くけど、2回目以降は参照がおかしいとUnity様に怒られる。
  バグだと思っているが直るの待つのは愚策なので参照できないと割り切って作る。
  クラスライブラリなので処理を独立させましょう。

<例>
DebugLog用のオーバーラップクラスでいい感じに作れるんじゃないかと思われる。

DebugS.cs

// 1.共通クラスライブラリ(DLL)
//  ネットのどこかにあるDebugLogのオーバーラップクラス
using UnityEngine;
public static class DebugS
{
#if !ENABLE_DEBUG_MODE
    private const string CONDITIONAL_TEXT = "UNITY_EDITOR";
#else
    private const string CONDITIONAL_TEXT = "ENABLE_DEBUG_MODE";
#endif
    /* 略 */
    [Conditional(CONDITIONAL_TEXT)]
    public static void Log(object message, LogLevel level)
    {
        if ((int)Ground.In.Value >= (int)level) UnityEngine.Debug.Log(message);
    }
    /* 略 */
}
namespace Ground
{
    public enum LogLevel { None,Low,Mid,High}
    public class In {public static LogLevel Value = LogLevel.None;}
}

使用例(上記DLLを[Assets/Plugins/DLL]とかに配置後)

Hogehoge.cs
// UnityのどこかのDebugLog出力ソースコード
// 参照設定やUsingは不要(でーん!)
protected override void Initialize()
{
    if (!LoadThisData(SettingsSavePath))
    {
        DebugS.LogError($"Fail Load {SettingsSavePath}");
    }
    if (AutoSaveFlag)
    {
        StartAutoSave(DuloGames.UI.UIManager.Instance);
        DebugS.Log("AutoSave", Ground.LogLevel.High);
    }
    else DebugS.Log("Not AutoSave", Ground.LogLevel.High);
}
// ログ出力レベルの変更
void ChangeDebugLoglevel(Ground.LogLevel level)
{
    Ground.In.Value = level;
}

Unity標準のDebugクラスがオープンソースコードだったら喜んでたけど探してもなかったのであきらめた
(オーバーラップしたかった)

これが一番っょぃと思います。

元のDebugぶっ壊せてもユーザ環境壊せんから仕方ないな、これで勘弁してやろう。
俺より強いやつに会いに行く。(いまここ)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?