Post Processing Stackを使ってビジュアルをカッコよくしてみる
ポストプロセスとは、3Dを描画してした後の、2Dになった絵に対して何らかの処理をかけることを言います。
Unityでは公式でポストプロセッシングスタックというものがあり、いろいろなポストプロセス処理を手軽にかけることができます。
今回は設定の手順をまとめました。
Assets storeからPost Prosessing Stackをダウンロード
まずは以下のURLからAssetsをダウンロードします。
window > Assets storeからダウンロードしてもOKです。
以下のようにAssets内にPostProcessingというフォルダが追加されていたら完了です。
Main Cameraにスクリプトを設定する
次にMain Cameraに`Post-processing Behaviour`というスクリプトを設定します。
スクリプトは先ほどのフォルダに入っているのですが、探すのが面倒なので、Add Componentから検索して、追加する方が早いです。
Assets内にPost-Processing Profileを作成する
ここまで完了したら、Assestフォルダ内にPost-Processing Profileを追加します。
追加したら、選択するとInsepctor内で様々なエフェクトを設定できるようになります。
使い方は以上です。
どんなエフェクトがかけることができるかは公式から確認してください。
いろんなエフェクトを使えば、ただ四角が飛んでくるアニメーションも
BloomとMotion Blur、Depth of Field、Antialiasingなどかけたら、割といい感じになります。
Constant Forceコンポーネントで加速度を初期設定で追加する
リジッドボディに対して、何か力を働かせるにConstant Forceが便利そうです。
コンポーネントの追加は、Add Components > Physicsの中からConstant Forceを選択します。
Forceはワールド空間内での方向ベクトル、Torqueはワールド空間内での回転ベクトルを指します。
Relative Force、Relative Torqueはローカル空間で適応されます。
これを使うと、前からオブジェクトが迫ってきたり、上に飛んだりといった動きが簡単に作れます。
今回の設定はこんな感じです。
カメラの外に出たかどうかを判定する
カメラから消えた時に、オブジェクトを消したい際はRender.isVisubleを確認するだけで、簡単にできるそうです。
if (!GetComponent<Renderer>().isVisible){ Destroy(this.gameObject); }
これだけで、消すことが可能です。
Unity パフォーマンス改善のためにできる小ネタ
ドットインストールのはじめてのUnityをやった後に、公式のをやってみました。
そこで、初めて知った項目をいくつかまとめました。
Void Updateとvoid FixedUpdateの違い
void Update () {}
は毎フレーム処理されますが、void FixedUpdate () {}
内に処理を記述すると、物理演算が働いている時のみ実行されます。
キャラクターを動かしている時だけ処理を行いたいなど、常に更新する必要がない場合は、void FixedUpdate () {}
の方が有効です。
固定するオブジェクトはStaticにチェックを入れる
動的に変化しないオブジェクトはStaticにチェックを入れると処理を抑えパフォーマンスの向上に繋がるようです。 Staticは各オブジェクトのInspectorの右上の位置にあります。
Application.LoadLevel() / 他のシーンを呼び出す
シーンの切り替えをスクリプトから行います。 ゲームの初期画面からプレイ画面への移動などの時に使用します。
まずは現在作っているシーンと別のシーンを作成します。
シーンを作成したら、Build Settingを行います。
Build Settingを開いて、以下のようにAssetsからドラッグ&ドロップすると、現在のプロジェクトで使用するシーンが追加されます。
この設定をしておかないと、他のシーンから別のシーンを呼び出すことができないので注意してください。
別のシーンから呼び出す際は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内に移動します。 Hierarchy内の文字が青くなったらPrefub化された証拠です。
Instantiateを使ってプログラムからオブジェクトを生成する
まずは空のGameObjectを作ります。 このGameObjectに対して、スクリプトを設定して、Prefub化したオブジェクトを生成します。
public GameObject block; void Start () { Instantiate(block); }
まず、生成するオブジェクトについてですが、 publicをつけると、UI側から設定することが可能になります。
public GameObject block;
ドラッグ&ドロップでassets内のオブジェクトを設定すれば、読み込むことができます。
あとはInstantiate関数に、設定したオブジェクトを引数として設定すれば完了です。
ちなみに、生成される場所は、Prefub化したオブジェクトに設定している通りのポジションになります。
Instantiate(original, , position , rotation);
第二引数、第三引数を設定すると、生成するオブジェクトの位置、回転を変更することが可能です。
OnTriggerEnterとOnCollisionEnterの違い / 衝突判定
物体同士の衝突の判定には、Collider.OnTriggerEnter()
、Collider.OnCollisionEnter()
を使用します。
Unity - スクリプトリファレンス: Collider.OnTriggerEnter(Collider)
Unity - スクリプトリファレンス: Collider.OnCollisionEnter(Collision)
その前に、以下のコンポーネントについて理解しておく必要があります。
◯◯Coliderコンポーネント
衝突判定の形状を設定するコンポーネントです。
isTrigger
isTriggerを設定すると、衝突時に発生する反発効果がなくなります。
RigiBodyコンポーネント
RigiBodyコンポーネントはAdd Component > Physics
から追加することができます。
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