2014年1月31日金曜日

[Unity2D] transform.positionを指定してカメラを動かすと映らなくなる

原因は Vector2 で移動先を指定したため、移動後にカメラの transform.position.z の値が0になってしまい何も表示出来なくなっていた事。

試しに SceneビューでカメラのPositionのz軸を0にして何も映らなくなれば、この方法で解決するはずです。

解決方法


  1. Vector3で移動先を指定する。この時、オリジナルのposition.zを保つようにする。


Unity2Dで初めてVector3使ったかもしれない。

2014年1月28日火曜日

Unity2Dでオーバーライド関数 "OnTriggerEnter" が機能しない

2Dプロジェクト内では、オーバーライド関数も2D専用のものが用意されている模様。

解決方法

OnTriggerEnterではなく、OnTriggerEnter2D 関数を使う。引数型も2D用の Collider2D を使用する。

2014年1月27日月曜日

Instantiate関数でオブジェクトを生成できない

Inspectorビューでオブジェクトを指定するために宣言した変数を "public GameObject x;" ではなく "public Object x;" にしてしまったことが原因。

Monoのポップアップさんは嘘つき。

2014年1月23日木曜日

現在のオブジェクトから、対象のオブジェクトまでの距離を測る

Unity2Dでシンプルな方法無いかと探していたら、Vector2のクラス関数にぴったりなものがありました。

解決方法

Vector2.Distance 関数を使う。第一、第二引数には2つのオブジェクトそれぞれの現在値を渡す(transform.positionをそのまま渡せばOK)。

Physics2D.OverlapCircle関数をforeachループのコレクションとして使えない

foreachの反復変数型としてCollider2Dを指定しているにも関わらずコンパイルエラーを吐くのでちょっと詰まってしまいました。OverlapCircleは、通常のPhysicsクラスに用意されているOverlapSphereの2D版だと思ってましたが微妙に違う模様。

解決方法

OverlapCircle 関数は配列を扱わないので、変わりにヒットした全てのColliderの配列を扱う Physics2D.OverlapCircleAll 関数を使う。

アニメーションを再生すると、そのオブジェクトがアニメーション作成時の座標に移動してしまう

 物凄い初歩的な事なんだろうけど、最初は何が起きてるのか理解できなかった。

解決方法

・原因はアニメーションさせたいオブジェクトの親オブジェクトの座標を、アニメーション内で編集してしまったこと(子オブジェクトは親オブジェクトからの相対的な座標で動くが、親はワールド座標で動く)。

・なので、空のオブジェクトを親オブジェクトとして作成し、そこへアニメーションに使用するパーツを子オブジェクトとして加える。

・この時親オブジェクトとなった空のオブジェクトの座標(Transform Position)をAnimationビューで編集しない(Rotationのみならば大丈夫)。

2014年1月21日火曜日

animファイルのWrap Modeを変更する

翔泳社より発行の、Unityで作るスマートフォン3Dゲーム開発講座 内、Wrap Modeの変更の説明で詰まったので解決法をメモ。

本で使っているバージョンのUnityだと、Animationビューの最下段にWrap Modeがあるようだが、現在のバージョンでは見当たらない。他にもバージョンアップで変更されていた箇所があるのでそこもまとめておく。


解決方法

  1. Platformsフォルダ内のTrapRoatingファイルをクリック
  2. InspectorビューにWrap Modeが表示されるので、Loopに変更
ただ単に場所が変わっただけみたいです。

 
 ・また、AnimationビューでRotationを選択するには、Add CurveTransformRotation の順でアクセスする。

 ・ゲームを再生してもトラップがアニメーションしない時は、TrapRotatingに付けたAnimationコンポーネントのAnimationにここで作ったTrapRoatingを選択する。


 本と自分が操作しているAnimationビューの見た目が明らかに違う時は、最下段のCurvesをクリックする。ただ、個人的にはDope Sheetの方が使いやすいので変えずに編集しました。

2014年1月19日日曜日

アニメーションが再生されない

Animationコンポーネントも付けたし、animation.Play() 関数も正しく書いたのに再生されない!という時は多分これです。

また、Consoleビューに
The AnimationClip 'アニメーション名' used by the Animation component 'オブジェクト名' must be marked as Legacy.
というエラーが表示されていれば間違いなくこれなので、この方法で解決すると思います。


解決方法

 1.再生したいアニメーションを選択し、Inspectorビューを表示する。

2."Inspector"の上を右クリックし、Debug を選択する。

3.Animation Type が表示されるので、'2' を '1' に書き換える。

3.Inspectorを再度右クリックし、Normal に戻す。

後はAnimationコンポーネントを確認して、animation.Play("対象のアニメーション") を実行すれば再生されるはずです。

初めてこれに遭遇した時は本当に参った。

オブジェクト同士を親子関係にすると、片方が変形する


Cube と Cylinder を親子関係にすると...

Cylinder が変形してしまう


解決方法


  1. GameObject Create Empty を選択し、空のオブジェクトを作成する。
  2. その中に、親子関係にしたいオブジェクトを全て入れる。
この方法で、変形させずに親子関係を組むことができた。


空のオブジェクトを作成して、そこに目的のオブジェクトを入れるテクニックはそれなりに重要なようで、作成中に何度かお世話になりました。