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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2946閲覧

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

sundome

総合スコア14

C#

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

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/09/08 02:05

###Unityでアイテムが消える(取得)時にSEがなるようにしたい
プログラミング自体初心者です。

https://github.com/unity3d-jp/FirstTutorial/wiki
上記のサイトの玉転がしチュートリアルは完了したのですが、自分でいろいろ追加してみようと考え、プレイヤーがCapsuleに触れ、Capsuleが消滅したタイミングでSEをならすようにしたいと考えましたが、どうにもうまく行きませんでした。

疑問が2つあります。
1.なぜ自分で作った「SoundEffect」のコードでは動かないのか
2.SEをつけるのに、新しいC#ファイルを作る必要があるのか(全部ひとつにまとめられないのか)


チュートリアル内の「Item.cs」を書き換えて以下のようにしています。
これは重力を受けられるように変更したつもりです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ItemMove : MonoBehaviour 6{ 7 //トリガーとの接触時に呼ばれる 8 void OnCollisionEnter(Collision col) 9 { 10 //接触対象はなんのタグ?(プレイヤー) 11 if (col.gameObject.CompareTag ("Player")) 12 { 13 //このコンポーネントを持つ破壊する 14 Destroy (gameObject); 15 } 16 } 17}

これとは別に、「SoundEffect」というコードも書いてみました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SoundEffect : MonoBehaviour 6{ 7 public AudioClip sound01; 8 9 void Update () 10 { 11 if (Destroy (gameObject)); 12 { 13 audio.PlayOneShot (sound01); 14 } 15 } 16} 17

if (Destroy (gameObject));がエラーになりますが、なんとなく自分でもそんな気はしていました。
しかし、自分ではなぜこれでは駄目なのか、ということがいまいち理解できませんでした。
これではifの条件になっていないということなのでしょうか。

ファイルを分けて作ったほうが自分が作りやすいかと思って分けて作りました。
しかし、一つにまとめてItemの動きをすべて管理したほうがよいのでしょうか。

長くなった上に、大したことない質問で申し訳ありません。
どなたか、ご回答いただければと思います。

###補足情報(言語/FW/ツール等のバージョンなど)
UnityVersion 2017.1
Mac Sierra 10.12.6

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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行程度で済んでしまうので、まとめてしまってもよいです。

まとめた場合は、以下のようになります。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ItemMove : MonoBehaviour 6{ 7 //【追加】SE 8 public AudioClip sound01; 9 10 //トリガーとの接触時に呼ばれる 11 void OnCollisionEnter(Collision col) 12 { 13 //接触対象はなんのタグ?(プレイヤー) 14 if (col.gameObject.CompareTag("Player")) 15 { 16 //【追加】SEを再生 17 AudioSource.PlayClipAtPoint(sound01, transform.position); 18 19 //このコンポーネントを持つ破壊する 20 Destroy(gameObject); 21 } 22 } 23}

投稿2017/09/08 03:21

fiveHundred

総合スコア9801

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sundome

2017/09/08 03:38

とってもわかりやすいです! 拙い質問内容でも丁寧に回答していただいてありがとうございます! こんな2行にずっと詰まっていたなんて恥ずかしいですが、恥を忍んで質問してよかったと思っています。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問