ゲーム制作において特殊効果は欠かせない要素であり、ゲーム開発者として最も重要な仕事は、ゲームに特殊効果を追加し、適切なタイミング、適切な場所で再生することですが、同時に注意を払わなければなりません。特殊効果の管理と破壊に。
モーション エフェクトやデカールなどの特定の種類の特殊効果でも、より詳細な制御を行うためにスクリプト コードを記述する必要があります。そこでこの記事では、さまざまな特殊効果の使い方を簡単に紹介します。
特殊効果やアニメーションの再生については何も難しいことはなく、多くの場合、オブジェクトをインスタンス化するだけで済みます。
1. パーティクルエフェクトを作成する
Unity Particle Pack と呼ばれる、学習と使用に適した無料のパーティクル リソースのセットがアセット ストアにあります。このマテリアルのセットをインポートした後、Unity を再起動するように求められる場合があります。プロンプトに従ってください。以下、この資料一式を使用して説明します。
リソース パッケージをインポートした後、EarthShatter などのパーティクル マテリアルのプレハブを見つけます。シーンにドラッグすると、効果がすぐにプレビューされます。特殊効果オブジェクトを選択すると、シーンに小さなツール ウィンドウが表示され、パーティクルの一時停止、再生および再生、プレビュー速度の調整が簡単に行えます。
このリソースファイルを確認すると、拡張子が「.prefab」となっており、選択すると普通のプレハブファイルであることがわかります。このオブジェクトにはパーティクル システム (パーティクル コンポーネント) がマウントされており、それぞれにパーティクル コンポーネントがマウントされている 5 つのサブオブジェクトがあります。各サブオブジェクトを個別に無効にすることで、各サブオブジェクトの動作を確認できます。たとえば、Rock Spike は生成された岩の本体、Fire Ember は飛び散る火の粉、Fire Ball はパスに沿って移動する火の玉などです。さらにパーティクル エフェクトを分析すると、特殊効果デザイナーが複数の小さな特殊効果を重ね合わせることによって、豪華で複雑な特殊効果を実現することが多いことがわかります。
特殊効果を利用するという観点から見ると、特殊効果マテリアルは単なるプレハブであるため、インスタンス化するだけで済み、オブジェクトを作成するのと変わりません。
空のオブジェクトを作成し、次のコードをマウントします。ゲームの実行中にスペース バーを押してパーティクルを再生します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreatParticle : MonoBehaviour
{
public GameObject prefabParticle;
void Update()
{
if(Input.GetButtonDown("Jump"))
{
GameObject particle = Instantiate(prefabParticle);
}
}
}
2. パーティクルエフェクトのライフサイクル
オブジェクトのライフサイクルとは、主にオブジェクトの作成から破棄までのプロセスを指します。技術開発者は、リソースの生産について気にする必要はありませんが、リソースのライフサイクルの管理には注意する必要があります。
パーティクル コンポーネントには特定の再生時間があり、ループ再生を設定したり、再生を停止したり、再生完了後に自身を破棄したりするためのライフ サイクル関連のオプションが追加されています。これらのオプションは通常、パーティクル コンポーネントの最初の編集バーにあります。
パーティクル コンポーネントのオプションのほとんどは、パーティクルの再生効果に影響を与えるため、特殊効果デザイナーの責任になります。一部のオプションはパーティクルのライフ サイクルに関連しており、技術開発者の責任が必要です。
- 継続時間、パーティクル再生の合計時間
- ループ、ループするかどうか。このオプションは、たき火などの特定の永続的なエフェクトに使用されます。
- Play On Awake、作成したらすぐに再生します。このオプションがチェックされていない場合、スクリプトがサブオブジェクトを作成した後に Play 関数を呼び出す必要があります。
- 停止アクション、パーティクルの再生が完了した後の動作
- リング バッファ モード。リング バッファを有効にするかどうか。リングバッファは、オブジェクトプールと同様のプログラム最適化技術であり、リソースのリサイクルと再利用を実現し、リソースの作成と破棄のコストを大幅に削減します。このオプションは Max Particles (パーティクルの最大数) に関連しており、現在のパーティクル オブジェクト内の多数のパーティクルを最適化します。
パーティクルの作成後にパーティクルが自動的に再生されない場合、スクリプト再生のコードは次のとおりです。
GameObject particle = Instantiate(prefabParticle);
//如果粒子没有勾选Play On Awake选项,就需要手动调用Play
ParticleSystem ps = particle.GetComponent<ParticleSystem>();
ps.play();
パーティクル オプションの停止アクションには次のオプションがあります。
- なし、何もしない
- 無効化、現在のオブジェクトを無効化します。後でもう一度再生したい場合は、最初にパーティクルを自動的に無効にすることができます
- 破棄、現在のオブジェクトを破棄します。これは、スクリプトを書かずにパーティクルを破壊する最もシンプルで簡単な方法です。
- コールバック。スクリプト メソッドを呼び出して、スクリプトを次のステップに進めます。スクリプトはパーティクルコンポーネントのオブジェクトに実装する必要がありますパーティクルのコールバックメソッドは以下の通りです
public void OnParticle SystemStopped() { Debug.Log("粒子停止"); }
一般に、一度再生したパーティクルが役に立たない場合、最も一般的な方法は、[アクションの停止] オプションを [破棄] に設定して、オブジェクトを自動的に破棄することです。他に特別なニーズがある場合、それを破棄する方法はたくさんあります。さらに、スクリプトに定期的に破棄を実行させることもでき、その時間は [Duration] です。また、[コールバック] を選択してパーティクルの再生完了後にスクリプトに通知し、スクリプトの OnParticleSystemStopped メソッドでさらに処理することもできます。
3. アニメーション特殊効果を作成する
スクリプトを使用して、対応するオブジェクトを作成するだけです。
4. 定期的にアニメーションを破棄する
アニメーションまたはアニメーションを一定期間後に破棄できるようにするには、コンポーネント化を使用してユニバーサル スクリプトを設計し、事前に破棄時間を指定し、作成されたすべてのパーティクルまたはアニメーションをマウントします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TimeDestroy : MonoBehaviour
{
public float time = 1;
void Start()
{
invoke("Destroy", time);
}
void Destroy()
{
Destroy(gameObject);
}
}
上記のコードは、Invoke メソッドを使用して呼び出しを遅延させていますが、コルーチンを使用して実装することもできます。このアイデアは非常に一般的で、ゲーム内のパーティクルや弾丸などのさまざまなオブジェクトに使用できます。
もちろん、アニメーションには「アニメーションフレームイベント」メソッドを使用することもできます。アニメーションの最後のフレームにフレームイベントを追加し、スクリプトを呼び出してアニメーションを破棄しますが、大量のアニメーションを編集するのは面倒です。
5. アニメーションとパーティクルのパラメータを調整する
ほとんどの場合、アニメーションやパーティクルのパラメータを調整する必要はなく、直接再生するだけです。場合によっては、アニメーションの加速と減速の再生、全体の時間を変更するパーティクルなど、いくつかの特別な要件が必要になることがあります。実際の例は次のとおりです。
GameObject particle = Instantiate(prefabParticle);
//如果粒子没有勾选Play On Awake选项,就需要手动调用Play
ParticleSystem ps = particle.GetComponent<ParticleSystem>();
//注意!不要再播放后修改参数,不支持
//因此测试本脚本必须取消勾选粒子的Play On Awake选项
//获取主参数,即粒子组件界面上的第一组参数
ParticleSystem.MainMoudle main = ps.main;
main.duartion = 1; //改变总持续时间
main.startSpeed = 40; //改变初始速度
main.stopAction = ParticleSystemStopAction.Destroy; //改变播放一次后的行为
//同理,获取发射参数
ParticleSystem.EmissionModule emission = ps.emission;
emission.rateOverTime = 1000; //加大发射频率
ps.Play();
上記のコードに示されているように、パーティクルのほとんどのパラメータはスクリプトを通じて変更できます。関連関数の変更により、多くの開発者がコンパイル エラーに遭遇しました。
上記のコードでは、変数を変更する前に、各パラメータ グループを一時変数 (メインやエミッションなど) に割り当てる必要があります。ただし、パラメータを 1 行の式で直接変更することはできません。これは、MainModule や Emmision などの型が構造体であり、パーティクル システムが特別な構文を使用して構造データとパーティクル コンポーネントをバインドするため、このようなまれな構文が発生するためと考えられます。
アニメーションの再生速度を変更することも一般的な要件です。サンプルコードは次のとおりです。
//创建动画prefab
GameObejct obj = Instantiate(prefab);
//给都规划加上定时销毁脚本,并定时1秒
obj.AddComponent<TimeDestroy>.time = 1;
//修改动画播放速度为2倍速
Animator anim = obj.GetComponent<Animator>();
anim.speed = 2;