Unity- Car Tire burnout smoke

前言

我們常常在賽車遊戲裡面看到車輪因為高速轉動而產生煙霧的效果,而這種燒胎的感覺也是可以在Unity裡面實現,如果掌握得好的話更可以應用在CarDamage產生較大破壞上的煙霧產生,讓我們的場景可以更加的貼近真實世界,今天我們就來練習如何在高速的行進中讓輪胎產生煙霧效果。

  1. 首先我們需要Standard Assets的Particle效果,如果你的UnityAsset裡面沒有這個資料夾的話可以上Assets Store下載 Standard Assets 封包(免費)導入Asset裡面,主要我們會用到Particle System裡面的ParticleSmoke效果。

接著我們可以在Standard Assets資校夾裡面找到我們要用到的Particle Smoke Prefab, Steandard Assets> Vehicles> Prefabs > car

找到已可以直接將車子的Prefab拉到Scene裡面

2. 我們把Car拉到Scene以後可以看到Car的prefab裡面有一個ParticleBurmoutSmoke的Prefab物件,這個Particle就是我們今天要使用的主角。

點選 ParticleBurmoutSmoke 其實就可以Realtime看到煙霧的效果,這邊的煙霧是被當作排氣管的煙霧效果。

3. 我們找到 ParticleBurmoutSmoke 首先要將他拉出來,因為我們是要用在車輪上面的效果,所以我們需要複製四個 ParticleBurmoutSmoke prefab使用,複製出來以後直接複製車輪的位置貼上以後讓四個 ParticleBurmoutSmoke 的位置與我們的車輪位置相同。

確認一下 ParticleBurmoutSmoke 的位置是否是正確的,我們可以點選 所有的ParticleBurmoutSmoke 即可Realtime看到煙霧的位置是否正確。

Realtime Render

4. 再來我們就需要寫一些C#語法來控制這些 ParticleBurmoutSmoke

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarEffects : MonoBehaviour
{

    public Material brakeLights;
    public AudioSource skidClip;
    public TrailRenderer[] tireMarks;
    public ParticleSystem[] smoke;
    public ParticleSystem[] nitrusSmoke;
    private controller CarControllerEddie1;
    private void FixedUpdate()
    {
        if (gameObject.tag == "AI") return;
        activateSmoke();
    }
    //啟動煙霧
    private void activateSmoke()
    {
        if (CarControllerEddie1.playPauseSmoke) startSmoke();
        else stopSmoke();

        if (smoke)
        {
            for (int i = 0; i < smoke.Length; i++)
            {
                var emission = smoke[i].emission;
                emission.rateOverTime = ((int)CarControllerEddie1.KPH * 10 <= 2000) ? (int)CarControllerEddie1.KPH * 10 : 2000;
            }
        }
    }
    
    public void startSmoke()
    {
        if (smoke) return;
        for (int i = 0; i < smoke.Length; i++)
        {
            var emission = smoke[i].emission;
            emission.rateOverTime = ((int)CarControllerEddie1.KPH * 2 >= 2000) ? (int)CarControllerEddie1.KPH * 2 : 2000;
            smoke[i].Play();
        }
        smoke = true;

    }
    //停止煙霧
    public void stopSmoke()
    {
        if (!smoke) return;
        for (int i = 0; i < smoke.Length; i++)
        {
            smoke[i].Stop();
        }
        smoke = false;
    }

    public void startNitrusEmitter()
    {
        if (CarControllerEddie1.nitrusFlag) return;
        for (int i = 0; i < nitrusSmoke.Length; i++)
        {
            nitrusSmoke[i].Play();
        }

        CarControllerEddie1.nitrusFlag = true;
    }
    public void stopNitrusEmitter()
    {
        if (!CarControllerEddie1.nitrusFlag) return;
        for (int i = 0; i < nitrusSmoke.Length; i++)
        {
            nitrusSmoke[i].Stop();
        }
        CarControllerEddie1.nitrusFlag = falusing System.Collections;

    }
}

5. 在套用CarEffects之前我們需要在原本複製出來的 ParticleBurmoutSmoke 裡面加入Trail Render的效果。

這個主要是要render出在路跑上常出現的一些煙霧Trail

接著我們在我們的車子Prefab增加Componet選擇剛剛建立好的Car Effect,接著將我們的 ParticleBurmoutSmoke 拉進TireMarks 以及Smoke的四個項目裡面。

按下Game play就可以看到我們所建立的煙霧效果產生出來了。

小結

ParticleBurmoutSmoke 的效果調整以及配合語法應用得宜的話可以產生相當好的效果,還是要常常練習以及學習讓我們在車輛的物理系統上可以更加的熟悉,一輛真實的車子效果是需要蠻多的語法以及類似 ParticleBurmoutSmoke 這樣的Prefab堆砌而成,雖然目前碰撞的效果還沒有到非常的真實,但是持續的練習一定可以做出像真實世界的車禍效果的。

參考資料: https://www.youtube.com/watch?v=WgxImmW4fSo

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *