質問: ### Unityでアイテムが消える(取得)時にSEがなるようにしたい プログラミング自体初心者です。 https://github.com/unity3d-jp/FirstTutorial/wiki 上記のサイトの玉転がしチュートリアルは完了したのですが、自分でいろいろ追加してみようと考え、プレイヤーがCapsuleに触れ、Capsuleが消滅したタイミングでSEをならすようにしたいと考えましたが、どうにもうまく行きませんでした。 疑問が2つあります。 1.なぜ自分で作った「SoundEffect」のコードでは動かないのか 2.SEをつけるのに、新しいC#ファイルを作る必要があるのか(全部ひとつにまとめられないのか) --- チュートリアル内の「Item.cs」を書き換えて以下のようにしています。 これは重力を受けられるように変更したつもりです。 ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemMove : MonoBehaviour { //トリガーとの接触時に呼ばれる void OnCollisionEnter(Collision col) { //接触対象はなんのタグ?(プレイヤー) if (col.gameObject.CompareTag ("Player")) { //このコンポーネントを持つ破壊する Destroy (gameObject); } } } ``` これとは別に、「SoundEffect」というコードも書いてみました。 ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class SoundEffect : MonoBehaviour { public AudioClip sound01; void Update () { if (Destroy (gameObject)); { audio.PlayOneShot (sound01); } } } ``` if (Destroy (gameObject));がエラーになりますが、なんとなく自分でもそんな気はしていました。 しかし、自分ではなぜこれでは駄目なのか、ということがいまいち理解できませんでした。 これではifの条件になっていないということなのでしょうか。 ファイルを分けて作ったほうが自分が作りやすいかと思って分けて作りました。 しかし、一つにまとめてItemの動きをすべて管理したほうがよいのでしょうか。 長くなった上に、大したことない質問で申し訳ありません。 どなたか、ご回答いただければと思います。 ### 補足情報(言語/FW/ツール等のバージョンなど) UnityVersion 2017.1 Mac Sierra 10.12.6
回答: `Destroy()`は、ゲームオブジェクトなどの削除を行う関数です。 ゲームオブジェクトが削除されたかどうかをチェックする機能はありません。 この場合、削除直前に再生処理を行ってしまうのがよいでしょう。 (`OnDestroy()`を使う方法もあります) ただ、このエラーを解決しても、`audio.PlayOneShot (sound01);`だと、再生されないと思います。 SoundEffectやAudioSourceをアタッチしたオブジェクト自体が無くなってしまうためです。 (ついでに、`audio.~`の書き方は古いそうなので、もし使う場合は、`GetComponent()`を使いましょう) これを回避する方法としては、`AudioSource.PlayClipAtPoint()`を使うのが一番簡単でしょう。 > > ファイルを分けて作ったほうが自分が作りやすいかと思って分けて作りました。 > > しかし、一つにまとめてItemの動きをすべて管理したほうがよいのでしょうか。 > > > 基本的には、分かりやすい方法でいいと思います。 ただ、例えばSoundEffectをItem以外で使いたい、といった状況であれば、分割するしかないです。 もっとも、今回の場合は、2行程度で済んでしまうので、まとめてしまってもよいです。 まとめた場合は、以下のようになります。 ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemMove : MonoBehaviour { //【追加】SE public AudioClip sound01; //トリガーとの接触時に呼ばれる void OnCollisionEnter(Collision col) { //接触対象はなんのタグ?(プレイヤー) if (col.gameObject.CompareTag("Player")) { //【追加】SEを再生 AudioSource.PlayClipAtPoint(sound01, transform.position); //このコンポーネントを持つ破壊する Destroy(gameObject); } } } ```