2011年12月08日

[Unity] 参考書 : Unityではじめるゲームづくり

バンダイナムコゲームスのスタッフの汗と涙の結晶とも言える1冊だと思います。
社内勉強会で使った資料や、サンプルアセット/プログラムがあってどれも質が高い!

内容としては、
所々に3DCGの前知識が必要だったり、プログラムの知識が必要だったり、Unity3Dをある程度
触っていないとわからないところがありました。

でも、1つ1つを着実にクリアしていければ、確実にUnityの理解力は上がると思います。
2週間かけてひと通り読み終えて、サンプルプログラムを必要最低限動かすことができました↓

20111206unityTraining.jpg

何が良かったかというと、企画書を作るところから始まり、ゲームを作り上げるまでの過程を
小規模ながら体験できた点です。
ひと通りゲーム制作フローを体験できたことで、次に自分がゲームを作ろうと考えたときに
どの時点でどんな作業が必要なのかが今までよりも明確にイメージできるようになりました。

それに、以前やったことが割愛されていたり、本の記述だけを頼りにしているとプログラムが
一部付属サンプルと違っていたり(サンプルが正解)するので、
途中でちゃんと復習する機会がありました。
これまで何となく使っていたUnityを、これからはもっと効率よく使っていけそうです。

サンプルプログラムを作り上げていく中で自分がハマった所は2つ。

p.279 ※初版のページ数です
敵の攻撃を受けてWidget(プレイヤー)が死んでしまうのですが、本をもとに作っているとWidget
は無限に回復して死にません。
理由は、p.232のアニメーションイベントで、一定間隔でWidgetを回復させてしまっているからでした。
アニメーションイベントを削除すると当初の目的どおりにWidgetが死にます。

p.387
敵が死亡するプログラムのところで、
GameObject.Find("root").GetComponent(SkinnedMeshRenderer).enabled = false;
の1行が「SkinnedMeshRendererが適用された"root"なんて見つからない!」と怒られました。
原因は特定できていませんが、この1行をコメントアウトすると、本の記載とは動作が若干
違います(敵が消えないままエフェクトが発動する)がプログラムは動作しました。

------------------- 追記(2012.2.18) -------------------
いただいたコメント通りに修正したら動きました!
敵の root プレファブに「rootタグ」を付与しました↓

201202018unity_training_fix01.png

敵の死亡イベントが無事発生しました↓

201202018unity_training_fix02.png

-------------------------------------------------------

Unityを何となく触っていた自分にとっては目から鱗、
とても充実したゲーム制作の擬似体験が出来た1冊でした。

サンプルプログラムはわざと未完成のまま収録されているので、
さらなる勉強のために本に記載されてあるヒントをもとにゲームを完成させるのも
また勉強になりそうです。

posted by be-style at 01:02| Comment(5) | Unity
この記事へのコメント
p.387のエラーですが、どうもオブジェクト名とtag名の区別がはっきりしないことが原因かと思われます。
GameObject.Findの引数にはtag名を指定するようで、私がオブジェクrootのtag名を「root」にしたところ正常に動作しました。
tag名を指定しないと、「untagged」のなったままで、「root」というタグから作らなくてはならないので、ちょっと面倒ですが、ここで引っかかっている方は試してみてください。
Posted by fxpilot at 2012年02月15日 13:25
コメントありがとうございます。
正常に動作されたのですね!

原因はタグですか。全然気づきませんでした。
こちらでも早速試してみます!
Posted by be-style at 2012年02月16日 08:34
いただいたコメント通りに修正したら無事動作しました!
記事にもその内容を追記しておきました。

ありがとうございました!
Posted by be-style at 2012年02月19日 00:04
追伸
その後、リファレンス等を調べてみると、
GameObject.FindWithTag --->オブジェクト名で検索
GameObject.FindWithTag --->タグで検索
ということなので、タグで検索する場合は、本来GameObject.FindWithTagを使うべきなのですが、GameObject.Findでオブジェクト名で拾おうとしていろいろやってもどうしてもうまく行きません。また、GameObject.Findで、タグ名で拾ってしまうのも不思議です。
初心者が言うのも危険なのですが、どうもバグではないかと思います。


Posted by fx_pilot at 2012年03月01日 10:01
追伸ありがとうございます。

サンプルプログラムでは、オブジェクト名とタグ名が「root」という同じ名前なので厄介なことになっているのかもしれません。
下記のように、該当箇所でFing()とFindWithTag()を試したらうまくいきました。

■Find("オブジェクト名") ※参考書どおり
GameObject.Find("root").GetComponent(SkinnedMeshRenderer).enabled = false;

■FindWithTag("タグ名") ※今回コメントを頂いたとおり
GameObject.FindWithTag("root").GetComponent(SkinnedMeshRenderer).enabled = false;

ちなみに、rootゲームオブジェクトに「test」という別のタグを付与してみた場合は

GameObject.Find("test").GetComponent(SkinnedMeshRenderer).enabled = false;
→NullReferenceException

GameObject.FindWithTag("test").GetComponent(SkinnedMeshRenderer).enabled = false;
→正常動作

ということで、Find()でタグ名は拾わないようでした。
今後も何かお気づきの点がありましたら、コメントいただけると助かります!
Posted by be-style at 2012年03月01日 14:00
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]