どもです、としです。
UnityLearnも順調に進んでいますが、
やりたいなぁと思えているチュートリアルが全部終わったらどうしようかなーとも悩んでいます。
パスウェイというコースでの講座もあるらしいので、
他のも含めてキリが付いたらやってみてもいいかもしれません。
(前回はこちら)
(講座のリンク)
1.1枚画像を分割してタイルマップを作る
前に作ったタイルマップに他の画像を追加して、新しいタイルマップを追加するステップです。
アセットにあるタイルセット用の画像を選択し、SpriteModeをMultipleに変更します。
Singleでは画像をそのまま使うのに対して、
Multipleは指定したサイズで画像を区切ることで1枚の画像を複数枚の画像に変換する機能です。
ここではPixelsPerUnitを64に設定することで、1ユニットのサイズを64x64のサイズにしています。
SpriteEditorを開いて、文章通りにSliceを選んで画像を分割してApplyで確定します。
あとはタイルパレットに追加することで使えるようになります。
残りの画像もやってしまってから次に進みます。
2.画像を配置してオブジェクトにする
このステップでは画像をオブジェクトとして作成し、
再利用できるようにPrefabとして保存するようにしていきます。
まずは置きたい画像をHierarchyかSceneにドラッグドロップで持ってって配置します。
この状態では何も設定していないのでキャラクターがただ通過するだけです。
次のステップでRenderer2Dの設定をいじるのでProjectからSettingsを探そうと記載されていますが、
ありません。
ということで、まずはこのステップで指定されている場所を探してみます。
目的としてはエクスプローラーで表示されている
このProjectSettingsをUnity内で表示させようという感じです。
あれこれやってわかった答えとしては
ここのカメラセッティングを説明と同じように変更すれば、
キャラクターが木の上部に差し掛かると木の方が上になるようになりました。
バージョン違いでこう違うと初心者にとってはかなり厳しいなぁと改めて思いました。
このあとは画像のPivotを調整します。
Pivotとは簡単に言えばUIで画像を判定する中心点で、ここの場所でTransformは判定します。
このステップの最後にPrefabフォルダを作成しておいて次にいきます。
次は針の画像を同じサイズのまま引き延ばすとタイル状に拡大できるようにしていきます。
Sceneに画像を配置してSpliteRendererでDrawModeをTileにしてTileModeをAdaptiveにすればいいのですが、
このままでは警告が出るので画像の方で設定を行います。
画像のMeshTypeをFullRectに変えると警告が無くなります。
この状態で拡大縮小を行うと特定の大きさまでは拡大されるが、それを超えるとタイル状に再配置されます。
この辺は実際に確認して試すのが早いです。
3.物理エンジンとPrefab
ステップの始めにPlayerCharacterオブジェクトをPrefabディレクトリに移動して、
Prefabを作成します。
Prefabとは再利用可能のオブジェクトのことで、Project画面から出すことで同じオブジェクトを作成できます。
Prefabの編集は注意が必要で、ディレクトリに格納された元ファイルとSceneに追加されたものと編集した後の扱いが違います。
元ファイルを変更すると使用しているPrefab自体に影響がありますが、
Sceneに追加されたPrefabを一部変更するとその部分だけオーバライドしたオブジェクトになります。
直すポイントによって挙動が変わるのでその辺は気をつけないといけないです。
ステップではPrefabの元ファイルを変更して、作業が進みます。
始めにRigidbody2Dを追加して物理エンジンをオブジェクトに追加します。
追加しただけの状態で起動すると物理エンジンにより下方向にキャラクターが落ちていきます。
次のステップではGravityScaleを0にして重力の影響を無くしていますが、
編集場所がScene内のPrefabをいじっています。
このままでは元Prefabは変更されませんが、オーバーライドした内容を元Prefabに適応すれば大丈夫です。
次のステップはHierarchy上のPrefabの右にある矢印を押して元ファイルを編集して進んでいます。
Prefabの編集方法はたくさんあるので、この段階で覚えるのがいいです。
ここではBoxCollider2Dを追加して当たり判定となる部分を作ります。
ステップではキャラクターの下半分に当たり判定を設定しています。
次のステップは当たるものを作成するために何か1つの装飾オブジェクトをPrefabにして、当たり判定を作ります。
例は針のオブジェクトで作成しています。
説明ではPrefabにしてからColliderを追加していますが、逆でも可能です。
これで障害物に当たれるようになりましたが、動かした時にキャラクターが回転してしまいます。
これを回避するためにキャラクターのRigidbodyにConsttaintsのFreezeRotationのZ軸を有効にします。
これによりZ軸が動かなくなり、回転することが無くなりました。
しかし、Collider同士が衝突している時にキャラクターがブルブル震えてしまいます。
これをジッタリングというらしく、次はコードによってこれを解消しようということです。
ジッタリングは物理演算とオブジェクトの位置のずれから起こっているようなので、
コードでは物理演算を読み込んで演算上の位置を変更することで解決しているみたいです。
新しくFixUpdateが出てきましたが、これは毎フレーム呼び出すUpdateとは違って
一定間隔で毎回呼び出されるメソッドになります。
なのでフレームに関係なく読み込めるのでフレームに依存しない動作ができるみたいです。
4.タイルマップに当たり判定
前のステップの見本用の動画ではすでにタイルマップに当たり判定があるので、
いつやるのかと思いましたがこのステップでやるみたいです。
まずGridの中にあるTilemapを選びTilemapCollider2dを追加します。
この段階ではすべてのタイルマップに当たり判定が有効になり、キャラクターが動けなくなります。
なので、Tilesディレクトリにある通れるタイルマップ画像を選択してColliderTypeをNoneにしていきます。
そうすれば一部のタイルマップ以外が通れるようになります。
これで目的は達成ですが、このままだと大きいマップになった時にColliderの多さで負荷がかかってパフォーマンスに影響するみたいです。
解消するための作業としてまずCompositeCollider2Dを追加します。
この時にRigidbody2Dも追加されます。
次にTileColliderの方でUseCompositeにチェックを入れ、RigidbodyをStaticにします。
Staticにしたことで静的オブジェクトになり、他に影響は与えるが自分は影響を受けないオブジェクトになります。
この設定にすることでタイルマップは絶対に動かないオブジェクトとして認識され、
計算が最適化して動作が軽くなるみたいです。
あとは適宜装飾にBoxCollider2Dを追加してこのステップは終了です。
まとめ
これで一通りの当たり判定ができました。
今の段階は通過できるかできないかの判定がメインで、
次は当たり判定によって処理を行うコードをやっていきます。
この辺は前にやったRuby'sAdventureとほぼ一緒ですが、
コードがどのぐらい変更になっているのか、もしくは一緒なのか
その辺を確認しつつ進めていきます。
ちなみにこの辺はほとんど一緒だったので、復習になりました。
ということで今回はこれにて!
では!