XamarinでiOSアプリ開発中に、Windows上のVisual StudioからMacにリモートログインをするとタイトルのようなエラーが発生しました。

 

System.MissingMethodException: Method ‘Array.Empty’ not found.

 

 原因はMac側のMonoのバージョンが低いためでした。

 Visual Studio for Macを更新することでエラーを消せました。

 

 Windows上のVisual Studio。MacのX Code、Visual Studio for Macはバージョンを合わせろ(というか最新に保つのが妥当かなぁ)


 C# 基本講座:イベント・ラムダ式・デリゲート(2018年8月1日)

 C# 基本講座:ジェネリック(2018年7月23日)

 

 時代に合わせて書き方も変わっているよ、という点も踏まえて動画にしたつもりだったけど、Unityで.NET  3.5に戻ると混乱するからまだまだ鍛錬が必要ですね・・・。

 

 

 


 公式サイトのニュースでEC-CUBEの次期バージョンが4になることがアナウンスされました。

 (参考)「EC-CUBE」最新版に関するお知らせ(2018/08/06)

 

2017年夏より「EC-CUBE 3.n」として、開発を続けております「EC-CUBE」の最新バージョンのバージョン番号を「EC-CUBE 4.0」とすることに決定いたしましたのでご報告申し上げます。

 

 流れは3系のままなので「せっかく3系を覚えてきたところなのに!」という方もその知識は十分に活用できると思います。

 3系についても10月に3.1が出るので「今選ぶならどっち?」というところはリリースされたものを検討する必要が出そうです。

 

 アナウンスを見る感じ、3.1は今の3.0.16から互換性を保ちつつ改修したもの。

 4は互換性をある程度犠牲にしたものになりそうです。

 

 デザインテンプレートやプラグイン開発者の方はGitHubからベータ版がDLできるので、既存のものが4で動くのか検証してみてもいいかも。

 


 タイトルの通り、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。