2015年3月29日日曜日

unity EventTriggerのイベントをスクリプトから登録

EventTriggerのイベントをスクリプトから登録したい!

そんなときにはこちら

参考元
http://answers.unity3d.com/questions/854251/how-do-you-add-an-ui-eventtrigger-by-script.html


参考元ままなんですけど以下コード


EventTrigger trigger = Hoge.GetComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.Select;    //イベントのタイプSelectが発生した際に
entry.callback.AddListener((eventData) => { mySelect(); });    //mySelectメソッドを実行するよう
trigger.delegates.Add(entry);    //EventTriggerに登録


他にもイベントを追加したいときは
EventTrigger.Entryの作成のところから新しく追記する。

using UnityEngine.EventSystems;
も忘れずに。

他のUnityAnswersで見た(アドレス紛失)のですが、
スクリプトから登録したイベントについてはインスペクターで確認できないみたい。
実際にできませんでした。

試してないのですが、AddをRemoveにすれば登録解除もできるのかな


2015年3月24日火曜日

Asset MobileSingleStickControlのバーチャルスティックのズレ

Asset MobileSingleStickControlのバーチャルスティックが消える
の続き

今回は、バーチャルスティックを左だろうと下だろうとどう動かしても
右上に入力されていることになってしまっていた。

原因は、画面に対して描画領域を比率で固定し、黒帯表示を行っていたから。
タッチした画面の座標を Canvas の座標に変換してやらないとならない。


対策として、スクリプト Joystick 内の OnDrag() を編集した。
以下、変更部分のソース。
※補足1:Canvas Scalerで900 x 600 (3:2画面) と設定していた例
※補足2:MobileJoystick の RectTransform は左下をアンカーの基準にする。


  public void OnDrag(PointerEventData data)
  {
   Vector3 newPos = Vector3.zero;
   if (m_UseX)
   {
                //ここからが書き換えた部分
                int nWidth = Screen.width;
                int obi = 0;
                if ((Screen.width * 2) > (Screen.height * 3)) //左右に黒帯ができる場合
                {
                    nWidth = (int)(Screen.height * 1.5f); //黒帯を除いた描画幅を取得
                    obi = (int)((Screen.width - nWidth) / 2f); //黒帯の片側の大きさを取得
                }
                int delta = (int)((data.position.x - obi) / nWidth * 900f - m_StartPos.x); //座標空間の変換
                //ここまでが書き換えた部分
    delta = Mathf.Clamp(delta, - MovementRange, MovementRange);
    newPos.x = delta;
   }
   if (m_UseY)
   {
                //ここからが書き換えた部分
                int nHeight = Screen.height;
                int obi = 0;
                if ((Screen.width * 2) < (Screen.height * 3)) //上下に黒帯ができる場合
                {
                    nHeight = (int)(Screen.width * 0.667f);
                    obi = (int)((Screen.height - nHeight) / 2f);
                }
                int delta = (int)( (data.position.y - obi)/ nHeight  * 600f - m_StartPos.y);
                //ここまでが書き換えた部分
                delta = Mathf.Clamp(delta, -MovementRange, MovementRange);
    newPos.y = delta;
   }
   transform.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(m_StartPos.x + newPos.x, m_StartPos.y + newPos.y, m_StartPos.z + newPos.z);
   UpdateVirtualAxes(transform.GetComponent<RectTransform>().anchoredPosition3D);
  }



描画領域の比率を変更することはそうそうないだろうけど、
これからStart()でCanvasScalerから持ってくるように変更しよう。

2015年3月23日月曜日

LitJson 配列の配列

※記憶があやふやなうえに少し時間が経っているので話半分に


LitJsonの使用を考えている場合、
2次元配列ではなく配列の配列を使用したほうがよい。
2次元配列は正常に書き出し、読み込みができない。


ここで言う
2次元配列は hoge[x , y]
配列の配列は hoge[x][y] (ジャグ配列)
というような記法の配列のこと。


JavaScriptが多次元配列をサポートしていないらしいので、
JavaScriptがベースのJSON
あるいはLitJsonでサポートしていないのだろう。

Asset MobileSingleStickControlのバーチャルスティックが消える

一度触れたら、画面の左下だったり原点に移動してしまう。

最新?のではこんなバーチャルスティック

解決策は、

まず、ヒエラルキーに置いたMobileSingleStickControlに
Layout > Canvas Scaler をアタッチする。
設定は Ui Scale Mode を Scale With Screen Size
他は各々の環境に合わせた値に。

次に、MobileSingleStickControl の子 MobileJoystick に
アタッチされているスクリプト JoyStick を編集する。
編集内容は置換するだけ。
置換前: transform.position
置換後: transform.GetComponent<RectTransform>().anchoredPosition3D
4か所が置換されるはず。


(参考)
http://forum.unity3d.com/threads/unity-5-new-mobile-assets-joystick-problem.307627/
http://answers.unity3d.com/questions/917671/unity5-joystick-prefab-snapping-to-bottom-left-cor.html#answer-919202


JoyStick 内の OnEnable を Start に書き換えただけで直った!
という人もいるみたい。自分は駄目でした。

GetComponentがやらしいので
変数にキャッシュするのがいいでしょう、多分。
transformも実際はGetComponentが動いているらしいのでなおさら。


これと関係してか、しなくてか、
触れた途端Range内の右上に一旦移動してしまう。
これから模索。


続き
Asset MobileSingleStickControlのバーチャルスティックのズレ