ミニマムブロック

頭の中でつながるまで

Unityの教科書 はじめに

〇学ぶべきは、ゲーム作りの流れ!

①画面上のオブジェクトをすべて書き出す

②オブジェクトを動かすためのコントローラスクリプトを決める

 動くオブジェクトがどれになるかを考える。

 動くオブジェクトにつけるのがコントローラクラス。

 キャラクターコントローラなど

③オブジェクトを自動生成するためのジェネレータスクリプトを決める

④UIを更新するための監督スクリプトを用意する

スクリプトを作る流れを考える

 

スクリプトの使い方

オブジェクトを動かすための台本がスクリプト

例:マウスに合わせて動くスクリプトをオブジェクトにアタッチ→動く

 

〇実践:オブジェクトを動かしてみる

スクリプトを作成

ゲームオブジェクトを追加(createEmptyで作成が可能)

 

スクリプトを動かすには、オブジェクトが必要

例:キャラクタを動かしたい→キャラクタオブジェクトにスクリプトをアタッチ

例:カメラを動かしたい→カメラオブジェクトにスクリプトをアタッチ

 

〇継承について

MonoBehaviorはゲームオブジェクトの基礎メソッドを集めたもの。

ゲームオブジェクトにアタッチするスクリプトはこれを継承する必要がある。

 

Vectorクラスを使ってみる

キャラクタなどを動かすときによく使う。

x, y, zの3方向を扱うクラス。

 

〇構造体とは

クラスより早く動く代わりに、機能制限があるもの。機能制限付きのクラス?

 

〇物体を移動させる

transform.translate(x, y, z);を使う

translateメソッドの引数は、移動先じゃなくて、移動量を表す。

translate(3, 0, 0)であれば、(3,0)に移動するのではなく、現在位置に(3,0)をプラスするイメージ。

 

〇スワイプ距離を求める方法

ボタンクリック時の位置を初期値として取得

マウスを移動し、ボタンを離す。

ボタンを離したときの位置をスワイプ後の位置として取得

移動後の位置 - 移動前の位置で、移動量を取得できる。

移動後は8、移動前が3なら、移動値は5。

 

EventSystemとは?

ユーザーの入力とUIを中継するオブジェクト。

 

コンポーネントとは

オブジェクトのもつ特徴を扱う。

物理挙動を扱うとき→RigidBody

音を扱うとき→AudioSource

座標や回転、移動を扱うとき→transform

 

自分以外オブジェクトのコンポーネントにアクセスする方法

①Findメソッドでオブジェクトを探す

②GetComponentメソッドでオブジェクトの持つコンポーネントを取得する

コンポーネントの持つデータにアクセスする

 

〇オブジェクトを量産する

Prefabは設計図

工場の作り方

①すでにあるオブジェクトから、prefab(設計図)を作る

②ジェネレータスクリプトを作る

③EmptyObjectにジェネレータスクリプトをアタッチする

④ジェネレータスクリプトにPrefabをアタッチする

 

〇ジェネレータの中で時間を計る方法

Time.deltaTimeがUpdate時のフレーム経過の時間

これを変数timeにプラスしていく

もしtimeが1秒より大きくなったら、という条件で動かすと、1秒ごとに

工場が動作する。

 

〇ジェネレータスクリプトにprefabをくっつける方法

・ジェネレータスクリプトの受け入れ準備、public でオブジェクトをスクリプト内に宣言する

・インスペクタービューで、prefabをドラッグドロップでくっつける。

 

〇重力をくっつける方法

physicsを利用する。

physicsは、rigidbodyとcolliderから成り立つ

 

〇重力を無効化する方法

ステージの足場など、colliderは欲しいが、物理法則が当てはまってほしくない場合

Body TypeのKinematicに変更する。こうすれば物理力の影響を受けない。

 

〇physicsを使った場合の移動方法

オブジェクトに力を加える方法がおすすめ。直接座標を変えた場合、当たり判定が保障されず、オブジェクトとの衝突でもすり抜ける可能性が出てくる

 

〇ジャンプの仕組み

コントローラスクリプトのupdateメソッドにキーダウンを追加

this.rigid2d.addForce(transform.up * this.jumpForce);

でいいらしい。

ジャンプがふわふわしてしまう場合は、Gravity Scaleで重力を設定すると、

いい感じに重みがでる。

 

〇カメラを移動させる

updateメソッドの中で

主人公のポジションを取得

カメラのポジションを主人公のポジションに設定する

 

〇当たり判定時のcolliderとrigidbodyのつけ方

当たり判定を行いたい場合、colliderは両方のオブジェクトに必要

rigidbodyは一方のオブジェクトのみでよい。

 

〇スクリーン座標とワールド座標

2つは別物。Input.mousePositionで取得できるのは、スクリーン座標のみ

それを3Dで使う場合、ワールド座標への変換が必要。それが、ScreenPointToRay!

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

Vector3 worldDir = ray.direction;

igaguri.GetComponent<IgaguriController>().Shoot(worldDir.normalized * 2000);

これで、タッチしたスクリーン位置を取得したのち、イガグリを3D空間に飛ばすことができる。

 

〇ScreenPointToRayから得られるもの

origin → カメラの位置座標

direction → タップした座標から向かうベクトル

 

〇onCollisionEnterとonTriggerEnterの違い

onCollisionEnterの場合、衝突時に跳ね返り処理、物理処理が働く

onTriggerEnterの場合、衝突時に物理処理はしない。通り抜ける。