のにっき

usingクラス取得ツール作った

namespaseを利用してクラス名を書かずに

別クラスのメソッド等を呼び出す方法がとても便利なのですが、

「using static ○○○」をスクリプトファイルごとに書くのが面倒くさい!

ということで、簡易的にツール化したのでご紹介します。

 

  

クラス名を書かずに別クラスのメソッド等を呼び出す方法

下記URLで説明してますので、ぜひご一読ください・・・

【C#6】別スクリプトの関数・定数を簡潔に呼び出す方法 - のにっき

 

ツール置き場 

仕様書も置いているので一緒に落として確認してみてください。

github.com

 

使い方 ※仕様書抜粋

1)まずは、Assetsフォルダのパスを記入(ファイルのD&DでOK!)

f:id:apuridasuo:20191108194043p:plain

図:初期設定

2)「検索開始」ボタン押下で「using static ○○○」リストを出力!

  ※そのまま貼り付けれる形式でリスト化されてます

f:id:apuridasuo:20191108194108p:plain

図:検索開始時の挙動

3)namespaseごとに、表示の切り替えができる様になってます

f:id:apuridasuo:20191108194128p:plain

図:チェックボックスの仕様

4)パスの記入内容は「保存する」にチェックしておくと、次回起動で

  パスが記入された状態で開かれるのでとても便利です。

f:id:apuridasuo:20191108194159p:plain

図:パスの保存チェック仕様

 

 以上です。

ぜひ使ってみてご意見・ご感想などいただけたら嬉しいです!

 

○進数を○進数に変換する関数

私の会社は16進数のデータをいじくりまわすことがある。
いちいち「Convert」を使って変換するのもめんどくさいので
各進数を別の進数に変換する関数を作成しました。

ソースコード

        /// <summary>
        /// 進数変換モード
        /// </summary>
        public enum Md_Conv
        { c10to2 = 0, c10to16, c16to2, c16to10, c2to10, c2to16 };

        /// <summary>
        /// ○進数を○進数に変換
        /// </summary>
        /// <param name="Mode">進数変換モード</param>
        /// <param name="SetWord">変換文字</param>
        /// <returns>変換後の文字※桁合わせしてる</returns>
        public static string Get_ConvertNum(Md_Conv Mode, string SetWord)
        {
            string setNumOff = SetWord.Trim();
            string cnv = "";
            switch (Mode)
            {
                case Md_Conv.c10to2:
                    cnv = Convert.ToString(int.Parse(setNumOff), 2);
                    cnv = cnv.PadLeft(8, '0');
                    break;
                case Md_Conv.c10to16:
                    cnv = Convert.ToString(int.Parse(setNumOff), 16);
                    cnv = "0x" + cnv.PadLeft(2, '0').ToUpper();
                    break;
                case Md_Conv.c16to10:
                    cnv = Convert.ToInt32(setNumOff, 16).ToString();
                    break;
                case Md_Conv.c2to10:
                    cnv = Convert.ToInt32(setNumOff, 2).ToString();
                    break;
                case Md_Conv.c16to2:
                    cnv = Convert.ToInt32(setNumOff, 16).ToString();
                    cnv = Convert.ToString(int.Parse(cnv), 2);
                    cnv = cnv.PadLeft(8, '0');
                    break;
                case Md_Conv.c2to16:
                    cnv = Convert.ToInt32(setNumOff, 2).ToString();
                    cnv = Convert.ToString(int.Parse(cnv), 16);
                    cnv = "0x" + cnv.PadLeft(2, '0').ToUpper();
                    break;
            }
            return cnv;
        }

使用例

▼ テストソース

            // テスト用変数作成
            int Num_10sin = 4095;
            string Num_2sin = "0111";
            string Num_16sin = "FFFF";
            string Num_16sin2 = "0x00FF";
            // 各進数表記に変換
            string Result = "";
            Result = "◆ 10進数「Num_10sin ("+ Num_10sin + ")」を変換\r\n";
            Result += "16進数:" + Get_ConvertNum(Md_Conv.c10to16, Num_10sin.ToString()) + "\r\n";
            Result += " 2進数:" + Get_ConvertNum(Md_Conv.c10to2, Num_10sin.ToString()) + "\r\n";
            Result += "◆  2進数「Num_2sin (" + Num_2sin + ")」を変換\r\n";
            Result += "16進数:" + Get_ConvertNum(Md_Conv.c2to16, Num_2sin) + "\r\n";
            Result += "10進数:" + Get_ConvertNum(Md_Conv.c2to10, Num_2sin) + "\r\n";
            Result += "◆ 16進数「Num_16sin (" + Num_16sin + ")」を変換\r\n";
            Result += "10進数:" + Get_ConvertNum(Md_Conv.c16to10, Num_16sin) + "\r\n";
            Result += " 2進数:" + Get_ConvertNum(Md_Conv.c16to2, Num_16sin) + "\r\n";
            Result += "◆ 16進数「Num_16sin2 (" + Num_16sin2 + ")」を変換\r\n";
            Result += "10進数:" + Get_ConvertNum(Md_Conv.c16to10, Num_16sin2) + "\r\n";
            Result += " 2進数:" + Get_ConvertNum(Md_Conv.c16to2, Num_16sin2) + "\r\n";
            MessageBox.Show(Result,    "出力結果");

▼ 出力結果

f:id:apuridasuo:20191108153238j:plain
図:出力結果

関数概要

上記の感じで「16・10・2」進数の相互変換を行うことができます。
注意点としては、
10進数だろうが何だろうが文字列型でやり取りしている点です。
なので、数値型を引数として渡す場合はテストデータのように「ToString()」で文字列に直してください。
また、16進数の戻り値の表記は「0x」が頭について大文字になってます。
また、関数内の「cnv.PadLeft」の引数で0埋めの桁数を調節できます。

Scroll View内に高さが可変のノードを作る

ScrollViewの要素の高さを可変にしたい!

ScrollViewの要素にScrollViewを入れたい!という方にオススメ

設定を変えるだけで意外と簡単にできたので方法をまとめておきます

 

 

ヒエラルキーの内容

下図の感じでオブジェクトを設定します

「Scrl_Parent -> Content_P」の中にノード(P)を追加していくスクロールがあり、

そのノード(P)の中に、ノード(C)を追加していく。という仕様になります。

 

f:id:apuridasuo:20191029175150p:plain

図:オブジェクト構成

高さが可変のノードとは

ノード(C)が追加されるたびにノード(P)の高さが調節されるという仕様です。

スクロールのノードの高さがノードごとに可変であるという事がポイントです。

f:id:apuridasuo:20191029175711p:plain

図:実際の挙動

各オブジェクトの 設定

まずは、いつも通りScrollViewを作ってください。

その上で変更のある点は下記の2点です。

・親スクロールのContentオブジェクトの「○○ Layout Group」

「Control Child Size」にチェックを入れる

・親スクロールに追加するノードに「○○ Layout Group」を追加する

 

▼ 下図の設定は「ヒエラルキーの内容」項目のオブジェクト名と

照らし合わせて参考にしてください

f:id:apuridasuo:20191030093525p:plain

図:各オブジェクトのInspector内容

 

以上で、ScrollView内のノードに高さが可変のノードを作成することができます。

 

NCMBとGoogleAdMobの競合によるビルドエラー解決法【2019年10月】

何番煎じか分からない項目なのですが、

シャキッとした答えが見つからなかった。

バージョンの違いで対応が違っていたので

現バージョンのパッケージで解決した方法をまとめときます。

 

 

パッケージのバージョン

GoogleMobileAds・・・v4.0.0

NCMB・・・v4.0.3

ビルドエラー時の状況

・NCMBパッケージを先にインポートする

 →たぶんこれがビルドエラーの原因

・GoogleMobileAdsパッケージをインポートしてビルド

▼下図のエラー発生

UnityEditor.BuildPlayerWindow+BuildMethodException: 528 errors

CommandInvokationFailure: Gradle build failed.

f:id:apuridasuo:20191029113628p:plain

図:エラーメッセージ

今回行った対処法

NCMBパッケージでインポートした「Plugins -> Android」内のファイルを削除

ビルドエラーの原因は、ライブラリの競合にあるので

NCMBパッケージでインポートした

Pluginフォルダ内のファイルを削除して競合しないようにします。

◆削除するファイル名

・firebase-analytics-impl-16.0.0

・firebase-common-16.0.0

・firebase-iid-16.2.0

・firebase-iid-interop-16.0.0

・firebase-messaging-17.1.0

・play-services-base-15.0.1

・play-services-basement-15.0.1

・play-services-measurement-base-15.0.0

・play-services-tasks-15.0.1

・support-compat-26.0.2

・support-core-utils-26.0.2

・support-v4-26.0.2

f:id:apuridasuo:20191029115108p:plain

図:削除するファイル一覧

f:id:apuridasuo:20191029115712p:plain

図:削除前後の「Plugins -> Android」フォルダ

 

ビルドしてみる

これで上手くビルドが出来ているはずです。

ビルドエラーが発生したとき、

パッケージを複数インポートした場合は

ライブラリの競合が発生している可能性が多々あると思います。

そういった場合は、

1.検証用に新規プロジェクト(AAA)を作る

2.エラーの出るプロジェクトに入れたパッケージを(AAA)に入れる

3.インポートした「Plugins」フォルダのファイルを

 パッケージごとに消していきエラーが回復するか確認する

このやり方で、競合するファイルが何か判別できると思います。

 

teratailで質問する前にやっておくべき事

teratailを質問者として利用してばかりじゃ申し訳ないと思い、
若輩者なりに回答者としていくつか回答してみました。
その中で、質問者として最低限行ってほしいと思ったことをまとめます。
※必ずしろ!というわけではなく、してもらえると回答シヤスイナーです

teratailとは?

プログラム実装で詰まったら質問できるサイトです。
私のように教わる人のいない状況で勉強している方には非常に便利なサイトになります。
teratail.com

ソースコードを貼るときはタグで囲む

これは必ず行って下さい。利用する方でできていない方が結構います。
teratailは、ソースコードをタグで囲むことで見やすくする機能があります。

f:id:apuridasuo:20191019112223p:plain
図:タグ説明
記入方法を以下にまとめるので知らない方は必ず確認して下さい!
f:id:apuridasuo:20191019112350p:plain
図:ソースコード記入方法
この書き方でソースコードを記入すれば、背景色も変わり、
コメントや変数などの色付けもされてとても見やすい表示になります。
f:id:apuridasuo:20191019112755p:plain
図:プレビュー結果

エラーの内容でググる

バグが発生して何が間違っているのかわからない場合、
ログにエラーが出ていないか確認してみて下さい。
そして、エラーの文字をコピーしてググってみましょう。
意外とネットには解決方法が載っているので質問する前に解決できます。

自分の書いたソースを理解してから質問する

ソースコードをコピペしてバグって訳がわからない!ということがあった場合、
そのまま質問しても、回答者の回答が何を言っているのか分からないと思います。
コピペしたコードを部分的にググってみて、
自分の書いたソースの内容をある程度勉強して下さい。
そうすれば、バグの原因がわからないとしても、
回答者が何をいっているのか理解することができると思います。

質問したいこと、求めている回答を明確にした質問をする

何が分からないか分からないという状況で質問しないよう気をつけましょう
・何を目的としたコードを組んでいるか
・現在の挙動はどうなっているか
・何を回答してほしいか
以上の項目は自分で考えて、明確にしてから質問しましょう。

自分でソースの状況を把握しておく

ソースの組み込みを行う上で、
プログラムの実行中に一時停止を行って変数の内容などを確認たりします。
そういったデバッグ方法をいくつかご紹介します。
※実装環境でやり方は異なるので、「VisualStudio ブレーク 方法」
 のように検索していただけると方法が出てくると思います。

  • ブレーク(ポイント)

ブレークは、設定した場所で処理を一時停止させる機能です。
ブレークポイントを設定した状態でプログラムを実行すると
設定した場所に処理が到達した時点でプログラムが一時停止します。
ブレークポイントを設定することを「ブレークを貼る」ということがあります。
【使用例】
・if文等の分岐でブレークを貼ってどの分岐が通っているか調べる
・問題のある処理でブレークを貼って、その時の変数の値などを確認する
・反応しない関数を呼ぶ処理にブレークを貼ってその処理が通っているか調べる

  • ログ(メッセージ)

ログは、処理の中で指定した文字をコンソール等の、
実際には影響のない部分に出力させる機能です。
【使用例】
・if文等の分岐で通ってはいけない場所にログを実装して「ログ出力=バグ」とする
・変数設定後に変数の内容をログで出力する事で見えない変数の内容を把握する
これらのデバッグ方法を使って質問の前に
不具合の原因を探してみてある程度の目星をつけておくと
回答者とのやり取りが非常にスムーズになります。

質問しない!

上記のデバッグ方法とネットの力を駆使したら
メジャーな問題はたいてい解決できます。
まずは自力で解決する!これが良い質問をする最大のコツだと思います。
自力で解決する努力を行うことで問題への理解が深まり、
質問する際に相手に伝えるべき項目をまとめて質問することができます。
また、回答者は専門的な用語を踏まえて回答をくれるときが多いですが
調べることに慣れていると戸惑わずに対応できると思います。

以上になります。
回答者の方々はきちんと対応すれば良い方ばかりです。
変な感じになったな~と思ったら大体自分の対応が悪かったと思って
めげずに頑張って下さい。

今後アニメ化されそうなコミック紹介

あまりに暇なので、完全に趣味ですが

Amazon商品紹介機能を試しに使ってみたいと思います。

 今後、アニメ化確実のおもしろ漫画をご紹介

暇なときに本ばっかり読んでたら結構な数になっていました。

しかも、最近私が読んでる本がことごとくアニメ化されていたことを知り、

私が読んで面白かった本は全部アニメ化される理論で面白かったものをご紹介します。

あらすじも私が適当に書いてるので変なとこあったらご勘弁を!

 

あやかしこ【現6巻】

・アニメ化される度

 ★★★★★【5/5】

・ジャンル

ほのぼの日常系、絵が綺麗、非4コマ 

・あらすじ

主人公はちょっと引っ込み思案な女子高生マホロ。

そんなマホロが住む家「あやかし荘」には3人の妖が住んでます。

引っ込み思案なマホロが唯一自分らしく接することが出来る妖たち。

個性豊かな妖たちとのドタバタコメディーや、

妖を通じて成長するマホロの人間ドラマを描いた作品。

・感想

絵もきれいでキャラに個性があってちゃんと話に落ちがある。

ストーリーが進むにつれてマホロの世界も広がっていって

新しい面白さがどんどん押し寄せてくるので飽きることがない。

パワプロで言ったらオールA評価なぐらいバランス良く全部良い作品です。

1巻読んでから「確実に人気出るしアニメ化されるわー」と思ってたら

全然アニメ化されないからもどかしい気持ちでいっぱいです。

 じけんじゃけん【現6巻】

じけんじゃけん! 1 (ヤングアニマルコミックス)

じけんじゃけん! 1 (ヤングアニマルコミックス)

 

・アニメ化される度

 ★★★★☆【4/5】

・ジャンル

ギャグ、学園もの、推理?もの、非4コマ 

・あらすじ

舞台はある高校の同好会「ミステリ研究会」。

ミステリが絡むと真っ直ぐな馬鹿になる会長ゆりこと、

ゆりこに探偵の才能を認められた、唯一の会員にしてミステリ素人といり。

学校の日常もユリコにかかれば謎となる!

時にはユリコが死体となって謎を作っちゃう突拍子もないアホな行動に

翻弄されるといり達を描く探偵?コメディー

・感想

ユリコが突拍子もない事をやるけど、読んでて「こいつならやるわぁ~」

と納得できるぐらいちゃんと各キャラの人間性を描いてくれている。

日常に潜むアホを丁寧に描写しているので要所要所で腹抱えて笑える。

アニメ化しそうだなと思った理由は、

キャラの決め台詞が決まっていてバズりそう。

ちょいちょい作者の性癖が垣間見えるエロ要素がある。

ので、アニメ化したら人気が出そうだなと思ったからです。

スライム倒して300年、知らないうちにレベルMAXになってました 【現5巻】

・アニメ化される度

 ★★★★☆【4/5】

・ジャンル

異世界転生もの、ほのぼの日常、非4コマ 

・あらすじ

過労で死んじゃったけど不老不死の力を手に入れて異世界に転生したアズサ。

現世でできなかったスローライフを300年送っていたアズサだが、

日課としていたスライム退治のおかげでLvMaxの最強魔女に!?

だけど別に冒険しません。ゆったりほのぼの異世界を楽しみます。

普通じゃない最強魔女の、普通な日常を楽しく描いた作品。

・感想

今流行というかお腹いっぱいの異世界転生ものだけど、

中身がしっかり面白いから関係なく楽しめる作品。

アズサが「現世での実体験」からスローライフ意識をちゃんと持ってるからこそ、

異世界の人たちと交流を深めていく過程で

「周りをしっかり巻き込んでほのぼのさせる努力をする」ので

皆が周りのことを考えるようになる優しい成長がしっかり見れる面白さがあります。

原作はラノベなのですが、原作も面白いのでぜひ読んでみて下さい。

どうせ異世界転生ものばっかりアニメ化するなら早いところこの作品をアニメ化してほしいです。

 

まとめ

まだまだ紹介したかったのですが、あらすじと感想書くのだるいです!

2作品目で完全に飽きました・・・(泣)

また暇なときに書いてみたいと思います。

クラス配列作成時に要素がnullになるのを防ぐ方法

最近、Listばっかり野郎から、配列も使ってやろうに変化したのですが、

クラス型の配列を作成した時の問題と対応をまとめておきます。

配列定義時の中身が・・・

適当なクラスの配列を作成してみます。

        // 適当クラス
        public class TestClass
        {
            public int _Id = 0;
            public string _Name = "";
        }
        // 起動時イベント
        void Start()
        {
            TestClass[] a_TestClass;
            a_TestClass= new TestClass[10];
            // ↓↓変数に値を設定しようとするとエラーになる↓↓
            a_TestClass[0]._Id = 1;
        }

こんな感じでクラス配列を作成した後、
要素のクラスに変数を設定しようとするとエラーになるはずです。
この理由は、
「クラス型の配列作成時、要素は全てnullになっている!」からです。
なので、すべての要素にインスタンスを作成する処理

    a_TestClass[0]= new TestClass();

この処理を行わないと変数の設定ができません。。。

LINQをつかって一気にやってしまおう!

インスタンス作成処理をfor文で回してもいいのですが、
ただの配列作成処理なんだからスッキリさせたいです。
こんな時に重宝するのがLINQです。
配列作成の処理にSelect文をつかって1行で完結させましょう

        // 起動時イベント
        void Start()
        {
            TestClass[] a_TestClass;
            a_TestClass= new TestClass[10].Select(x => { return new TestClass(); }).ToArray();
            // ↓↓エラーにならない!↓↓
            a_TestClass[0]._Id = 1;
        }

こんな感じで配列作成と要素にインスタンス作成の処理を1行でできます。

配列を使うメリットって何だろう?

最近、なんとなくですがListの必要がないものは
なるべく配列で組み込むようにしているのですが、
まぁまぁ良かったことをまとめときます

◆ 良かったこと

  • 配列は作成した瞬間から要素が出来ているので、一時的にクラスを作る必要がない
  • 高さが変動しないので、範囲外系のエラー時の原因追及がしやすい
  • ToLinq、ToArrayがあるのでそこまで自由度が低くなることはそんなにない
  • 「高さが変わらないなら配列」という明確なルールを持ってListと使い分けることで、型を見ただけで自分の意図が分かるからコードを読み返すときに楽

以上です
今更ですが配列は配列できっちりしていて好きになりました。