Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

【Unity】公式チュートリアル"Create with Code"をすすめる。

ちょうど1年前にこの講座でUnityにちゃんと入門した。

Udemy - ユニティちゃんが教える!初心者向けUnity講座

そのときはまさかこんな形でUnityエンジニアにジョブチェンジするとは思っていなかった。

ただこの講座で学んだことはすっかりどこにもメモが残されておらず、結局学んだこともほとんど記憶から消えてしまった。

もったいない。

当時のツイートが出てきた。そうだ、たしかに年越しをこれしながら過ごした記憶がある。

それにしてもSNSに動画を上げている余裕があるならやったことのメモくらいブログなりに残しておいてほしいものだ。

単純なゲームだったがエッセンスがつまっていた(ように思う)のでとりあえずなにか始めたい人におすすめしたい。

さて、次の仕事まで暇な時間ができたので今回のUnity入門は公式のチュートリアルを始めることにした。

この中から探した。

どれがいいとかわからにので一番購読されていそうな「Create with Code」を始めた。 40時間近いコースとなっているが、コードがある程度書ける人ならその半分ちょいで一周できると思われる。 f:id:taiga006:20191215222703p:plain

…と言ってもまだ完走していないのだが…。

まあ、気長に続けていこう。


2020.01.09 終わらせた。 f:id:taiga006:20200110001819g:plain


やったらメモ残す。

①障害物のある道路を車を操作して進むだけのゲーム
- public変数はInspector上から操作できる
- Vector3.forward -> (0,0,1) みたいな便利なのか何なのかわからないメソッドがある
- ゲームなどのインプット機構はプロジェクトごとに変更できる
- Edit -> Project Settings Input他、プロジェクトに関する設定を変更できる
- Scene Viewの視点操作が癖がある、といってもBlenderやTDから入ったからそう感じるだけだと思う
-Input.GetAxis("Horizontal")などでそのプロジェクトで設定されたHorizontalのキーの値を-1~+1の間で取得できる

f:id:taiga006:20191208171201p:plain

②動物版インベーダー
- オブジェクトの消失はDestroy(gameObject)で簡単にできる
- Random.Range(int min, int max) はmin≦x<maxとなる
- PrefabsはHierarchy上のオブジェクトをProjectにD&Dで作成できる(インスタンスからクラスのデータを吐き出す、みたいなイメージかな?)
- カメラの投影方法はCamera->ProjectionからOrthographic(正投影) or Perspective(遠近投影)が選べる
- InvokeRepeatingは指定秒数後に発火させる(そして繰り返す)ことができる(=コルーチンに近い仕組み?)
- オブジェクトの設定を更新したときPrefabにあるものに関してはOverridesで適用するか破棄するか選ぶことができる(クラスの情報を更新する感じ)
- GetKey => 連続的なキー選択、GetKeyDown => 瞬間的なキー選択 を検知できる

f:id:taiga006:20191209230113p:plain

③横スクロールジャンプゲーム(サウンド&エフェクト付き)
- GetComponent<name> で名前空間or型がnameのコンポーネントを取得
- unity内の物理についてはUnityEngine.Physicsで操作可能
- RigidBody(=物理演算を受けるコンポーネント)のConstraintsで位置や向きを任意に固定できる
- Collider(=衝突判定に使うコンポーネント)この2つはBlenderでおなじみ
- objectにtag付けできる
- tagの比較はgameObject.CompareTagで可能
- scriptもコンポーネントなので他スクリプトから呼び出すことができる
- ただしその中でpublic変数のみが呼び出せることに注意
- Animatorを使うとノードベースの条件分岐でアニメーションを切り替えられる
- ノードの矢印を押すとその状態遷移の条件がわかるのでそれをスクリプト上で操作すれば良い(SetTrigger(), SetBool(), SetInt() etc...)
- エフェクトを管理する一つのクラスにParticleSystemがある(コンポーネントではないっぽい。)
- ゲームのBGMはカメラに当てる。(Audio Sourceコンポーネント)
- scriptから音楽をいじる場合はAudioClipで音源自体を管理、AudioSourceで再生を管理

f:id:taiga006:20191215215010p:plain

④
- child object 親の状態に左右される(今回ではカメラの回転)
- local座標でのtransformとglobal座標でのそれをうまく使い分ける
- Physical MaterialはGameObject同士の衝突時の跳ね返り等について管理するコンポーネント、コライダのMaterialとして設定する
- OnTriggerEnter -> 接触&通過を検知(ColliderのIsTriggerをONにしておけばOK)
- OnCollisionEnter -> 接触&衝突を検知(衝突物、対象物ともにColliderとRigidbodyを持つ.)
- 動くもの同士の衝突判定=> Collision系
- どちらかが動かない衝突判定=> Trigger系
- StartCoroutine(Method()) -> IEnumerator() { yeild return WaitForSeconds(N); ....}; でN秒後に次の処理を発火させることができる(コルーチン)
- FindObjectsOfType<XXX> でXXX型の(アクティブな)オブジェクトをすべて取得できる.指定しなければすべてのオブジェクトを取得する.

f:id:taiga006:20200108233344p:plain

⑤
- 関数の宣言時に何も書かなければすべてprivateになる
- Array(List)クラスとList<T>クラスは似たような使い方ができるが、前者の要素は型に縛られないのに対して後者は<T>の型しか取らない。よって前者は取り出すときにチェック、キャストをしなければならない。(Listのほうが使い勝手が良い。)
- GameManager Scriptとかはよく使うので勝手にアイコンがGearのものになる。他にもあるのかな。特に便利には感じない。
- SceneManagerのライブラリを使うことでシーンの再読み込みなどが可能。
- Empty Objectのchildに複数のObjectをグルーピングさせてSetActiveさせると楽。

f:id:taiga006:20200108232951p:plain