ユニティちゃん音球を追いかける
前回「ユニティちゃん歩く走る減衰する」からの更新点は
・今回はカメラもナビメッシュエージェントで追いかけさせてみた。
・ターゲットの球に音楽をつけてみた。
・レベルメータが処理が重い様子なので、Canvasに表示を切り替えてみた。
動画
ダウンロード (Unityパッケージ)はこちら
Unity_FootstepsADX2LE_tatmos20160415.unitypackage
UnityChanFootsteps_ADX2LE_20160415.zip ADX2LEのAtomCraftTool用データ
上記パッケージをインポートして自由に使っていただいて構いません。
ってか遊んでみてね。
今回はカメラもナビメッシュエージェントで追いかけさせてみた。
カメラにナビメッシュエージェントつけるだけでいい感じに追いかけてくれる。
ただユニティちゃんより速度は遅く動くようにしてみた。
あんまり遅いとカメラの回転とかも遅くなってしまう。調整難しいところ。
MoveToTargetのスクリプトも少し変えた
・もともとユニティちゃん用だったので、カメラにはアニメないのでその対策。
・カメラは遅くしたかったので、maxSpeedからの相対値で変化するような感じに変更した。
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>();
}
}
ターゲットの球に音楽をつけてみた。
bgmキューシートのskybgmという音をPlayOnStartで鳴るように仕掛け、SphereTargetにつけた。
bgmキューシートを追加した。
もとの作成者がksilogicさんので、足音が結構凝ったデータなのと
何か更新があったときに、困らないようにワークユニットもわけておいた。
・ランダムに遷移するようにブロック遷移先を組んである。
短い素材だけどループ感をなくすことができる。
前のレベルメータが処理が重い様子なので、Canvasに表示を切り替えてみた。
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なので、これしなくてもダウンミックス勝手にかかります。
忘れがちなDSPバス設定
DspBusSetting_0という名前が抜けていることがよくあるので、ここに書き込む。
あと、今回はbgmキューシートもロードしておくので、「Add CueSheet」ボタンで指定。
減衰距離のパラメータ調整してみた
前回「ユニティちゃん歩く走る減衰する」のは結構遠くまで音が聞こえるようにしていたのだけど、今回は画面にあったように調整してみた。
なんとなく「Portal」とかのラジオくらいの距離減衰感なつもり。
ドップラーもかかってる
高速に音源が移動するとピッチが変化する。救急車のサイレンとかF1の通過音とか。
ボールも高速に移動するようにしてみた。
Slerpで補間してます。
ゴルフボールのショット時の「ビュン」って感じになる。(あれは風切り音がドップラーしているのかな)
ちなみにドップラー係数1.00で1気圧での音速に応じたピッチ変化をする。これ0にすればドップラーかからないようにもできるし、速度が遅いときでもドップラーかけたい場合は1以上の大きな値をセットするとかも可能。
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;
}
}