devlog [naru design]

プログラミングやテクニカルな内容の覚え書き。

Inspectorに表示したいプライベート変数の前に[SerializeField]と記述する。

調整が必要な値はハードコーディングせず、プライベート変数として作成し、SerializeField属性を指定しておくと良いと思います。

※ public変数にすればInspectorパネルに表示されますが、他のコンポーネントから操作できてしまう。

スクリプトを編集&更新するとUnityエディタに戻った際に若干の待ち時間(スクリプトを再コンパイルしてる?)が発生します。Inspectorパネルで値を変更できるようにしておけば、待ち時間なくプレビューを開始できるので作業効率が上がると思います。プレビュー時に値を変更して挙動を確認することも出来ます。ただし、プレビューを終了すると値は元に戻ってしまいますが…。

先のパーティクル発生制御を実装していた時のスクリプトで気になる点を発見。

Awake()で、inactiveなBalloonオブジェクトのParticleSystemコンポーネントを取得しています。
あれ?inactiveなオブジェクトをFindしたらNullじゃなかったっけ??
GameObject.Find()では間違いなくNullになっていたはずだけど…。

改めてスクリプトのリファレンスでTransform.Findを調べてみました。

Transform.Find

http://docs.unity3d.com/ScriptReference/Transform.Find.html

ちなみにGameObject.Findは

GameObject.Find

http://docs.unity3d.com/ScriptReference/GameObject.Find.html

よく見るとGameObject.Findの説明には

”This function only returns active gameobjects.”

と書かれています。Transform.Findには、この一文がありません。今まで、Find()ではinactiveなオブジェクトを取得できないと思っていましたが、違っていたようです。

– GameObject.Find() : activeなオブジェクトのみ
– Transform.Find() : active/inactiveどちらでも

また、Transform.FindChild()はリファレンスには見当たりません。以前から変だなと思っていましたが、Transform.FindChild()はTransform.Find()と同等なようです。リファレンスに載っていないのでFindChildは使わないほうがいいかもしれません。

ParticleSysmte.Play()を何度か繰り返し呼び出すとパーティクルが発生しなくなる不具合に遭遇。
Unity上では問題なく動いていたが、実機(iPhone)で動かすと不具合が発生する。

問題の発生したスクリプト

検索でUnityAnswersに以下の投稿を発見。

ParticleSystem.Play() does not play particle.

http://answers.unity3d.com/questions/513517/particlesystemplay-does-not-play-particle.html

上記を参考にしてスクリプトを変更。

変更後のスクリプト

パーティクルの発生をPlay()ではなく、(Play on Awakeを有効にした上で)ゲームオブジェクトがEnableになった時に行うように変更。実機で動作を確認、不具合が解消された模様。

Unity4.5.0f6

一斉に風船が飛んで行くイメージをパーティクルで作ってみました。

設定は以下の様な感じ。

スクリーンショット 2014-12-20 1.56.53

RendererのMaterialに、Mobile/Particles/Alpha Blendedシェーダー(風船のPNG画像を適用)で作ったマテリアルを適用してます。

iPhoneクラスのgenerationプロパティからデバイス情報を知ることができます。

Debug.Log(iPhone.generation);

特定の機種を判別したいときには

※判別可能なデバイスは、ドキュメントのiPhoneGenerationを参照

スクリーンサイズからデバイスを判定する方法は
Unity3D:iOSデバイスの判定

ほとんど触っていなかった Shuriken でクラッカー風のパーティクルを作ってみました。

設定は以下の様な感じ。

スクリーンショット 2014-12-11 16.03.38

以前、アプリを開発している時、Random.Range()で取得した乱数の偏りが気になりました。
※厳密に調べたわけでないので本当に偏っているかは分かりません

今は以下の様なRandomControllerクラスを用意して乱数を取得しています。

使用方法は

int n = RandomController.getNumber(128);

で、0以上128未満のランダムな数を取得します。

Random.Range()よりはバラけている感じがします(自分調べ)。

モバイル向けのアプリを開発している時も、ついついOnMouseXXX()を使ってしまいます。
実は公式のドキュメントにはOnMouseXXX()はiOSやAndoridではサポート外と書かれています。

Features currently not supported by Unity iOS

http://docs.unity3d.com/Manual/iphone-unsupported.html

Scripting

– OnMouseDown, OnMouseEnter, OnMouseOver, OnMouseExit, OnMouseDown, OnMouseUp, OnMouseDrag events are not supported.

Features currently not supported by Unity Android

http://docs.unity3d.com/Manual/android-unsupported.html

Scripting

– OnMouseEnter, OnMouseOver, OnMouseExit, OnMouseDown, OnMouseUp, and OnMouseDrag events are not supported on Android.

問題なく動いている間は良いけど、動かなくなった時に「サポート外」と書かれてるので文句も言えません。
潜在的なバグを抱えることにもつながるので、OnMouseXXX()を使わないでタッチデバイス向けのコードを書いた方が良いかな…。

Unity4.5.5