タイトルの通り、IDEでデバッグしている間や、Build and Runしている間は正常に動作していたのに、ビルドしてexeファイルを実行するとファイルが読み込めなくなった。

 このBuild and Runだと動作するというのが何気に罠な気がする・・・。

 

 どんなアプリケーションでも、ビルド後のバグ取りは面倒なもので、「やっぱりデバッグ用の表示要るよなぁ」とDebugUIなるCanvasを作成して、コツコツ出力を確認する。

 (Unity初心者なので、ビルド後のデバッグの良い方法があるのかもしれないが・・・)

 で、StreamReaderで設定ファイルなどを読み込んでいたところでこけていることが判明。

 

 ビルド後のファイルを眺めてみると、確かに該当ファイルは見当たらない(パッケージされている?)。

 

 対応を調べてみると以下の2つでクリアできそう。

 

1.StreamingAssetsを利用して、ファイルをパッケージ化せずに書き出す

2.Resoucesに配置してResouce.Loadで読み取る

 

 1の方法だと、設定ファイルなどをそのまま配置してしまうようなので、2で対応。

 

        try
        {
            var textAsset = Resources.Load("Config") as TextAsset;

            var config = JsonConvert.DeserializeObject<Dictionary<string, string>>(configText.textAsset);
        }

 

 こんな感じでLoadして、JSON形式のファイルをデシリアライズしてDictionaryとして受け取る。

 

 ファイルが無い場合は例外じゃなくてnullチェックかもしれないなぁと思いつつも、検証する前にブログにメモを残す・・・。

 


 前回、UnityのUI Buttonのマウスオーバーイベントをスクリプトで追加するで、

 

他にもIPointerEnterHandlerを継承したクラスをアタッチする方法もあるみたいだけど、今回はこちらを選択。

 

 と書いたけど、自分が忘れそうなので、IPointerEnterHandlerを継承したクラスをアタッチする方法も残しておく。

 

1.IPointerEnterHandlerを継承したクラスを作成

 

 インターフェイスなので正確には継承じゃなくて実装だけど・・・。

 

public class ButtonEventSample : MonoBehaviour, IPointerEnterHandler
{
    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("ButtonEventSample::OnPointerEnter");
    }

    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

 

 こんな感じで、IPointerEnterHandlerを実装したOnPointerEnterメソッドを持つクラスを作成する。

 

2.スクリプトをButtonに追加

 

 これをButtonにScriptとして追加してあげる。

 

 以下のようなログが表示されれば成功。

 

 コードはシンプルだけど、使い方上MonoBehaviourも継承する必要があったりと、不要なことをしなければいけないのがちょっと気になる。

 


 簡単そうで意外と面倒だったのでメモを残しておきます。

 (もしかしたら、もっと簡単な解法があるかもれません)

 

 uGUIのButtonはonClickイベントなら素直に設定できるのですが、マウスオーバー(OnPointerEnter)など他のイベントは同様の方法で追加できない模様。

 

1.EventTriggerをButtonに設定

 

 前段階としてButtonにEvent Triggerコンポーネントを追加します。

 スクリプトでAddComponentしても良いですが、今回はInspector上で追加。

 

2.スクリプト上でEventTriggerを取得

 

// 事前にButtonにEventTriggerコンポーネントを追加しておく
var trigger = button.GetComponent<EventTrigger>();

 

 手順1を行ってないとここで、変数triggerがnullになります。

 

3.登録(Entry)するイベントの作成

 

 取得したEventTriggerに登録したいイベントの設定を行います。

 イベントの設定はEntryクラスを利用します。

// 登録するイベントを設定する
var entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerEnter;

// リスナーは単純にLogを出力するだけの処理にする
entry.callback.AddListener((data) => { Debug.Log("PointerEnter"); });

 

4.EventTriggerにEntryを追加する

 

 最後にEventTriggerにEntryを追加します。

 

// イベントを登録する
trigger.triggers.Add(entry);

 

 マウスオーバーを行いログが出力されれば成功。

 

 

 他にもIPointerEnterHandlerを継承したクラスをアタッチする方法もあるみたいだけど、今回はこちらを選択。

 仕組み的にはButton以外のUIでも使えると思います。

 

 プログラムの全文は以下。

        // EventTriggerテスト
        // 事前にButtonにEventTriggerコンポーネントを追加しておく
        var trigger = button.GetComponent<EventTrigger>();

        // 登録するイベントを設定する
        var entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerEnter;
        entry.callback.AddListener((data) => { Debug.Log("PointerEnter"); });

        // イベントを登録する
        trigger.triggers.Add(entry);

 


 Unity 5.3から標準でJsonUtilityが追加され、JSON形式のデータを扱えるようになった・・・のだけど、コレクション(JSON的には[]タグから始まるデータ)を扱えない。

 回避策はあるようだけど、JsonUtility依存の書き方になるので、現状あまり使いたくない。

 

 というわけで、UnityでJSONを扱う他の方法を調べてみた。

 幾つかツールがあるようだけど、使い慣れたJSON.netが利用できるようなので、解決。

 (Pluginsフォルダーにdllを配置すればOK)

 


 タイトルのような状態になったので、解決法をメモ。

 

 現象は下の画像のように、右上に表示しているTextのtextプロパティをC#コードから更新しても、前の文字が消えず、文字が重なった状態になる。

 拡大するとこんな感じ。

 

 画面の中央の3Dの部分はメインカメラで描画。

 青い背景でTextを1つ表示しているのがUI用のサブカメラ。

 

 で、原因はサブカメラのClear FlagsプロパティをDepth Onlyに設定していたせい・・・。

 UIの部分は背景を画像にしようと思っていたので、軽そうなDepth Onlyに設定したのですが、Solid ColorなどにしておけばOK。

 


 .NETラボ 勉強会 2018年7月勉強会でLTしてきたけど、5分で言い切れなかったのでここにまとめておこうと思う。

 実際に開発するための資料としては、

 Alexaスキル開発トレーニング

 が良く書かれているので、Hello World的なアプリを動かす場合、こちらを参考にすると良いと思います。

 

 ということで、今回は流れだけ書いておきます。

 

開発してデバッグするだけなら実機不要

 

 Amazon Echo上で動作するアプリをスキルというのですが、スキル開発をやってみるだけならAmazon Echo端末が無くても、ブラウザだけで実行可能です。

 

 以下を利用するために開発者用アカウントを作成を作成すればOK。

 Alexa Skill Kit
 https://developer.amazon.com/ja/alexa-skills-kit

 

 Amazon 開発者ポータル – Amazon Developer
 https://developer.amazon.com/ja

 

 *端末はAmazon Echoなどですが、動作している音声サービス名がAlexaなので今後Alexaという名前がよく出てきます。

 

Alexa Skill Kit

 アプリを起動するための音声の設置や、アプリがどのように応答するのかなどの設定を行います。

 Webベースなので何かソフトをダウンロードしてインストールするという流れは不要です。

 また、ストアにアプリを提出するための情報の登録や、テスト、ベータテスト(実機転送)などもここから行います。

 

 開発視点だと、Alexa Skill Kitではユーザーとどのように対話を行うかのUIを定義します。

 

 例えば「サンプル運勢」スキルは「Alexa サンプル運勢を開いて」というユーザーの言葉によって起動するという定義をAlexa Skill Kitで行います。

 起動後に「今日の運勢を教えて」という問い合わせがあればサーバーの「getTodaysFortune」という処理を呼び出す、という定義も行います。

 

 対話によって呼び出された処理は後述するサーバー側で行います。

 サーバーは自サーバーでも良いですが、最初はAWS Lambdaを使うと楽です。

 

 

AWS Lambda

 

 プログラムを実行して、応答に対する返事を行う部分です。

 

 先ほどの例だとgetTodaysFortuneの実装はサーバー側に記述します。

 

 AWS Lambdaの場合はNode.jsで記述しますが、応答の形式さえ沿っていれば自サーバーで好きな言語を用いることも可能だと思います。

 

 Node.jsの編集もWeb上で可能です。コード補完もあって簡単な編集なら全然OK。

 

テスト

 

 Alexa Skill Kitとサーバー側の作業が終わったらAlexa Skill Kitでテストができます。

 Alexaシミュレーターというツールが「テスト」タブにあるので、マイクで話しかけたり、マイクが無ければテキスト入力で動作を確認できます。

 

 

実機に転送

 

 実機がある場合は開発用にベータテストとして実機に転送して90日間動かすことができます。

 

 「公開」タブの「公開範囲」からベータテストを有効にします。

 ベータテストを行うには認定に必要な情報を同じく「公開」タブで行う必要がありますが、実際に認定に出すまでやる必要は無いので、仮の情報でも大丈夫です。

 

 ベータテストが有効になったら、実機に紐づけたAmazonアカウントのメールアドレスを招待先に追加します。

 追加されるとメールが飛ぶので、メールに記載されたリンクからAmazon Alexaアプリ(スマフォアプリなど)を起動し、招待を受けます。

 そうすると通常のスキルをAmazon Echoにインストールするのと同じ流れで、ベータテスト用のアプリがインストールできます。

 

 以上、Alexaスキル開発の流れでした。

 

補足:躓いたこと

 

 AWSの開発用アカウントが無効になっていた。

 忘れていましたが、自分で課金されないために停止していました。再開する方法はフォームから「停止してるから開始してね」と依頼する。

 

 エンドポイントの「デフォルトの地域」欄でError code: SkillManifestError。

 私のケースではLambda側で編集していたコードを保存していなかったためでした。保存した解消。

 

当日のスライドも公開

 

 当日利用したスライドも掲載しておきます。

 前半がLTとしては余分だったなぁと反省・・・。

Amazon echoがやってきた from Makoto Nishimura

 


 国産CMSのBaserCMSをインストールしてみました。

 (参考)https://basercms.net/

 

 といっても、レンタルサーバーhetemlの簡単インストールを利用してGUIでさくっと導入しただけですが。

 (参考)https://heteml.jp/

 

簡単インストール

 

 前述の通り、hetemlはBaserCSMの簡単インストールに対応しています。

 それ以外にもWordPressやEC-CUBEなどもさくっと導入できます。

 

 

 インストール先と、DB接続用のパスワードを設定します。

 DB接続用のパスワードは後で必要になるので、控えておきます。

 

 インストール終了後、指定したインストール先にアクセスするとBaserCMS自身のインストール画面に遷移します。

 

 hetemlはインストール要件を満たしているので、基本必須条件は全て満たしているはずです。

 この辺で悩まずに済むのは楽ですね。

 

 

 DB接続情報を設定します。

 すでにほとんどの項目が埋まっているので、ここではDB接続用のパスワードを入力するだけで終わりました。

 

 

 管理者用のメールアドレスと、ログインID、パスワードを設定すると導入は完成です。

 (キャプチャーを取り忘れましたごめんなさい・・・)

 

 インストールが成功すると、管理ページのURLとID、PASSが書かれたメールが届くので注意。

 

 サイトURLにアクセスしてインストールが成功していることを確認します。

 

 

 


 (記事)Eclipse最新版「Eclipse Photon」リリース。Java 10に加え、RustとC#をサポート

 https://www.publickey1.jp/blog/18/eclipseeclipse_photonjava_10rustc.html

 

 という記事があったので、EclipseでC#を書いてみた。

 Eclipse用のC#プラグインって昔からあったよね・・・という記憶はあるんですが、実際に使ってみたことは無いので違いは比較できず。今回は公式に対応とかなのかな?

 

 結論からいうと、うちのパソコンではエディターが重くて実用に耐えれませんでした。EclipseでJavaは快適だったので、EclipseでC#がまだパフォーマンス出てないんだと思います。

 それでも自分のPCで試してみたいという方向けにメモを残しておきます。

 

Eclipseを公式からDL

 

 色々便利なPleiadesじゃなくて公式からプレーンなEclipseをダウンロード。

 

http://www.eclipse.org/photon/

 

オプションはJavaでインストール

 

 インストール時のオプションでC#が無かったのでとりあえず、Eclipse IDE for Java Developersでインストールを進める。

 C#は後からマーケットプレイスで導入します。

 

 

aCute : C# Editionをインストール

 

 マーケットプレイスから「C#」と検索してaCute:C# edition in Eclipse IDEを導入。

 バージョンが0.1.0なところである程度の覚悟はできていました。

 

 

dotnetコマンドへのパスを通す

 

 新規プロジェクトに.NET Coreが追加されました。

 

 

 プロジェクトの作成途中で「dotnetコマンドへのパスを指定してね」といわれるのでパスを指定。

 コマンドプロンプトでdotnetと打って反応があるなら既にインストールされているのでパスを調べるだけ。

 

 私の環境ではおそらく、Visual StudioかVS Codeインストール時に入っていたのでコマンドプロンプトでは反応あり。

 

#dotnet --info

 

 Base Pathを確認。

 私の場合、

 

C:\Program Files\dotnet\sdk\2.1.101\

 

 がBase Pathで、dotnet.exeは

 

C:\Program Files\dotnet

 

 にありました。このdotnet.exeを指定すればOK。

 

あー、重い・・・

 

 作成できるプロジェクトにはF#や、VBもありました。

 Language Server ProtocolというMicrosoftが公開したC#などのコード補完や解析できるプロトコル(仕様? コード?)ベースなので.NET系の他言語にも対応が容易なのかな。

 (ちょっとこの辺の説明は適当です。興味があったらご自分で調べてみてください)

 

https://github.com/Microsoft/language-server-protocol

 

 

 実際に、Console Applicationのプロジェクトを作成してみましたが、まだまだ動作が重い・・・。

 これからチューニングも含めて対応していくよ版ということなんでしょうね。

 

 というわけで、使ってみたけど、その先のレビューは断念。将来に期待します。