ドアを開けるときと閉まった時に音を付けてみます。
// 閉まっている
if (state == 0)
{
// プレイヤーがドアを触った時
if (clicked && !previousClicked)
{
audio.clip = clips[1];
audio.Play();
}
// プレイヤーがドアを離した時
if (!clicked && previousClicked)
{
audio.clip = clips[0];
audio.Play();
}
// 閉まる寸前へ
if (hj.angle > 0.3f || hj.angle < -0.3f)
{
//hj.useMotor = true;
if (!clicked)
{
audio.clip = clips[1];
audio.Play();
}
state = 1;
}
}
// 閉まる寸前
else if (state == 1)
{
// 閉まっているへ
if (hj.angle <= 0.1f && hj.angle >= -0.1f)
{
state = 0;
hj.useMotor = false;
if (!clicked && !previousClicked)
{
audio.clip = clips[0];
audio.Play();
}
}
// 開いているへ
if (hj.angle > 10f || hj.angle < -10f)
{
hj.useMotor = false;
state = 2;
}
}
// 開いている
else if (state == 2)
{
// 閉まる寸前へ
if (hj.angle < 10f && hj.angle > -10f)
{
hj.useMotor = true;
state = 1;
}
}
previousClicked = clicked;
ドアが閉まる寸前にモーターで閉まる方向へ力を加えたかったので、閉まっている、閉まる寸前、開いているの3つの状態を作って、それぞれの状態へ遷移する時に音を鳴らすなどの処理をしてみました。
プレイヤーがドアをクリックした時に、clickedがtrueになって、クリックを離すとfalseになります。Updateの最後にpreviousClickedに今の値を入れることで、前のフレームの値を使えます。
例えば、clickedがtrueでpreviousClickedがfalseなら、このフレームでドアがクリックされたことがわかるので、閉まっていてドアがクリックされた時にドアが開く音を出すというようなことができます。
// 閉まっている
if (state == 0)
{
// プレイヤーがドアを触った時
if (clicked && !previousClicked)
{
audio.clip = clips[1];
audio.Play();
}
遷移の条件はヒンジジョイントの角度を使っています。例えば、閉まっている状態から、角度が少し開くと、閉まる寸前の状態になります。
if (hj.angle > 0.3f || hj.angle < -0.3f)
{
//hj.useMotor = true;
if (!clicked)
{
audio.clip = clips[1];
audio.Play();
}
state = 1; // 閉まる寸前の状態へ
}
useMotorをtrueにするとモーターがオンになって扉が勝手に閉まりますが、開く時にモーターをオンにすると、プレイヤーが体当たりしたときにつっかえてしまって、開閉音が連打されるので修正が必要です。
モーターによって扉が回転する方向は、MotorのTarget Velocityの符号で変えられます。
ジョイントの軸の方向を見て反時計回りに回転させたい時はTarget Velocityをプラスの値にするようです。これはヒンジジョイントの開く角度の制限も同じで、最初の状態から、時計回りに100度しか回転させたくないときは、LimitsのMinを-100にします。
閉まる音は扉がしまっていてプレイヤーがドアを離したときか、プレイヤーがドアを離した後に閉まっている状態に遷移したときに鳴ります。なので、しまっているドアを何度かクリックするとその回数だけ開閉音が鳴ります。また、物をぶつけたり体当たりしてドアを閉めても閉まる音が鳴ります。