Unityメモ

Unityで学んだことをメモするやつ

Post Processing Stackを使ってビジュアルをカッコよくしてみる

ポストプロセスとは、3Dを描画してした後の、2Dになった絵に対して何らかの処理をかけることを言います。

 

Unityでは公式でポストプロセッシングスタックというものがあり、いろいろなポストプロセス処理を手軽にかけることができます。

今回は設定の手順をまとめました。

 

Assets storeからPost Prosessing Stackをダウンロード

まずは以下のURLからAssetsをダウンロードします。

assetstore.unity.com

 

window > Assets storeからダウンロードしてもOKです。

以下のようにAssets内にPostProcessingというフォルダが追加されていたら完了です。

f:id:nullkun0803:20180420172926p:plain

Main Cameraにスクリプトを設定する

次にMain Cameraに`Post-processing Behaviour`というスクリプトを設定します。

スクリプトは先ほどのフォルダに入っているのですが、探すのが面倒なので、Add Componentから検索して、追加する方が早いです。

f:id:nullkun0803:20180420173326p:plain

 

Assets内にPost-Processing Profileを作成する

ここまで完了したら、Assestフォルダ内にPost-Processing Profileを追加します。

f:id:nullkun0803:20180420173521p:plain

 

追加したら、選択するとInsepctor内で様々なエフェクトを設定できるようになります。

 

f:id:nullkun0803:20180420173844p:plain

 

使い方は以上です。

どんなエフェクトがかけることができるかは公式から確認してください。

docs.unity3d.com

 

いろんなエフェクトを使えば、ただ四角が飛んでくるアニメーションも

f:id:nullkun0803:20180420134610g:plain

 

BloomとMotion Blur、Depth of Field、Antialiasingなどかけたら、割といい感じになります。

f:id:nullkun0803:20180420174415g:plain

Constant Forceコンポーネントで加速度を初期設定で追加する

リジッドボディに対して、何か力を働かせるにConstant Forceが便利そうです。

 

docs.unity3d.com

 

コンポーネントの追加は、Add Components > Physicsの中からConstant Forceを選択します。

 

f:id:nullkun0803:20180420132606p:plain

 

Forceはワールド空間内での方向ベクトル、Torqueはワールド空間内での回転ベクトルを指します。

Relative Force、Relative Torqueはローカル空間で適応されます。

 

これを使うと、前からオブジェクトが迫ってきたり、上に飛んだりといった動きが簡単に作れます。

 

f:id:nullkun0803:20180420134610g:plain

 

今回の設定はこんな感じです。

f:id:nullkun0803:20180420134713p:plain

 

Unity パフォーマンス改善のためにできる小ネタ

ドットインストールのはじめてのUnityをやった後に、公式のをやってみました。

unity3d.com

そこで、初めて知った項目をいくつかまとめました。

Void Updateとvoid FixedUpdateの違い

void Update () {}は毎フレーム処理されますが、void FixedUpdate () {}内に処理を記述すると、物理演算が働いている時のみ実行されます。 キャラクターを動かしている時だけ処理を行いたいなど、常に更新する必要がない場合は、void FixedUpdate () {}の方が有効です。

固定するオブジェクトはStaticにチェックを入れる

動的に変化しないオブジェクトはStaticにチェックを入れると処理を抑えパフォーマンスの向上に繋がるようです。 Staticは各オブジェクトのInspectorの右上の位置にあります。 f:id:nullkun0803:20180419182448p:plain

Application.LoadLevel() / 他のシーンを呼び出す

シーンの切り替えをスクリプトから行います。 ゲームの初期画面からプレイ画面への移動などの時に使用します。

まずは現在作っているシーンと別のシーンを作成します。

f:id:nullkun0803:20180419160719p:plain

シーンを作成したら、Build Settingを行います。

f:id:nullkun0803:20180419161044p:plain

Build Settingを開いて、以下のようにAssetsからドラッグ&ドロップすると、現在のプロジェクトで使用するシーンが追加されます。

f:id:nullkun0803:20180419161832p:plain

この設定をしておかないと、他のシーンから別のシーンを呼び出すことができないので注意してください。

別のシーンから呼び出す際はApplication.LoadLevel関数を使用します。 ある条件になったら、Application.LoadLevel("シーン名");という形で実行するとシーンを呼び出すことができます。

以下がその例です。

public class BallBoxScript : MonoBehaviour {

    public GameObject block;
    int n = 0;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

        if(n > 10) {
            //blockが10個以上表示された場合は、別のシーンを呼び出す。
            Application.LoadLevel("GameOver");
        } else {
            //blockが10個より少ない場合は、新しいブロックを生成する。
                    if(Input.GetButtonUp("Jump")) {
                         Instantiate(block);
                         n ++;
                    }
                }
    }
}

InstantiateでPrefub化したオブジェクトを動的に生成する

今回はInstantiateという関数を使って、Prefub化したオブジェクトを動的に生成する。

オブジェクトをPrefub化する

まずは適当な3Dオブジェクトを用意します。

用意したら、ドラッグ&ドロップでAssets内に移動します。 f:id:nullkun0803:20180411172941p:plain Hierarchy内の文字が青くなったらPrefub化された証拠です。

Instantiateを使ってプログラムからオブジェクトを生成する

まずは空のGameObjectを作ります。 f:id:nullkun0803:20180411173614p:plain このGameObjectに対して、スクリプトを設定して、Prefub化したオブジェクトを生成します。

public GameObject block;

void Start () {
    Instantiate(block);
}

まず、生成するオブジェクトについてですが、 publicをつけると、UI側から設定することが可能になります。

public GameObject block;

ドラッグ&ドロップでassets内のオブジェクトを設定すれば、読み込むことができます。 f:id:nullkun0803:20180411192609p:plain

あとはInstantiate関数に、設定したオブジェクトを引数として設定すれば完了です。

ちなみに、生成される場所は、Prefub化したオブジェクトに設定している通りのポジションになります。

Instantiate(original, , position , rotation);

第二引数、第三引数を設定すると、生成するオブジェクトの位置、回転を変更することが可能です。

docs.unity3d.com

OnTriggerEnterとOnCollisionEnterの違い / 衝突判定

物体同士の衝突の判定には、Collider.OnTriggerEnter()Collider.OnCollisionEnter()を使用します。
Unity - スクリプトリファレンス: Collider.OnTriggerEnter(Collider)
Unity - スクリプトリファレンス: Collider.OnCollisionEnter(Collision)

その前に、以下のコンポーネントについて理解しておく必要があります。

◯◯Coliderコンポーネント

衝突判定の形状を設定するコンポーネントです。 f:id:nullkun0803:20180410172843p:plain

isTrigger

isTriggerを設定すると、衝突時に発生する反発効果がなくなります。

RigiBodyコンポーネント

RigiBodyコンポーネントAdd Component > Physicsから追加することができます。

f:id:nullkun0803:20180410172847p:plain

use gravity

重力の計算を取り入れるかどうかを決めます。チェックすると物体に重力が働きます。

is kinematic

チェックをつけると物理演算が無効になります。 チェックを外すと、他の物体が衝突した時にその影響を受けるようになります。

OnTriggerEnter()

OnTriggerEnterで判定する場合は、Coliderコンポーネント内のisTriggerにチェックをつけて置く必要があります。 衝突した時の影響はなくなるので、すり抜ける時に発火します。

void OnTriggerEnter (Collider other) {
    Debug.Log("Hit" + other.gameObject.name);
}

OnCollisionEnter()

OnCollisionEnterは衝突した際の反発がある際に発火するので、Coliderコンポーネント内のisTriggerにチェックは外します。 そして、反発させるためには、判定したいオブジェクトにRigiBodyコンポーネントを追加して置く必要があります。

void OnCollisionEnter (Collision collision) {
    Debug.Log("Hit" + collision.gameObject.name);
}

参考URL
qiita.com