LoginSignup
2
2

More than 5 years have passed since last update.

ユニティちゃん音球を追いかける

Last updated at Posted at 2016-04-14

ユニティちゃん音球を追いかける

前回「ユニティちゃん歩く走る減衰する」からの更新点は

・今回はカメラもナビメッシュエージェントで追いかけさせてみた。
・ターゲットの球に音楽をつけてみた。
・レベルメータが処理が重い様子なので、Canvasに表示を切り替えてみた。

動画

IMAGE ALT TEXT HERE

ダウンロード (Unityパッケージ)はこちら

Unity_FootstepsADX2LE_tatmos20160415.unitypackage 
UnityChanFootsteps_ADX2LE_20160415.zip  ADX2LEのAtomCraftTool用データ

上記パッケージをインポートして自由に使っていただいて構いません。
ってか遊んでみてね。

今回はカメラもナビメッシュエージェントで追いかけさせてみた。

image

カメラにナビメッシュエージェントつけるだけでいい感じに追いかけてくれる。
ただユニティちゃんより速度は遅く動くようにしてみた。
あんまり遅いとカメラの回転とかも遅くなってしまう。調整難しいところ。

MoveToTargetのスクリプトも少し変えた

・もともとユニティちゃん用だったので、カメラにはアニメないのでその対策。
・カメラは遅くしたかったので、maxSpeedからの相対値で変化するような感じに変更した。

MoveToTarget.cs
using UnityEngine;
using System.Collections;

public class MoveToTarget : MonoBehaviour
{
    public Transform target;
    NavMeshAgent agent;

    public float maxSpeed = 6;

    void Start()
    {
        Reset();
    }

    float lastMoveTime = 0f;

    void Update()
    {
        if (Time.timeSinceLevelLoad > lastMoveTime + 0.1f)
        {
            GotoNextPoint();
            lastMoveTime = Time.timeSinceLevelLoad;
        }

        if (animator != null)
        {
            animator.SetFloat("Speed", agent.velocity.sqrMagnitude / 40f);
        }

        //Debug.Log(agent.remainingDistance );
        //  近いとゆっくり
        if (agent.remainingDistance < 2.5f)
        {
            agent.speed = maxSpeed/6f;
            if (animator != null)
            {
                animator.SetTrigger("Rest");
            }
        } else if (agent.remainingDistance < 10f)
        {
            agent.speed = maxSpeed/2f; 
        } else
        {
            agent.speed = maxSpeed;
        }
    }

    void GotoNextPoint()
    {
        agent.SetDestination(target.position);
    }

    [SerializeField, HideInInspector] Animator animator;

    void Reset()
    {
        agent = GetComponent<NavMeshAgent>();
        animator = GetComponent<Animator>();
    }
}

ターゲットの球に音楽をつけてみた。

image

bgmキューシートのskybgmという音をPlayOnStartで鳴るように仕掛け、SphereTargetにつけた。

bgmキューシートを追加した。

もとの作成者がksilogicさんので、足音が結構凝ったデータなのと
何か更新があったときに、困らないようにワークユニットもわけておいた。

image

・skybgmはモノラルの音で減衰距離指定もしてある。
image

・ランダムに遷移するようにブロック遷移先を組んである。
短い素材だけどループ感をなくすことができる。
image

前のレベルメータが処理が重い様子なので、Canvasに表示を切り替えてみた。

これ
image
Sliderをレベルメータとして使ってます。
image

CanvasAtomDebug.cs
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class CanvasAtomDebug : MonoBehaviour
{

    public Slider[] sliders = new Slider[4];
    Text[] texts = new Text[4];

    // Use this for initialization
    void Start()
    {
        for (int ch = 0; ch < 4; ch++)
        {
            texts [ch] = sliders [ch].GetComponentInChildren<Text>();
        }
    }

    // Update is called once per frame
    void Update()
    {
        for (int ch = 0; ch < 4; ch++)
        {
            int readch = ch;
            if (ch > 1)
                readch = ch + 2;

            float level = CriAtom.GetBusAnalyzerInfo(0).peakLevels [readch];
            sliders [ch].value = level;
            texts [ch].text = getDb(level, ch);
        }
    }

    string[] meterName = new string[]{ "L ", "R ", "Ls", "Rs" };

    private string getDb(float volume, int ch)
    {
        float retValue = Mathf.Floor(20.0f * Mathf.Log10(volume) * 100f) / 100f;
        if (retValue < -96)
        {
            retValue = -96;
        }
        return string.Format("{0}:{1:#0.#0} dB", meterName [ch], retValue);
    }

}

サラウンド側が鳴っていない?

どうもMacだとサラウンド側が鳴っていない様子なので、簡易的にダウンミックス(4ch->2ch)にするように「マトリクス」エフェクトでルーティングを変えている。
(Unity以外なら初期化時にoutputchannel数(最終出力チャンネル数)を選択できるのだが・・・たぶんデフォルト6chになっている。)
これは、バランスは適当調整で、サラウンドが別途ミックスされてしまうwindowsのようなOSがダウンミックスする環境や、ちゃんと6ch対応のデバイスをつけている場合はバランスが崩れる(前からの音が多めになる)。

ちなみに、iOS/Androidの場合は最終出力がデフォルト2chなので、これしなくてもダウンミックス勝手にかかります。

image

忘れがちなDSPバス設定

image
DspBusSetting_0という名前が抜けていることがよくあるので、ここに書き込む。
あと、今回はbgmキューシートもロードしておくので、「Add CueSheet」ボタンで指定。

減衰距離のパラメータ調整してみた

前回「ユニティちゃん歩く走る減衰する」のは結構遠くまで音が聞こえるようにしていたのだけど、今回は画面にあったように調整してみた。
image
なんとなく「Portal」とかのラジオくらいの距離減衰感なつもり。

ドップラーもかかってる

高速に音源が移動するとピッチが変化する。救急車のサイレンとかF1の通過音とか。

ボールも高速に移動するようにしてみた。
Slerpで補間してます。
ゴルフボールのショット時の「ビュン」って感じになる。(あれは風切り音がドップラーしているのかな)

image
ちなみにドップラー係数1.00で1気圧での音速に応じたピッチ変化をする。これ0にすればドップラーかからないようにもできるし、速度が遅いときでもドップラーかけたい場合は1以上の大きな値をセットするとかも可能。

 RandomMove.cs
using UnityEngine;
using System.Collections;

public class RandomMove : MonoBehaviour {
    void Start () {
        Reset();
    }

    float respawnTime = 10f;
    float lastMoveTime = 8f;
    float journeyTime = 1f;

    Vector3 nextPos = new Vector3(0,5,0);

    void Update () {
        if(Time.timeSinceLevelLoad > lastMoveTime+respawnTime)
        {
            Reset();
        }

        float fracComplete = (Time.time - lastMoveTime) / journeyTime;
        if(fracComplete < 1){
            this.transform.localPosition = Vector3.Slerp(this.transform.localPosition,nextPos,
            fracComplete);
        }
    }

    public void Reset()
    {
        nextPos = new Vector3(Random.Range(0,5),5,Random.Range(0,-50));
        lastMoveTime = Time.time;
    }

}

以上

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2