JsonUtility で Dictionary を使うとても簡単な方法

シリアライズの直前とデシリアライズ直後を拾えるインターフェースがあるので
それを加えた専用Dictionaryクラスを作ればよい。

If you want use Dictionary in JsonUtility.
Than make wrapper class. It is very simple!

[System.Serializable]
//==================================================================
/**
 * @brief Dictionary for JsonUtility
 */
//==================================================================
public class Dict : Dictionary, ISerializationCallbackReceiver
{
 [SerializeField] private List keys = new List();
 [SerializeField] private List vals = new List();

 public void OnBeforeSerialize()
 {
  keys.Clear();
  vals.Clear();

  var e = GetEnumerator();

  while ( e.MoveNext() )
  {
   keys.Add( e.Current.Key );
   vals.Add( e.Current.Value );
  }
 }

 public void OnAfterDeserialize()
 {
  this.Clear();

  int cnt = ( keys.Count<=vals.Count )? keys.Count : vals.Count;
  for (int i=0; i<cnt; ++i )
   this[keys[i]] = vals[i];

 }
}

// あとはDictionaryをDictに置き換えるだけで簡単にJsonUtility対応になる
// You only be replace Dictionary to Dict, then Easy use JsonUtility with Dictionary!
public class DictTest : MonoBehaviour {

 Dict<string,int> test = new Dict<string, int>{
  { "ABC", 123},
  { "DEFGHI", 456},
  { "JKL", 7891011}
 };
 
 string s = string.Empty;
 // Update is called once per frame
 void Update () {
  if( Input.GetKeyDown(KeyCode.T) ){
   s = JsonUtility.ToJson(test);
   Debug.Log("<color=#FF0000>" + s + "</color>");
  }
  
  if( Input.GetKeyDown(KeyCode.F) ){
   var d = JsonUtility.FromJson<Dict>(s);
   foreach( var _ in d ){
    Debug.Log("<color=#00FFFF>[" + _.Key + "]</color>" + _.Value);
   }
  }
 }
}

購入直後のミナミヌマエビの死亡率

ミナミヌマエビを購入し、いざ水槽にお引っ越ししようと思ったら

水合わせをしっかりじっくりしたはずなのに弱ったり死んでしまった。そんな失敗経験と成功例をメモ。

私の過去失敗例:

×引越し先の水槽の水を、購入した袋にスポイトでゆっくり少しずつ、かつ時間をかけて何度も行って水を合わせようとした

×水温を合わせてから、稚魚ケースにエビを移し、メイン水槽の水をオートで徐々に入れ替えた
→いづれも引っ越すまでに落ちることはないが、引越し後一日目から気づくと数が減っていたり落ちていた
これによって水を徐々に入れ替える方式は落ちる確率が高いように感じた

→上記は計3回ほど失敗
エアレーションは袋やケースに直にしていたため、やや控えめの弱さだった

成功例:

○とりあえず袋の水をバケツに全部移して強めにエアレーションを炊く
→水温を合わせた汲み置きの水でかさ増ししてエアレーションしつつ、モスの破片を少し入れておいた
→20匹が一ヶ月後もすべて生存。2回中2回成功

つまり、ミナミの水合わせで重要なのは強めのエアレーション! 
と思いたい。

※自身でしか試していないので、真似して落ちても責任は取れませんのであしからず。

ドジョウが立つ・水槽の上部にいたがる原因

まだ買い始めてから一年程度の時のこと

ある日から、ドジョウが壁沿いに立ち上がったようにじっとしていたり、

上の方にある稚魚ネットと壁の隙間に入りたがる事が増えた。

5匹中3匹がネットの間に挟まるようになり、最初はじっと並んでいたり、立った姿の愛嬌にかわいいなぁと

眺めていたのだが、この現象が起きている時はドジョウからのあるサインだった事が判明する。


結果から言うと、水質がドジョウにとってよろしくない時に必ずこのような行動を取る事がわかった。

上記のドジョウを含め半数以上の生体は数日後、エロモナスにやられ

数時間のうちに充血から顔に穴が空きはじめあっという間に死んでしまった。

あの恐ろしいスピードで変化がわかる状況を目の当たりにしてからというもの、

上記のサインが出ていないか必ずチェックするよう心がけている。


立ち上がり→危険

上部いきたがり→かなり危険

と認識し、すみやかに水の半換えを数日してあげましょう(すみやかにといいつつも温度は合わせましょう)

それ以来、エロモナスで落ちる事はなくなりました。


uGUI でドラッグやクリックされている間を判定する

uGUI のコンポーネントをドラッグやクリックしている最中かを判定したい時がある。

そんな時は、以下のようにすれば検知できるので、あとはコール先でフラグを立てるなりすればよい。

[方法]

・検知したい uGUI コンポーネントに「Inspector」から「AddComponent」で「Event>EventTrigger」を付与
 (Scriptから付けても構わない)

・Inspector の 「AddNewEventType」から取りたいタイミングを選択し、イベント発生時にコールしたいメソッドを設定する

Parent of RectTransform is being set with parent property. の警告対策

Unity5.5f3 にて uGUI を使用していると以下の警告が出た。


Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.



[原因]
uGUI のパーツは「Transform」ではなく「RectTransform」をコンポーネントに持っている。

それゆえ、普段のように

uguiObject.transform.parent = newParentObj;

とかしてしまうと「transform」で parent を決めるな!

RectTransform使え! と怒られるのである。




[対策]

警告の通り、

RectTransform を取得した上で「SetParent」メソッド+第二引数に「false」を設定して解決。

RectTransform rt = uguiObj.GetComponent();
if( rt )
rt.SetParent( newParentObj, false );