読者です 読者をやめる 読者になる 読者になる

戸森ブログ

主にUnityやC#のTipsを書いていきます

【Unity】 DOTweenで他のスクリプトと競合しない画面揺れ演出を実装する

Unity C# DOTween

DOTweenとは?

DOTweenはUnityの高機能なTweenエンジンです。
拡張メソッドを採用しており、これまで使ってきたTweenエンジンの中で最も使いやすいと感じています。

画面を揺らす

・必殺技を発動したとき
・敵から攻撃を受けたとき
・爆弾が爆発したとき
・巨大なキャラクターが地面を踏み鳴らしたとき

上記のように画面を揺らす演出は2Dゲーム, 3Dゲーム問わず様々なゲームで行われています。


画面を揺らす処理を実装するにはカメラを振るように移動させる処理を記述します。
自前で書くのは骨が折れますが、有り難いことにDOTweenには振る動きをつけるための拡張メソッドが多数用意されています。

// 振動時間: 1.0f 振動の強さ: 3.0f 振動数: 10 振動のランダム性: 90.0f
GetComponent<Camera>().DOShakePosition(1.0f, 3.0f, 10, 90.0f);

DOTweenを使用することで、上記のように簡潔にカメラを振る処理を記述することが出来ます。

他のスクリプトと競合しない画面揺れ演出を実装する

常に静止しているカメラなら前項の処理でも問題ないのですが
アクションゲームなどではカメラがプレイヤーを追従することが多く
追従カメラの処理がカメラを振る処理を打ち消してしまうことがあります。

そのために競合しない画面揺れ演出のソースコードを書いてみました。

使用例


実行結果

f:id:tomori-aki2961:20160730224800g:plain

まとめ

振動の強さは2Dゲームではzの値を0.0fにするなど注意が必要です。
爆弾が爆発したときはxの値とyの値を与える、巨大なキャラクターが地面を踏み鳴らしたときはyの値のみを与えるなど
力がどのように働いているかを考えたり、既存のゲームを観察してみると面白いかもしれません。

【Unity】 int Random.Range(int min, int max)の最大値を含める汎用メソッド

Unity C# 汎用メソッド

使用例


実行結果

f:id:tomori-aki2961:20160729104547p:plain

参考にさせていただいたサイト

[Unity] Random.Range()を使う場合の注意点 | ftvlog

【Unity】 DOTween + MaterialPropertyBlockでメモリに優しいアルファのフェード処理をする

Unity C# DOTween 最適化

DOTweenとは?

DOTweenはUnityの高機能なTweenエンジンです。
拡張メソッドを採用しており、これまで使ってきたTweenエンジンの中で最も使いやすいと感じています。

DOTweenでアルファのフェードアウト処理を書く

// 現在のアルファ値から0.0fまで3秒間で遷移する
GetComponent<Renderer>().material.DOFade(0.0f, 3.0f);

DOTweenを使用することで、上記のように簡潔にアルファのフェードアウト処理を記述することが出来ます。

MemoryProfilerでMaterialを確認する

前項の処理でも使用する分には問題ないのですが、多数の同一オブジェクトにアタッチしている場合
Materialがオブジェクトの数だけ生成されてしまいSetPassと消費メモリが増えてしまいます。

試しに3種類の破片を各100個 ( 計300個 )生成してMemoryProfilerで確認してみます。
f:id:tomori-aki2961:20160728153732p:plain

小さいですが左上に0.6MBと書かれています、Materialもオブジェクトの数だけ生成されており多いです。
f:id:tomori-aki2961:20160728153805p:plain

Materialの設定が僅かに異なる場合、MaterialPropertyBlockを使用することで効率的な描画及びMaterialの生成を抑えることが出来ます。
次項にMaterialPropertyBlockを使用したソースコードを掲載します。

実行結果

先ほどと同じく破片を300個生成してMemoryProfilerで確認してみます。
f:id:tomori-aki2961:20160728160156p:plain

Materialの数が各破片毎に1つ ( 計3つ ) だけになり消費メモリも60.3KBまで抑えられました。

まとめ

今回はアルファのフェード処理を例に上げましたがUVスクロールなどでもMaterialPropertyBlockを活用することが出来ます。
多数の同一オブジェクトのMaterialの設定を変更する場合に活用してみると良いと思います。

参考にさせていただいたサイト

esakun.hateblo.jp
tsubakit1.hateblo.jp
tsubakit1.hateblo.jp

【Unity】 子オブジェクトを取得する拡張メソッド

Unity C# 拡張メソッド

" 全ての "子オブジェクトを取得したい場合

コガネブログ様の記事が参考になります。
本記事の内容も下記の記事を参考に書かせていただきました。
baba-s.hatenablog.com

【C#】 delegateに代入された複数のメソッド名を取得する

C#

ソースコード

foreach (Action d in multicastDelegate.GetInvocationList())
{
    string methodName = "MethodName: " + d.Method.Name;
    Debug.Log(methodName);
}

使用例


実行結果

f:id:tomori-aki2961:20160726072909p:plain

【Unity】 処理時間を計測する

Unity C#

使用例


実行結果

f:id:tomori-aki2961:20160725130506p:plain

参考にさせていただいたサイト

developer.wonderpla.net