としるみSoftの制作ブログ

主に作っている作品の紹介や今やっている活動の紹介を書いています。おすすめポイントですらなくなっちゃった。

(UnityLearn)Ruby'sAdventureを作ってみた2

どもです、としです。

 

やっとある程度かけるぐらいの所まで進んだので更新です。

といってもほとんどメモ書きなこのページよりもっと詳しく書いてあるページがあるので、たぶん他所の方がわかりやすいと思います。

 

という事で、できた所まで書いていきます。

 

前回はこちら

 

toshirumisoft.hatenablog.com

 

目次

 

 

1: ワールドを作る-タイルマップ

learn.unity.com

この項目でタイルマップを作りました。

RPGツクールを経験された方ならすぐわかりますが、タイルを置くだけで地形マップが作れます。

最近のツクールはあまり知りませんがUnityのタイルマップは複数の画像を1つのタイルマップにできるので、元画像を作る時に別々の画像を作って後でまとめる方法ができます。

その辺はツクールと違って使いやすいかもしれませんが、配置はぼく的にはまだやっぱりツクールの方が慣れています。あまり変わりませんが……。

 

ステップ3で公開されている画像をタイルマップにする段取りが書かれていますが、

Unity2020.3ではメニューバーなどが変わっていて指示されたものが存在していませんでした。

f:id:toshirumisoft:20210806202637p:plain

メニューが違う

仕方がないのでTilemapのRectangularを選択しましたが、何とか同じように進める事が出来ました。

後はステップ通りにスプライトを分割してタイルマップを作っていけば、タイルマップは完成です。

マップをタイルマップで描画したらこの項目は終わりです。

 

 

2: ワールドを装飾しよう

learn.unity.com

この項目は新しいスプライトのキューブを初めに置きますが、置いただけではどれが上か下かの区別がされていないので動作が変になります。

今まで読んだ本でしたらOrder in Layerの値を変更してやっていましたが、

これだとキャラの頭がキューブと重なった時に埋まってしまうので

ここでは別の方法で解決していました。

ステップ3でプロジェクトセッティングのグラフィックスを開いて、

Transparency Sort Axisの値を変更してZ軸を0、Y軸を1にして

TransparencySortModeをCustomAxisにする。

 

f:id:toshirumisoft:20210806204232p:plain

基準を変える

こうする事でSprite Sort Pointの位置でスプライトレイヤーの上下を切り替えているが、

切り替えの位置がまだ変なのでSprite Sort Pointの位置をPivotに変える。

Pivotはスプライトなどの基準の点でtransformの値はこのPivotをどのぐらい進めるかを示している。

キューブの方はPivotをBottomにして画像の足元にして、キャラの方はSpriteEditorで指定の場所にセットしてこの項目は完成。

 

f:id:toshirumisoft:20210806205004p:plain

そのままBottomでもいい気もする。

キューブはここでPrefabにして後で再利用できるようにしておく。

他に背景素材も同じ方法で作成すると書いていますが、省いても問題なさそうです。

むしろこのチュートリアルでは最後までワールドを作らないみたいです。

 

3: ワールドとのイントラクション-動きをブロックする

learn.unity.com

Rigidbody2DとColliderの話が中心。

Rigidbody2DのGravityScaleがあると重力がY軸方向にかかるので、0にして重力を無くす。

サイドビューなら重力は必要だがこのようなトップビューは重力は付けない。

 

ステップ8の状態の移動ではColliderと接触した時にキャラクターがガタガタぶれてしまう現象を回避するのにスクリプトを変更している。

ここまでならRubyの移動の値をそのままUpdateメソッドでtransform.positionに代入して移動させていましたが、

新しいスクリプトではキー入力のコードはそのままUpdateメソッドでやって

移動のコードはすべてFixUpdateメソッドに移動して

計算されたpositionはrigidbody2D.MovePositionに代入している。

これはRigidbodyを持つオブジェクトを指定のpositionに移動させる動作を行っていて、

MovePositionはUnityで設定した感覚で毎秒呼び出すFIxUpdateメソッドで行うのを推奨している。

 

ステップ11以降ではColliderのサイズの変更を行っている。

前の項目でスプライトの描画順をY軸で判断しているのでその辺りが自然になるように設定する。

f:id:toshirumisoft:20210807202736p:plain

環境によっては微妙に誤差がある。

箱は描画処理を確認しながら設定しないとRubyが箱の上になってしまう。

f:id:toshirumisoft:20210807202853p:plain

足元だけ

Rubyは腰回りから足元をカバーするように設定している。

平面に見せないような設定の仕方だと思う。

 

TilemapにもColliderを設定して通れるところ通れないところを作っていきますが、

Tilemapは専用のColliderがあるのでそれを使って設定します。

追加した後、Tilemapが保存してあるディレクトリを開き、

個別にColliderの設定を設定してTilemapのCollider設定は終わりです。

 

ステップ13ではTilemapColliderの最適化作業をやっていて

簡単に言えば複数のTilemapColliderをComposite Colliderで1つの大きなColliderに変換して処理を軽くする方法という事です。

f:id:toshirumisoft:20210807203725p:plain

Rigidbodyが自動追加

Composite Colliderはほぼほぼ初期設定のままなので、ここではプロパティの説明はしていませんでした。

TilemapColliderでUsed by Compositeを使えば複数のColliderが1つになりますが、

初期状態だと一緒に追加されたRigidbodyで物理演算をしてしまうので

Rigidbody2dをstaticにして動かなくします。

 

ちなみにComposite Collider前にやった楽しい2Dゲームの作り方の作ったサンプルに試しに追加するとエラーや動作がおかしくなってしまったので、

ただ置いたらいいという代物ではなさそうです。

 

 

4:ワールドとのイントラクション-収集アイテム

learn.unity.com

Rubyの体力を作って回復アイテムを作る項目。

回復アイテムはColliderをトリガー判定で処理するようにしている。

 

当たり判定のトリガー周りは他の本などでよく書いているので、メモ書きは省きます。

 

他の本などでない目だった部分をいくつか書きますと、

Mathf.Clamp関数は第1引数の計算が第2引数、第3引数を超えないように計算するもの。

他のスクリプトで参照する時はpublicを付けるのが基本だが、

ステップ14でgetを使って読み取り専用の変数を作っている。

get以外にsetがあるそうだがその辺はリファレンスを参照するようにらしい。

 

 

5: ワールドとのイントラクション-ダメージソースと敵キャラクター

learn.unity.com

当たり判定部分は前の項目でもやっているのでここでは省きます。

 

当たった後の無敵時間はスクリプトでやっていて、

当たった時に無敵時間用のbool変数をtureにして、無敵時間のカウンタが無くなったら

falseにして元に戻している。

 

通常、スプライトの拡大縮小をするとスプライトが伸びてしまうが、

SpriteRendererでDrawModeをTiledにしてスプライトの設定でMeshModeをFullRectにすると、拡大縮小だけでタイル状にスプライトを並べる事が出来る。

特に背景周りはこれで行うと描画が楽になるが、Colliderのサイズはそのままでは自動で変更されないのでAutoTilingチェックを入れると自動で大きさ変更できる。

 

敵キャラはほぼほぼ今までやったので行けて、衝突判定がCollisionに変わっているのを気を付ければ大丈夫。

ただ、このスクリプトではpublicのspeed変数を変更しないとそのままでは0で進まないのを気を付ける。

 

 

あとがき

最後の方は急ぎ足になってしまいましたが、

それなりに覚えている内容の復習が多くてまたかまたかで書くのがめんどくさくなっている自分がいます。

でも、それだけ出てくるという事はこれが基本で、使うに当たっては使いこなさないといけないなぁというのはわかりました。

次の更新ぐらいで何とかこの自分メモを終えられるようになんとか進めていこうと思います。

 

 

全部終わったら近況報告で次にやる事をまとめないとなぁ。

という事で今日はこれにて!

では!