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月29日日曜日
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から持ってくるように変更しよう。
の続き
今回は、バーチャルスティックを左だろうと下だろうとどう動かしても
右上に入力されていることになってしまっていた。
原因は、画面に対して描画領域を比率で固定し、黒帯表示を行っていたから。
タッチした画面の座標を 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でサポートしていないのだろう。
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のバーチャルスティックのズレ
最新?のではこんなバーチャルスティック
解決策は、
まず、ヒエラルキーに置いた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のバーチャルスティックのズレ
登録:
投稿 (Atom)