としるみSoftの制作ブログ

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

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

どもです、としです。

 

なんとか今やっているUnityLearnの項目を一通り終える事が出来ました。

という事で、自分的メモも完結まで一気に行きます。

 

前回はこちら

 

toshirumisoft.hatenablog.com

 

 

 目次

 

 

1: スプライトアニメーション

learn.unity.com

この項目でアニメーションを作る作業をしました。

メインのRubyのアニメーションはAsset時点ですでに作ってありましたが、

この項目で学習スピードを高めるためでした。

ここではロボットのアニメーションを作ってスクリプトでアニメーションを切り替えるまでを行いました。

前にやったUnity本などでしたらアニメーションを作った後に直接スクリプトで切り替えを行いましたが、

ここではアニメーションコントローラにパラメータを付けてアニメーションをパラメータで切り替えています。

 

ロボットのスプライトはすでに分割済みでしたが一部画像がおかしい部分を修正はしました。

作業的にはロボットのアニメーションコントローラを作ってアニメーションクリップをステップ通りに上下左右4つ分作ってから、アニメーションコントローラを開けば作ったクリップがこんな感じにできました。

f:id:toshirumisoft:20210812223555p:plain

今までのUnity本はこれだけ作ればよかった。

オレンジのクリップはデフォルトのクリップーとなりますが、

この後コントローラからせっかく作ったクリップを全部削除します。

元のクリップは残っているのでもう一回追加すれば元通りにできますが、

ここではブレンドツリーというのを使っていきました。

 

ブレンドツリーは複数のアニメーションクリップを格納して

設定したパラメータによってアニメーションを切り替える機能で、

ここではロボットの方向ベクトルをそのままパラメータに代入して

アニメーションを切り替えるようにしています。

f:id:toshirumisoft:20210812230500p:plain

1つに4つ分のアニメーションクリップ

ブレンドツリーを使えばいちいち4方向分のアニメーション設定をしなくても

移動のアニメーション設定が出来そうなので、

ちゃんと覚えられるようにしておきたいです。

 

Rubyのアニメーションは移動は向きの値を正規化してパラメータを渡しやすくしている。

またここでは==より精度のいいMathf.Approximatelyを使っている。

攻撃やダメージはパラメーターに入れたトリガーをONにしてアニメーションを実行している。

 

パラメータを使ったアニメーションの遷移はもうちょっと理解する必要がありそうですが、

うまく使えれば直接切り替えるより複雑なアニメーションが作れそうなのでもうちょっと勉強する必要はありそうです。

 

2: ワールドとのイントラクション-投射物の作成

 

learn.unity.com

Rigidbody2Dに加速度をかける投射物の歯車を作ったら、Prefabにしてしまう。

このPrefabをキャラクターの入力でInstantiateで生成して飛ばすようにするスクリプトを作っている。

注意点は歯車オブジェクトのRigidbodyがStartメソッドで呼び出される前にInstantiateでクローンが作成されてしまうのでエラーになっている。

そこでStartより先に呼び出されるAwakeメソッドを使って歯車のRigidbodyを初期化している。

もう1つはこの歯車は他のColliderに接触すると消えるようになっているが、

Instantiateでオブジェクトが作成された位置でRuby接触してしまって消えてしまっている。

ここはレイヤーを使ってRubyと歯車を接触しないようにしている。

それぞれレイヤー設定してその後にプロジェクトセッティングのPhysics2Dで設定した交差点のチェックを外せば接触判定が消える。

 

後はロボットと歯車の当たり判定と何にも当たらなかった歯車を一定距離進んだら消えるようにするスクリプトを書く。

オブジェクト削除はここでは一定の距離で消すようにしているが、画面外にカメラに追従する消去用のオブジェクトを置いてもいいかも。

 

ロボットのアニメーションの切り替えは作ったトリガーをONにしてアニメーションを遷移させている。

 

3: カメラ-Cinemachine

learn.unity.com

カメラはデフォルトのものではなくCinemachineという追加アセットを入れて行いました。

これはジョンレモンの時にも使っていて、基本のカメラより高度な動きができるものになっているみたいです。

詳しい事はリファレンスを調べる必要がありますが、結構既存のゲームなどで使われているカメラワークがゲットできるので覚えるといいかもしれません。

 

f:id:toshirumisoft:20210813221927p:plain

初期設定

Lensの初期設定は環境によって違うかもしれませんがこんな感じでした。

カメラの方式は2つあり、今回はOrthographic(平行投影)カメラを使いました。

キャラに追従するカメラはFollowに追従するオブジェクトを入れるだけなので、

スクリプトを書くよりかは使いやすそう。

 

f:id:toshirumisoft:20210813222633p:plain

オプションがいっぱいある

バーチャルカメラのAddExtensionでCinemachineConfinerを選んで、

境界となるColliderを作るとカメラが境界でストップするようになる。

境界にできるColliderはCompositeCollider2DかPolygonCollider2Dの2種類で

ここではPolygonCollider2Dで作成している。

ただ作っただけではColliderがすべて押し出してしまうので、

レイヤー設定でゲーム上のオブジェクトの当たり判定を取ってしまう。

これで何も作っていないエリアをカメラで映すことが無くなった。

 

4:ビジュアルスタイリング-パーティクル

learn.unity.com

この辺は値が結構ややこしくてかつ練習問題があるのに答えがないので少し難しい。

煙のエフェクトはステップ通りに行えば問題なくできる。

他のエフェクトは答えがないので完成版の方で確認すれば、1つの答えがわかるけどいまいち全体的に作り方がこの項目ではわかりにくかった感じです。

ただ、ここでわかったのは好きな画像をエフェクトにできるという事です。

パーティクルはエフェクトにかかわってくるのでリファレンスをもうちょっと確認していい感じにできるようにマスターしたいポイントです。

 

5: ビジュアルスタイリング-ユーザーインターフェース-ヘッドアップディスプレイ

learn.unity.com

ここでUIを作成している。

Canvasは入出力周りのEventSystemがセットでないと動作しないので、CanvasをPrefabで他のシーンに追加した時にEventSystemを追加するのを忘れないようにする。

またCanvasを使ったスクリプトにはusing UnityEngine.UIを追加するのを忘れないようにする。

 

Canvasの要素を配置する時にアンカーの位置を変えればそこを基準に配置する。

アンカー設定の所でAltキーを押すとオプションが変わって画像サイズを自動で変える事ができる。

 

画像のマスキングも可能で親オブジェクト画像にMaskコンポーネントを追加して、

子オブジェクトの画像を親画像でマスクする感じ。

 

この項目では主にライフの配置とスクリプトで大きさの変更だけなので、Canvasのボタンなどの使い方はUnity本の方がいいかも。

 

6:ワールドとのイントラクション-ダイアログ用レイキャスト

learn.unity.com

 Raycastを使ってNPCとの会話を実現している。

ここではRubyの中心点から向いている方向に1.5fの長さの光線を出して、

光線に当たったオブジェクトのレイヤーがNPCの時に

ModeがWouldSpaceのメッセージ用Canvasを出現させている。

 

メッセージにはTextMeshPro(TMS)を利用していて、Textよりリッチフォーマットなテキストが利用できるのを使っている。

詳しい事はリファレンスだが、デフォルトではArial(Windowsの場合)を使っているTextと違ってTMSは初期段階では日本語フォントは入っていない。

ライセンスが大丈夫なフォントを使ってUnity上でフォントアセットを作ると日本語が使えるようになるので、使い方としてはTextとあまり変わらない。

 

7:オーディオ

learn.unity.com

基本的に音源ファイルを格納するAudioClipと音を再生するAudioSource、

音を聴く位置のAudioListenerの3種類を使うみたいです。

AudioSourceコンポーネントで起動と同時にAudioClipを流せるが、

手動でスクリプトで流すこともできる。

その場合は格納用のpublicなAudioClipを用意する必要があり、

オブジェクトにAudioSourceを用意してStartメソッドで取得する必要もある。

基本的にPlayが再生、Stopが停止、PlayOneShotが1度だけ流すになる。

 

AudioListenerはSpatialBlendの設定が3DのAudioSourceが近くにある時に大きく、

遠くにあるほど小さく聴こえるようにする仕組み。

ここではカメラについていたListenerを消して新しいカメラの子オブジェクトに追加している。

カメラの位置がZ=-10で遠くて設定した音源が聞こえなかったので、聴く場所を移動させた感じになっている。

 

設定などはリファレンスを参照した方がよさそう。

8:ビルド、実行、配布する

learn.unity.com

Player設定はプロジェクトセッティングに入っている。

アプリケーション名やアイコンや解像度、起動時設定などをここで設定する。

ただ、説明は簡素なので詳しい事はリファレンスを参照した方がいいかも。 

 

あとがき

f:id:toshirumisoft:20210814214243p:plain

全ステップ終わった。

なんとか全部終えられました。

全部やりきった感想としましては、ジョンレモンの時と違ってゲームのクリア条件などを作らずに終えたので尻切れトンボ感は強いです。

特に効果音などは用意してあるのに実際にこのチュートリアルで完成させなかったのは少し残念でした。

でも、カメラ周りやパーティクル周り、アニメーション周りなどの大事な触りが学べたのが良かったです。

詳しい事はリファレンスが多いですが、触りでも実際に組み立てたので次にここで使おうという気持ちにはなれました。

やらなかったよりやってよかったと思えるチュートリアルでした。

 

 

という事でUnityLearnのやりたい言っていた項目が終わったので、

そろそろインプットよりアウトプット中心にしていこうと思います。

UnityLearn自体はAI探索のNaviMashを使うタイミングがあればまたやっていこうかと思いますが、今は学習はここまででいい感じです。

次に近況報告辺りでどんな感じに進んでいるか書けるようにやっていきます。

 

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

では!