質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • C#

    6555questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    3580questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1176questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unityでアイテムが消える(取得)時にSEがなるようにしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 770

sundome

score 6

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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Destroy()は、ゲームオブジェクトなどの削除を行う関数です。
ゲームオブジェクトが削除されたかどうかをチェックする機能はありません。

この場合、削除直前に再生処理を行ってしまうのがよいでしょう。
OnDestroy()を使う方法もあります)

ただ、このエラーを解決しても、audio.PlayOneShot (sound01);だと、再生されないと思います。
SoundEffectやAudioSourceをアタッチしたオブジェクト自体が無くなってしまうためです。
(ついでに、audio.~の書き方は古いそうなので、もし使う場合は、GetComponent<AudioSource>()を使いましょう)
これを回避する方法としては、AudioSource.PlayClipAtPoint()を使うのが一番簡単でしょう。
https://docs.unity3d.com/jp/540/ScriptReference/AudioSource.PlayClipAtPoint.html

ファイルを分けて作ったほうが自分が作りやすいかと思って分けて作りました。
しかし、一つにまとめて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);
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/08 12:38

    とってもわかりやすいです!
    拙い質問内容でも丁寧に回答していただいてありがとうございます!

    こんな2行にずっと詰まっていたなんて恥ずかしいですが、恥を忍んで質問してよかったと思っています。
    本当にありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6555questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    3580questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1176questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。