The Referenced Script On This Behaviour Is Missing を直す

しばらく放置していた古いプロジェクトを Unity2018 で開いたら

実行時に必ず「The Referenced Script On This Behaviour Is Missing」が出るようになった。

【解決方法】

・その警告が出るシーンのプレハブなど内容をすべてコピー

・新しいシーンを作成する

・新しいシーンのテンプレ内容(MainCameraとDirectinalLight)を消す

・コピーしていた内容を貼り付け

これで直る。ようなシーンファイルが壊れたって事ですな。

UltraVNC で Mac から Windows につないだ時に「全角/半角」を簡単に切り替える設定方法

【追記】
仕組み上、WindowsホストのVNCならどれでも似た事はできるはず。


【問題点】
・Windows10Home に UltraVNC Server を入れて、Mac(私の場合、MacBookAir) の Finder からサーバに接続でつないだ時、

全角半角キーに該当するキーがないため、かなキーで全角に切り替えていたが、今度は英数キーを認識しないために半角に戻せない。


【解決方法】
※すべてサーバ側の Windows で行います。

・サーバ側の Windows に Google日本語入力をインストール

・タスクバーのGoogle日本語入力のアイコンを右クリックし、プロパティを選択(「A」または「あ」となっているアイコン)

・「一般」タブの下の方にある「キー設定の選択」の右の「編集」ボタンを選択

・モード欄が「入力なし」、入力キーが「Hiragana」の行を探す

・上記のコマンドを「IMEを無効化」に設定してOK、戻り先もOKを押してGoogle日本語入力ウインドウを閉じる

・UltraVNC Server の Admin Properties で「Alternate keyboard method」にチェックしてからホストする



これで「かな」ボタンで全角/半角キーと同様の切り替えが行える。

Unity終了時に必ずクラッシュするのを解決する

なんだか最近、Unityを終了する時に必ずクラッシュするようになったなぁと思ったら、

VSCodeプラグインが入っていると落ちる事が分かった。

Unity2017.x系どれでも起きている。おそらくUnity5.xでも起こると思う。

解決方法は、Plugin/VSCode.csを開き、

static void FixUnityPreferences()内にある

if ( EditorWindow.focusedWindow == null)
return;




if ( !EditorApplication.isPlaying || EditorWindow.focusedWindow == null)
return;

とすれば直る。

スプライトやテクスチャの端に余計な1ドットの線が入る訳

Unity のスプライトや、ゲーム開発においての初心者あるある。

主に2Dゲーを作ろうとしたときに、スプライトの端に隣のテクセルが見切れてしまうような現象に出会ってしまった場合、

テクスチャのサイズをPOW2(2累乗サイズ)にしていないかを確認しよう。

1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 / 256 / 512 / 1024 / 2048 / 4096 など

POW2のサイズに余白を足してでもテクスチャを広げてみよう。

浮動小数が割り切れる数になるため、端数がでて変な見切れは発生しなくなる。

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);
   }
  }
 }
}