GONZNOTE ゆるゆる備忘録

227月/140

[NGUI] UIDraggablePanelのdisableDragIfFitsが効かない件

NGUIのUIDraggablePanelはdisableDragIfFitsというチェック(boolの変数)がある。
これをオン(true)にすると、表示する全てのUIDragPanelContentsが
PanelのClipRangeに収まる場合はドラッグが無効になる。

…が、しかし!
これをオンにしていても最初に触った場合のみドラッグができてしまう。

使ってるNGUIのバージョンが古いせいな気もするけど、
めちゃくちゃカスタマイズしちゃってるとか、チームの都合とか、
何らかの事情でバージョンを挙げられないこともあると思うんだ(´・ω・`)
だから一応原因と対策をメモっておく。

■原因:mShouldMoveがデフォルトでtrueのままになっている
まあソースを見れば明らかなのだけど、
UIDraggablePanelのprivate変数「mShouldMove」はデフォルトでtrueになっており、
それをfalseにしておくための初期化処理が無いのだが、一度触ったりすれば更新(※)されるので、
初回のみドラッグができてしまう…という現象が発生していた。

対策としては、PressでもUpdateScrollbarsでも、
mShouldMoveが更新される処理を呼んでおけば発生はしなくなる。
でも、本来必要のない処理を呼んでおくことで解決!は悪手なので、
できればDraggablePanel自身を修正する方がよいと思いますよ。

※更新…というかUIDraggablePanelのプロパティ「shouldMove」が
いろいろアレコレ計算して、その結果をboolでmShouldMoveに渡している。
そのため、UIDraggablePanelの位置調整を(UIPanelの)ClipRangeではなく
TransformのPositionで合わせていたりすると正しい判定が返ってこない場合があるのでご注意を。
もっと詳しく(そして正確に…)知りたい場合はソース見てね…って言うことで。。。

14.07.25 追記
やっぱりClipRangeだけで調整しても狂うときは狂うな。。。
UIDraggablePanel.shouldMoveのロジックみながら
UIGridでリストの初期位置となる位置調整して、
さらに親のDraggablePanelでも調整して
……と直していったらちゃんと動かなくなるようになった。

なんか場当たり的な対応っぽくてとてもイヤンな感じだな。。。。
ドキュメントちゃんと漁れば正解が書いてありそうな気もするけど。

 

Filed under: Unity No Comments
157月/140

LeapMotionのUnity用開発環境をつくる

Leap Motion買ってみたので、Unity用の開発環境を作ってみる。
ちなみに私の環境はMacですが、結局Unityに持っていくのでWindowsでもあんま変わらないかも。

0.箱を空ける。

1.Leap Motionの開発者サイトからドライバとSDKをダウンロード。
LEAP DevPortal:https://developer.leapmotion.com/
※アカウント持ってなければ登録しちゃいましょう。
※Leap Motionの箱開けるとsetupサイトのURL書いてあるけど、無視していいと思います。
だってドライバのバージョン古いんだもの!

2.ドライバをインストール!指示通りでおk。

3.UnityProjectの中にLeapのPluginを入れる。
ダウントードしてきたフォルダから、LeapSDK¥lib¥UnityAssets¥Pluginsの中身をコピーすればおk。

とりあえずこんな感じで開発始められるかとー。

Filed under: Leap Motion, Unity No Comments
19月/121

Unityの諸々テンプレを変更する

Unityから新しいスクリプトを追加するたびに
毎回毎回文字コードを変更したり、StartやUpdateを消したりするのもめんどくさいので、
テンプレートを差し替えることにした。

元となるスクリプトファイルは以下にあるので、
JavascriptでもC#でも、変えたいものを更新すればOK!

C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates

ちなみに、1階層上に上がってみると、WebPlayerTemplates というディレクトリがあったりするので、
WebPlayerにビルドするときにできるHTMLを差し替えたい!という時はここの中身を変更したり、
あるいは新しいものを追加したりすればOK。

ページのデザインがもうできてるとか、
HTMLに仕込んだjavascriptとUnityPlayerを連携させたいとか、
そういうときは先にテンプレを追加しておくと捗るよ!

さらにちなみに、Androidのapkとしてビルドするとき、ある程度の設定はPlayerSettingsからできますが、
組込んでるPluginの都合などで、Manifestファイルを書き換えなきゃいけない…というときは、

C:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer

に、やっぱり元となるManifest.xmlがあるので、そいつを修正してください。

※ 2013.02.18 追記
Assets\Plugins\Android にManifest.xmlを置いておけば、ビルド時にそれに書き換えてくれるので、
特に直接弄らなければならない事情が(あるのか?)なければ、Plugins\Android に置いておくほうが良いですね。
もはや記事の後半は何故書いたしwwwみたいな感じですが、まあご参考までにということで。
ちょっ、やめて、石を投げないで、、心で見下しながら静かに去らないで、、、、

Filed under: Unity 1 Comment
1210月/110

MonoDevelopの調子がおかしいと思ったら

また個人的に詰まっていた問題と解決?法を簡単にメモ。

今回はMonoDevelop関連を中心にまとめております。
本当は画像とかサンプルコードとか用意して解説した方が親切だよなー
…とは思ってますが、その間にも苦しんでる人が居るかもしれない、
記事が上がるのが遅かったばっかりに、無間地獄に囚われ、ダークサイドに堕ち、
精神的な弱みにつけこまれて、うっかり魔法少女の契約を交わしてしまう
かよわい美少女がいるかもしれないと思うと、
多少のクオリティは犠牲にしてでもスピードを優先せざるを得ない。

…という言い訳。

・いままで動いていたソースが突然動かなくなった
→ 日本語のコメントが原因?
Mainクラス直下にコメントを書き込むと、エラーを起こすことがある。
場所を変えたり、いっそコメントを削除したりすれば直る。

※追記
これも下に書いてある改行コードの問題っぽい。
場所を変えたりコメントを消したりしなくても、CRLFにすれば直ります。

・インポートしているはずのパッケージが読み込まれてない扱いになっている
→ Assets > Reflesh とかを試してみる。
MonoDevelop側から Build > Clean ALL とか試すのもあり。
Unity3.4.1にUpdateした際に、jsファイルが一斉にこのエラーを出すことがあるのだけど、
その場合はもうAssetsから退避させるか、削除するかしか解決方法がわかりません。。。

・Debug.Log等でConsoleに表示される行数と、実際に処理を行っている行数がズレている
・絶対通過するはずのブロック内の処理がなぜか実行されない
・ブレークポイントが正常に置けない。
処理を行ってる行が無効になってたり、逆にコメント行で止まったりする。

→ ファイルの文字コード、改行コードが原因かもしれない。
改行がCRだけ、LFだけになっていて、見かけ的には問題ないけど、
バイナリ的にはおかしなコードになってしまっている…と推測。
これが正解!…という訳ではないと思いますが、自分はUnicode&CRLFに直してます。
いまのところ上記の問題はこれで解決できました。

※追記
スクリプト追加するたびに毎回毎回文字コードと改行コード変えるのは面倒すぎるぜ!
…と思うなら、テンプレートを修正してしまうのいうのもアリです。
Create > XXX Script の時に新規作成されるスクリプトのテンプレはここ↓にあるので

C:\Program Files (x86)\Unity\Editor\Data\Resources\ScriptTemplates

このファイルの改行コードを修正してください。
ちょっと話はズレますが、中を見ればわかるとおり、テキストの中身もこれがそのまま
反映されるので、お好みでカスタマイズしといたりするのもいいかもですねー。

 
…見直してみると、あんまり解決方法になっていない気もしますが、
いつかどこかで誰かの参考になれば幸い至極。
※追記.
文字コードの一括変更はコイツが便利です。
Ziidetector
http://www.vector.co.jp/soft/winnt/util/se488922.html

Filed under: Unity No Comments
279月/110

Unity初心者あるある対策メモ

入門用のサンプルとか見ながら、全く同じように作っているつもりなのに
なぜかエラーが発生してうまく動かなくなった時の絶望感は異常っ……!!

という訳で、入門以前なレベルの問題で詰まったところをTIPS的に軽くメモ。
常識過ぎてワロタとか言うな!初心者には苦しい…苦しいんだっ…!!

■なぜかAwakeやStartが実行されない。

 → スクリプトがHierarchy内のどのGameObjectにも紐付けられていない。
Projectタブはただの作業フォルダみたいなもんで、置いてあるだけでは
ゲームに何の影響も与えない。及ぼさない。
なのにビルドはされるので、エラーがあると思い切り怒られたりする。
もはや罠以外の何物でもないよな。。。。

■変数に値が入らない。新しい値が反映されない。

 → UnityのInspectorタブに正しい値が入っていない。

プランナーとプログラマーとデザイナーが分業できるようにするためか、
UnityではPublicで宣言された変数はInspectorタブ内で編集できる。
配列なんかはIndexの個数も変更できたりする。

これが


こんな感じで

(さすがにGUIが対応できないのか、多次元配列はpublicでもイジれない模様)
これは慣れればむしろ激しく便利で、初期化の処理を省略できたり、
パラメータの細かい調整がコードにノータッチでもできたりするのだけど、
この時コードで指定した値より、Inspector上に入っている値の方が優先されるので、
知らないでいると結構ハマってしまう。というか、ハマった。。。

Filed under: Unity No Comments
149月/110

Unityの入門用参考書とかドキュメントとか

最近になってから、続々とUnityの参考書が発売されたり発表されたりしているようなので、
AAをベロンと貼ってご紹介。げへへ、オラに元気を分けてくれ!(最低)

Unityによる3Dゲーム開発入門
―iPhone/Android/Webで実践ゲームプログラミング


信頼と実績のオライリー本。
上級者向けのイメージがありましたが、ざっと見た感じだとPrefabって何?とか
パーティクルの付け方とか、Unityの基本的なツールの使い方も抑えてくださってるようなので、
ガチで入門用としてよさそうです。

Unityゲーム開発


こちらの日本語翻訳版。
7月に行われた「Unityの導入と実践※1」セミナーで、
バンダイナムコの方が洋書を翻訳して使っており、それが非常に役立っている
……とのお話を聞いて、いいなーうらやましいなー、僕バンダイナムっ子になりたい!
とか思っていたので、出版に至ったという事実だけで個人的には胸熱です。

その他、本ではないけど、個人的に結構役に立ったドキュメントをご紹介。

東京工科大学 教育用テキスト

 (※pdf)http://gp-portal.jp/material/refMaterial/2255_Unity%5Fdocument01%2Epdf
 クラスの実行順序※2など、Unityの基礎的な仕組みから説明してくれるので、
 手軽に試したければまずはこれ見ながらUnity触り始めてみるのがいいかも。

3D Platform Game(Unity公式サンプル)

 http://unity3d.com/support/resources/tutorials/3d-platform-game
 簡単な3Dアクションゲームのサンプルです。
 作り方のマニュアルもあり、しかも日本語翻訳版(pdf)も存在しているのですが、
 すべて読み進めた方曰く、所々バグが混ざってるとのことでしたので要注意です。
 個人的にはパーティクルのつけ方がちょっと参考になってます。

「佐藤カフジのPCゲーミング道場 第41回」

 http://game.watch.impress.co.jp/docs/series/pcgaming/20110812_466999.html
 慣れるとこの程度なら数日間でできちゃうよー という見本。
 Unity勉強したらこれくらいのことができるようになる!というイメージがつく……かも。
 敵AIの作り方の一工夫がなるほどなるほど。
 プロジェクトソース一式を公開して下さっているのも大変にステキ。

※1 レポートはこちら
   『[Unity][Unity3d]IGDA日本ゲーム開発セミナー「Unityの導入と実践」に参加して来ました』
   
※2 詳しく知りたくなったらMonoBehaviourクラスのリファレンスを参照のこと

Filed under: Unity No Comments
227月/114

UnityのC#で乱数を生成する。

.NETのC#で乱数を表示させようとする場合、Randomクラスを使うのが一番カンタンそうだけど、
(それでもシード値を変えなきゃいけなかったりとか、厳密さを求めだしたら面倒だ。。。)
UnityではRandomクラスは当然.NET FrameworkのSystemではなく、UnityEngineの中にあるため、
.NET用のサンプルコードをコピペしても、「"Next"なんて知らないわよ!!」等と怒られてしまう。

じゃあUnityではいったいどうすればいいのかとリファレンスを読んだら、
あまりにも簡単過ぎて腰を抜かしそうになったので、メモとばかりに残しておきます。

Random.value

…これだけ。
これだけで0から1.0までのfloat型の数値が返却されます。

配列の中身をランダムに取り出す…とか、ランダムな数値の範囲を絞りたい場合は

Random.Range (x, y)

と書けば、xからyまでの数値が返却されます。

※7.26 訂正
上記の書き方だと、xは含まれていても、yは含まれないみたいです。。
なので、x~yの数値に絞りたい場合は (x,y+1) と指定してやる必要があります。
余談ですが、1000回ループを何度か回してみたところ、0が平均120回前後なのに対し、
y+1はどういうわけか、70~80回前後でした。 まぁ、感覚ですけど。

※13.02.18 以下コメントを頂いたので追記
Rangeの引数はfloatもintもあります。
intのときはMAX値が含まれない(exclusive)ですが、
floatのときはMAX値が含まれます(inclusive)。

コメントありがとうございます。
ご指摘の通り、引数にはint、floatともに指定でき、
それぞれfloatの場合はmaxが含まれ、intの場合は含まれない範囲で
ランダムな値が返却されます。

リファレンスにはRangeの引数・返却される数値の型はどちらもfloatと書いてあったけど、
x・yを整数で指定すれば、返却される値も整数になるみたいです。

.NETもこれくらいシンプルならいいのに!

Filed under: Unity 4 Comments