どもです、としです。
なんとか今やっているUnityLearnの項目を一通り終える事が出来ました。
という事で、自分的メモも完結まで一気に行きます。
前回はこちら
目次
- 目次
- 1: スプライトアニメーション
- 2: ワールドとのイントラクション-投射物の作成
- 3: カメラ-Cinemachine
- 4:ビジュアルスタイリング-パーティクル
- 5: ビジュアルスタイリング-ユーザーインターフェース-ヘッドアップディスプレイ
- 6:ワールドとのイントラクション-ダイアログ用レイキャスト
- 7:オーディオ
- 8:ビルド、実行、配布する
- あとがき
1: スプライトアニメーション
この項目でアニメーションを作る作業をしました。
メインのRubyのアニメーションはAsset時点ですでに作ってありましたが、
この項目で学習スピードを高めるためでした。
ここではロボットのアニメーションを作ってスクリプトでアニメーションを切り替えるまでを行いました。
前にやったUnity本などでしたらアニメーションを作った後に直接スクリプトで切り替えを行いましたが、
ここではアニメーションコントローラにパラメータを付けてアニメーションをパラメータで切り替えています。
ロボットのスプライトはすでに分割済みでしたが一部画像がおかしい部分を修正はしました。
作業的にはロボットのアニメーションコントローラを作ってアニメーションクリップをステップ通りに上下左右4つ分作ってから、アニメーションコントローラを開けば作ったクリップがこんな感じにできました。
オレンジのクリップはデフォルトのクリップーとなりますが、
この後コントローラからせっかく作ったクリップを全部削除します。
元のクリップは残っているのでもう一回追加すれば元通りにできますが、
ここではブレンドツリーというのを使っていきました。
ブレンドツリーは複数のアニメーションクリップを格納して
設定したパラメータによってアニメーションを切り替える機能で、
ここではロボットの方向ベクトルをそのままパラメータに代入して
アニメーションを切り替えるようにしています。
ブレンドツリーを使えばいちいち4方向分のアニメーション設定をしなくても
移動のアニメーション設定が出来そうなので、
ちゃんと覚えられるようにしておきたいです。
Rubyのアニメーションは移動は向きの値を正規化してパラメータを渡しやすくしている。
またここでは==より精度のいいMathf.Approximatelyを使っている。
攻撃やダメージはパラメーターに入れたトリガーをONにしてアニメーションを実行している。
パラメータを使ったアニメーションの遷移はもうちょっと理解する必要がありそうですが、
うまく使えれば直接切り替えるより複雑なアニメーションが作れそうなのでもうちょっと勉強する必要はありそうです。
2: ワールドとのイントラクション-投射物の作成
Rigidbody2Dに加速度をかける投射物の歯車を作ったら、Prefabにしてしまう。
このPrefabをキャラクターの入力でInstantiateで生成して飛ばすようにするスクリプトを作っている。
注意点は歯車オブジェクトのRigidbodyがStartメソッドで呼び出される前にInstantiateでクローンが作成されてしまうのでエラーになっている。
そこでStartより先に呼び出されるAwakeメソッドを使って歯車のRigidbodyを初期化している。
もう1つはこの歯車は他のColliderに接触すると消えるようになっているが、
Instantiateでオブジェクトが作成された位置でRubyと接触してしまって消えてしまっている。
ここはレイヤーを使ってRubyと歯車を接触しないようにしている。
それぞれレイヤー設定してその後にプロジェクトセッティングのPhysics2Dで設定した交差点のチェックを外せば接触判定が消える。
後はロボットと歯車の当たり判定と何にも当たらなかった歯車を一定距離進んだら消えるようにするスクリプトを書く。
オブジェクト削除はここでは一定の距離で消すようにしているが、画面外にカメラに追従する消去用のオブジェクトを置いてもいいかも。
ロボットのアニメーションの切り替えは作ったトリガーをONにしてアニメーションを遷移させている。
3: カメラ-Cinemachine
カメラはデフォルトのものではなくCinemachineという追加アセットを入れて行いました。
これはジョンレモンの時にも使っていて、基本のカメラより高度な動きができるものになっているみたいです。
詳しい事はリファレンスを調べる必要がありますが、結構既存のゲームなどで使われているカメラワークがゲットできるので覚えるといいかもしれません。
Lensの初期設定は環境によって違うかもしれませんがこんな感じでした。
カメラの方式は2つあり、今回はOrthographic(平行投影)カメラを使いました。
キャラに追従するカメラはFollowに追従するオブジェクトを入れるだけなので、
スクリプトを書くよりかは使いやすそう。
バーチャルカメラのAddExtensionでCinemachineConfinerを選んで、
境界となるColliderを作るとカメラが境界でストップするようになる。
境界にできるColliderはCompositeCollider2DかPolygonCollider2Dの2種類で
ここではPolygonCollider2Dで作成している。
ただ作っただけではColliderがすべて押し出してしまうので、
レイヤー設定でゲーム上のオブジェクトの当たり判定を取ってしまう。
これで何も作っていないエリアをカメラで映すことが無くなった。
4:ビジュアルスタイリング-パーティクル
この辺は値が結構ややこしくてかつ練習問題があるのに答えがないので少し難しい。
煙のエフェクトはステップ通りに行えば問題なくできる。
他のエフェクトは答えがないので完成版の方で確認すれば、1つの答えがわかるけどいまいち全体的に作り方がこの項目ではわかりにくかった感じです。
ただ、ここでわかったのは好きな画像をエフェクトにできるという事です。
パーティクルはエフェクトにかかわってくるのでリファレンスをもうちょっと確認していい感じにできるようにマスターしたいポイントです。
5: ビジュアルスタイリング-ユーザーインターフェース-ヘッドアップディスプレイ
ここでUIを作成している。
Canvasは入出力周りのEventSystemがセットでないと動作しないので、CanvasをPrefabで他のシーンに追加した時にEventSystemを追加するのを忘れないようにする。
またCanvasを使ったスクリプトにはusing UnityEngine.UIを追加するのを忘れないようにする。
Canvasの要素を配置する時にアンカーの位置を変えればそこを基準に配置する。
アンカー設定の所でAltキーを押すとオプションが変わって画像サイズを自動で変える事ができる。
画像のマスキングも可能で親オブジェクト画像にMaskコンポーネントを追加して、
子オブジェクトの画像を親画像でマスクする感じ。
この項目では主にライフの配置とスクリプトで大きさの変更だけなので、Canvasのボタンなどの使い方はUnity本の方がいいかも。
6:ワールドとのイントラクション-ダイアログ用レイキャスト
Raycastを使ってNPCとの会話を実現している。
ここではRubyの中心点から向いている方向に1.5fの長さの光線を出して、
光線に当たったオブジェクトのレイヤーがNPCの時に
ModeがWouldSpaceのメッセージ用Canvasを出現させている。
メッセージにはTextMeshPro(TMS)を利用していて、Textよりリッチフォーマットなテキストが利用できるのを使っている。
詳しい事はリファレンスだが、デフォルトではArial(Windowsの場合)を使っているTextと違ってTMSは初期段階では日本語フォントは入っていない。
ライセンスが大丈夫なフォントを使ってUnity上でフォントアセットを作ると日本語が使えるようになるので、使い方としてはTextとあまり変わらない。
7:オーディオ
基本的に音源ファイルを格納するAudioClipと音を再生するAudioSource、
音を聴く位置のAudioListenerの3種類を使うみたいです。
AudioSourceコンポーネントで起動と同時にAudioClipを流せるが、
手動でスクリプトで流すこともできる。
その場合は格納用のpublicなAudioClipを用意する必要があり、
オブジェクトにAudioSourceを用意してStartメソッドで取得する必要もある。
基本的にPlayが再生、Stopが停止、PlayOneShotが1度だけ流すになる。
AudioListenerはSpatialBlendの設定が3DのAudioSourceが近くにある時に大きく、
遠くにあるほど小さく聴こえるようにする仕組み。
ここではカメラについていたListenerを消して新しいカメラの子オブジェクトに追加している。
カメラの位置がZ=-10で遠くて設定した音源が聞こえなかったので、聴く場所を移動させた感じになっている。
設定などはリファレンスを参照した方がよさそう。
8:ビルド、実行、配布する
Player設定はプロジェクトセッティングに入っている。
アプリケーション名やアイコンや解像度、起動時設定などをここで設定する。
ただ、説明は簡素なので詳しい事はリファレンスを参照した方がいいかも。
あとがき
なんとか全部終えられました。
全部やりきった感想としましては、ジョンレモンの時と違ってゲームのクリア条件などを作らずに終えたので尻切れトンボ感は強いです。
特に効果音などは用意してあるのに実際にこのチュートリアルで完成させなかったのは少し残念でした。
でも、カメラ周りやパーティクル周り、アニメーション周りなどの大事な触りが学べたのが良かったです。
詳しい事はリファレンスが多いですが、触りでも実際に組み立てたので次にここで使おうという気持ちにはなれました。
やらなかったよりやってよかったと思えるチュートリアルでした。
という事でUnityLearnのやりたい言っていた項目が終わったので、
そろそろインプットよりアウトプット中心にしていこうと思います。
UnityLearn自体はAI探索のNaviMashを使うタイミングがあればまたやっていこうかと思いますが、今は学習はここまででいい感じです。
次に近況報告辺りでどんな感じに進んでいるか書けるようにやっていきます。
という事で今日はこれにて!
では!