OnCollision/Triggerが動かない
OnCollision/Trigger系の関数を使用するには、オブジェクトにRigidbody,Collider/Trigger等のコンポーネントが必要です。必要なコンポーネントは関数によって異なります。まとめてくださっている記事があるのでそちらの方を参照してください。
transform等での動きが速すぎる/実行環境で動きが違う
time.deltaTimeを忘れている可能性が高いです。Update関数内のコードは実行環境によって同じ時間に実行される回数が異なるため、time.deltaTimeがオブジェクト移動するコードに掛けられていないと挙動が不安定になります。
また、UpdateでなくFixedUpdateであれば実行環境が異なっていても同じ回数呼出しがされるためTime.deltaTimeをかけてやる必要はありません。
Rigidbodyのvelocityを変更する場合も複数回呼出しをする必要がないためTime.deltaTimeは必要ありません。
GetAxisを使うと慣性が付く
プレイヤーを動かすときInput.GetAxisを使用すると慣性がついた気持ち悪い動作になります。一方Input.GetAxisRawは慣性を持たないため、例えばInput.GetAxisRaw(“Horizontal”)で右キーを押すと返り値は常に1となります。Input.GetAxisをInput.GetAxisRawに変更するだけで慣性はなくなります。
氷ステージなど動きに慣性が欲しい場合でもInput.GetAxisの慣性は調整ができないので、Input.GetAxisRawで取得してから慣性が付くように計算を行うことをおすすめします。
RigidBodyを付けたオブジェクトがすり抜ける
速いスピードでオブジェクト同士がぶつかったとき、すり抜けてしまうときがあります。このままだと進行不可などの重大なバグを引き起こしてしまいます。
回避するには壁や床などのオブジェクトのRigidbody2DコンポーネントでCollision DetectionをContinuousに変更しましょう。Discreteは「ゆるい」判定で、Continuousは「きつい」判定になるイメージです。
Continuousは処理が多いので多用は厳禁です。特にゲーム内で動くオブジェクト(プレイヤー、敵など)に適用するとゲームが重くなり危険です。Continuousに変更するのは床や壁など動かないオブジェクトにしましょう。
音量が大きすぎる
フリーの音声素材は元々音量が大きく設定されていることが多いため、そのままゲームに使うと遊んでもらう人の耳を破壊します。Youtubeなど音声が出るサービスを用いて自分のゲームが適切な音量なのか確かめておきましょう。
方法①:Audio Source
音声を出力するコンポーネントであるAudio SourceのVolumeを変更することで調節ができます。この値はスクリプトからでも変更ができるため、音声とボリュームの値を格納するクラスを作り、自動で調節をするようにコードを書けば各素材の音量を上手く調節できます。
音声とボリュームの値を格納するクラスのコード
[System.Serializable]
public class SESet{
public AudioClip audioClip; //サウンドの元素材を保持する変数
public float volume;//再生時のvolumeを保持する変数
}
SESetから音声を鳴らす関数
void PlaySE(SESet seSet){
AudioSource audioSource = gameObject.GetComponent<AudioSource>();
audioSource.clip = seSet.audioClip;
audioSource.volume = seSet.volume;
audioSource.Play();
}
PlaySEはstatic,publicにするなどして上手く活用してみてください。
方法②:元素材から音量を変更する
そもそも元素材の音量を変更するという手もあります。手持ちのDAWソフトを使ったり、ブラウザ上でサービスを使ったりして音量を調節してもよいでしょう。
BGMをmp3でループ再生すると音が途切れる
mp3ファイルは音声の前後に空白があるため、ループ再生すると音が途切れてしまいます。以下の方法で解決します。
方法①:oggファイルに変換
oggファイルには前後の空白がないためmp3をoggに変換することでループしても途切れなくなります。DAWソフト、ブラウザでのサービスで変換できます。
方法②:ループ時に再生位置を最初に移動させる(手動ループ)
再生位置がループ終了位置になったらループ開始位置に移動させる、とてもシンプルな方法です。イントロ付きのBGMを使用する際はこの方法が有効です。AudioSource.timeでは精度が低く違和感のあるループになるため、AudioSource.timeSamplesを使用しましょう。
まず、予め音声波形編集ソフト(例:Audacity)を使用して音声のループ開始、終了位置のサンプル数を調べAudioSourceの再生位置<終了位置ならばAudioSourceの再生位置を開始位置に設定するコードを組めば実装出来ます。サンプル数は、音声波形を一定間隔でサンプリング(サンプルを取得)して、その値を数値で表現したものです。
サンプル数を基にループさせるコード
using UnityEngine;
public class BGMLoopController : MonoBehaviour
{
public AudioSource AudioSource;
public int LoopEndSamples; // ループ終端時刻のサンプル数 (A)
public int LoopLengthSamples; // ループ時間に含まれるサンプル数 (B)
private void Update()
{
if (AudioSource.timeSamples >= LoopEndSamples)
{
AudioSource.timeSamples -= LoopLengthSamples;
}
}
}
インスペクタでLoop End Samplesにループ終端時刻のサンプル数(A)、Loop Length Samplesにループ時間に含まれるサンプル数(B)、AudioClipを音源ファイルに設定してください。
ゲームを実行するとクラッシュした
スクリプトを書いてゲームを実行した際にUnityがクラッシュしてしまった場合、即座にUnityを開きなおさないでください。もし開いてしまうとデータを復旧させることができなくなってしまいます。
詳しい対処方法はUnityの教科書#2に記載しています。