この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:1
更新日時:2018-11-07 01:42:57
タイトル: ジェットエンジンのエフェクトとオーディオ
| この記事の要点 |
- Unity の飛行機オブジェクトにジェットエンジンのパーティクル + オーディオを追加するチュートリアル
- 前提: 飛行機の加速・減速スクリプトを設定済み、Standard Assets を導入済み
- 実装:
AircraftJet プレハブから AfterburnerLeft/Right パーティクルを流用
- オーディオは
AudioSource コンポーネントを追加してエンジン音を loop 再生
|
本稿はジェットエンジンのエフェクトとオーディオに関して説明します。

前提
飛行機の加速・原則スクリプトはこちらを参照。
Standard Assetのものをいくつか流用するのでインポートしておく。
コンポーネントの設定
1からオブジェクトを追加してParticle Systemの設定をするのは非常にめんどくさいのでStandart Assets → Vegucles → Aircraft → Prefabs → AircraftJet をヒエラルキーウィンドウに追加する。
AircraftJet → Particles → AfterburnerLeft を自分の飛行機オブジェクトの配下に以下のようにコピーする。

コンポーネント内のJet Particle Effect (Script)は不要なので削除する。
スクリプト
Jet Particle Effectより簡略化したスクリプトにする。
適当なスクリプトを作成して自分のAfterburnerオブジェクトに追加する。
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AfterburnerController : MonoBehaviour {
ParticleSystem afterburner;
public Color minColour;
private float originalStartSize;
private float originalLifetime;
private Color originalStartColor;
private AudioSource engineSoundSource;
[SerializeField] private AudioClip engineSound;
public float engineMinDistance = 50f;
public float engineMaxDistance = 1000f;
public float engineDopplerLevel = 1f;
[Range(0f, 1f)] public float engineMasterVolume;
[SerializeField] private float engineMinThrottlePitch = 0.4f;
[SerializeField] private float engineMaxThrottlePitch = 2f;
[SerializeField] private float engineFwdSpeedMultiplier = 0.002f;
// Use this for initialization
void Start () {
afterburner = GetComponent<ParticleSystem>();
originalLifetime = afterburner.main.startLifetime.constant;
originalStartSize = afterburner.main.startSize.constant;
originalStartColor = afterburner.main.startColor.color;
engineSoundSource = gameObject.AddComponent<AudioSource>();
engineSoundSource.playOnAwake = false;
engineSoundSource.clip = engineSound;
engineSoundSource.minDistance = engineMinDistance;
engineSoundSource.maxDistance = engineMaxDistance;
engineSoundSource.loop = true;
engineSoundSource.dopplerLevel = engineDopplerLevel;
engineSoundSource.volume = engineMasterVolume;
engineSoundSource.Play();
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
afterburner.Stop();
}
else if (Input.GetKeyUp(KeyCode.Space))
{
afterburner.Play();
}
var enginePowerProportion = Mathf.InverseLerp(0, MyAircraftController.staticMaxSpead, MyAircraftController.speed);
engineSoundSource.pitch = Mathf.Lerp(engineMinThrottlePitch, engineMaxThrottlePitch, enginePowerProportion);
engineSoundSource.pitch += MyAircraftController.speed * engineFwdSpeedMultiplier;
}
}
|
ごちゃごちゃ書いてはいるが、飛行機オブジェクトの最大速度と現在の速度を関数に当てはめればあとはよろしくやってくれる。
前提で紹介した飛行機の加速・原則スクリプトでは最大速度が取得できないので以下の黄色くマーキングした部分を追記すればOK。
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MyAircraftController : MonoBehaviour {
public float maxSpead; //最大速度
public static float staticMaxSpead; //最大速度
public float verticalSpead; //縦の旋回速度
public float horizontalSpead; //横の旋回加速
public float accel; //加速
public static float speed = 0; //現在のスピード
private float minSpeed = 0; //最低速度 マイナスになりすぎないように
// Use this for initialization
void Start () {
staticMaxSpead = maxSpead;
//最低速度の割り出し
minSpeed = maxSpead * (float)0.2 * -1;
}
// Update is called once per frame
void Update () {
//方向転換
float v = Input.GetAxis("Vertical") * verticalSpead;
float h = Input.GetAxis("Horizontal") * horizontalSpead;
this.transform.Rotate(new Vector3(v, 0, -h));
//加速処理
if(maxSpead >= speed)
{
if (!Input.GetKey(KeyCode.Space))
{
//加速
speed = speed + accel;
}
}
//減速処理
if (minSpeed <= speed)
{
if (Input.GetKey(KeyCode.Space))
{
speed = speed - accel;
}
}
this.transform.position += transform.forward * speed * Time.deltaTime;
}
}
|