Unity - さまざまな特殊効果を使用する基本的な方法

ゲーム制作において特殊効果は欠かせない要素であり、ゲーム開発者として最も重要な仕事は、ゲームに特殊効果を追加し、適切なタイミング、適切な場所で再生することですが、同時に注意を払わなければなりません。特殊効果の管理と破壊に。

モーション エフェクトやデカールなどの特定の種類の特殊効果でも、より詳細な制御を行うためにスクリプト コードを記述する必要があります。そこでこの記事では、さまざまな特殊効果の使い方を簡単に紹介します。


特殊効果やアニメーションの再生については何も難しいことはなく、多くの場合、オブジェクトをインスタンス化するだけで済みます。

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. パーティクルエフェクトのライフサイクル

オブジェクトのライフサイクルとは、主にオブジェクトの作成から破棄までのプロセスを指します。技術開発者は、リソースの生産について気にする必要はありませんが、リソースのライフサイクルの管理には注意する必要があります。

パーティクル コンポーネントには特定の再生時間があり、ループ再生を設定したり、再生を停止したり、再生完了後に自身を破棄したりするためのライフ サイクル関連のオプションが追加されています。これらのオプションは通常、パーティクル コンポーネントの最初の編集バーにあります。

パーティクル コンポーネントのオプションのほとんどは、パーティクルの再生効果に影響を与えるため、特殊効果デザイナーの責任になります。一部のオプションはパーティクルのライフ サイクルに関連しており、技術開発者の責任が必要です。

  1. 継続時間、パーティクル再生の合計時間
  2. ループ、ループするかどうか。このオプションは、たき火などの特定の永続的なエフェクトに使用されます。
  3. Play On Awake、作成したらすぐに再生します。このオプションがチェックされていない場合、スクリプトがサブオブジェクトを作成した後に Play 関数を呼び出す必要があります。
  4. 停止アクション、パーティクルの再生が完了した後の動作
  5. リング バッファ モード。リング バッファを有効にするかどうか。リングバッファは、オブジェクトプールと同様のプログラム最適化技術であり、リソースのリサイクルと再利用を実現し、リソースの作成と破棄のコストを大幅に削減します。このオプションは Max Particles (パーティクルの最大数) に関連しており、現在のパーティクル オブジェクト内の多数のパーティクルを最適化します。

パーティクルの作成後にパーティクルが自動的に再生されない場合、スクリプト再生のコードは次のとおりです。

GameObject particle = Instantiate(prefabParticle);
//如果粒子没有勾选Play On Awake选项,就需要手动调用Play
ParticleSystem ps = particle.GetComponent<ParticleSystem>();
ps.play();

パーティクル オプションの停止アクションには次のオプションがあります。

  1. なし、何もしない
  2. 無効化、現在のオブジェクトを無効化します。後でもう一度再生したい場合は、最初にパーティクルを自動的に無効にすることができます
  3. 破棄、現在のオブジェクトを破棄します。これは、スクリプトを書かずにパーティクルを破壊する最もシンプルで簡単な方法です。
  4. コールバック。スクリプト メソッドを呼び出して、スクリプトを次のステップに進めます。スクリプトはパーティクルコンポーネントのオブジェクトに実装する必要がありますパーティクルのコールバックメソッドは以下の通りです
    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;

 

 

おすすめ

転載: blog.csdn.net/m0_63024355/article/details/132274296