Audioの問題点も結局自力で解決したのでtipsに載せました。
質問サイトはよい回答者に巡り会えるといいのですが、そこは運なので、なかなか難しいですね。
//tips
//Unityのサウンドコンポーネント
Unityの基本的なサウンドコンポーネントはAudioClip、AudioSource、AudioListenerの三種類となる。
このコンポーネントの役割は、AudioClip音源をAudioSourceプレイヤーに設定して再生し、
AudioListenerスピーカーから出力。
AudioListenerはAudioSourceで再生されている音を外部に出力するためのコンポーネントでMainCameraにデフォルトで設定されている。
このコンポーネントを設定されているGameObjectが存在しないと、AudioSourceで再生していたとしても音は出力されない。
AudioListenerは複数音源の同時再生でも一つで問題ない。
サウンドの再生方法は2つあり、Unityの設定だけで済むPlayOnAwakeによる再生とスクリプトによる再生に分けられる。
PlayOnAwakeによる再生は、AudioSourceのInspcetorのPlayOnAwakeのチェックボックスに
チェックを入れるだけでよい。
スクリプトの再生方法は2パターンあり、BGM再生用のPlayメソッドとSE再生用のPlayOneShotメソッドがある。
PlayメソッドはAudioSourceのメソッドでメンバ変数であるclipに設定されているAudioClipを再生するメソッド。
AudioSource audio = GetComponent<AudioSource>();
audio.Play();
このメソッドでは再生できる音は一つだけで、再生中の音の上から新しい音を上書きすることはできないのでBGMように使われる。
UnityのAudioSourceにアタッチしてもよい。
一方で、PlayOneShotは再生中の音に新しい音を重ねることができ、こちらはスクリプトのみで制御可能となる。
BGMとPlayOneShotの併用バグについて自己解決しました。
結論としては、BGM用とSE用のオブジェクトとAudioSourceを分けて、2個作ることで解決できました。
実験したものを下記に掲載します。音のみです。
Testオブジェクトには音声をアタッチしていない空のAudioSourceをTestスクリプトで操作しSEを3種類流し、GameObjectではBGMをアタッチしたAudioSourceを付加しています。
Testのスクリプトは下記です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
public AudioClip sound1;
public AudioClip sound2;
public AudioClip sound3;
AudioSource audioSource;
void Start()
{
//Componentを取得
audioSource = GetComponent<AudioSource>();
}
void Update()
{
// 左
if (Input.GetKey(KeyCode.LeftArrow))
{
//音(sound1)を鳴らす
audioSource.PlayOneShot(sound1);
}
if(Input.GetKey(KeyCode.RightArrow))
{
audioSource.PlayOneShot(sound2);
}
if(Input.GetKey(KeyCode.UpArrow))
{
audioSource.PlayOneShot(sound3);
}
}
}
//Animation設定
AnimationはUnityのwindowの中から選択できる。
Createボタンを押すことで、左側のプロパティリストに操作したいオブジェクトの数値(その数値を変更するかは選ぶことができる)を入力することができ、右側には、選択された数値群のタイムラインが示され、オブジェクトの動きをパラパラ漫画風に作成することができる。
初期時点ではタイムラインが1秒分しか表示されていないので、より長く動かしたい場合は、マウスのホイールを回すことで、タイムラインの表示範囲を拡大できる。
動きを入れたい場所にタイムライン上に表示される白線を移動させ、左側の赤丸のレコードボタンを押すと、選択した数値群をその時点のものに書き換えることができるようになり、書き換え後に赤丸を再度押し、レコード停止をすると、その時点でオブジェクトに変更数値の動きをさせることができるようになる。再生ボタンがあるので、それでアニメーションの確認作業を行う。
プレハブにアニメーションを反映したい場合は、先にインスタンスにアニメーションを設定し、それをインスペクターの上部に記載されるPrefab項目を押し、Applyを選ぶことで反映を行うことができる。
その後にインスタンスをデリート。
//アニメーションをトリガーで管理
Animationを特定の時点で行いたい時にAnimatorを用いて何かのイベントがあった時のみアニメーション状態に遷移するようにする。
Animatorはボックス(状態)と矢印(遷移)によって表されており、初期状態からエベントを感知した時のみ次の状態に進む緩衝地帯(トリガー条件の追加)を作ることで、意図した時にアニメーションを発生させることができる。
緩衝地帯はCreate StateのEmptyとして追加し、Set as Layer Default Stateと設定することでデフォルトの設定に書き換える。
初期Entryの段階では作成したAnimationに遷移が直結しているため、開始直後からAnimationが実行されてしまうからである。
トリガーの設定方法は左枠のParameterを選択し、+ボタンからTriggerを選択することで、新しい条件名を付け加えることができるようになる。
このトリガーはAnimatorの矢印を選択することで、矢印のインスペクターに含まれるConditionsから追加することができる。
Animation終了後に元の状態に戻したい場合は作成したAnimationボックスから緩衝地帯へmake transitionで矢印を引けばよい。