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

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

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

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

Q&A

解決済

3回答

612閲覧

ユニティのゲームで音が出ません

Frage

総合スコア8

C#

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

0グッド

0クリップ

投稿2020/10/05 06:51

編集2020/10/09 09:40

ユニティで制作中のゲームで、矢がプレイヤーにぶつかると音が出るようにしたいのですが、以下のスクリプトを実行しても、音もエラーも出ません。
尚、Play on Awakeのチェックは外しているのですが、チェックを入れると音は出ます(音を出したいタイミングが違うのですが)。
オブジェクトが破壊される所為で音が出ないのかもと思い、Destroy(gameObject);をコメントアウトしてみましたが、それでも音は出ませんでした。
このスクリプトの他の命令はきちんと行えています(矢を破壊するなど)。
他のオブジェクトに付けている音(BGMなど)は普通に出ます(スクリプトから出しているのでなく、Play on Awakeで出しているのですが)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrowCon : MonoBehaviour
{
GameObject player;

void Start() { this.player = GameObject.Find("player"); } void Update() { transform.Translate(0, -0.1f, 0); if (transform.position.y < -5.0f) { Destroy(gameObject); } Vector2 p1 = transform.position;  //矢の中心座標 Vector2 p2 = this.player.transform.position;  //プレイヤの中心座標 Vector2 dir = p1 - p2; float d = dir.magnitude; float r1 = 0.5f; //矢の半径 float r2 = 1.0f; //プレイヤの半径 if (d < r1 + r2) { GetComponent<AudioSource>().Play(); //音を出したい Destroy(gameObject); } }

}

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

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

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

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

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

harunasan

2020/10/05 07:35

以下の状態では音は出ますか? void Start(){  GetComponent<AudioSource>().Play(); //音を出したい }
Frage

2020/10/05 09:30

はい、出ます。
guest

回答3

0

自己解決

色々試した結果、既存の他のオブジェクトにアタッチされているスクリプトに音を鳴らすメソッドを書き、矢のスクリプトから当たった時にそれを呼び出すことで音を鳴らすことに成功しました。
矢のスクリプト(抜粋)です。
if (d < r1 + r2)
{
GameObject director = GameObject.Find("GameDirector");
director.GetComponent<GameDirector>().DecreaseHp();
director.GetComponent<GameDirector>().Sound();
Destroy(gameObject);
}

呼び出し先のスクリプト(抜粋)です。
public void Sound()
{
GetComponent<AudioSource>().Play();
}

投稿2020/10/09 09:41

Frage

総合スコア8

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

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

0

完全に解決してはいませんが、一応音が出るようになりました。
まず試したのは、一番下のDestroyだけでなく、上のDestroyもコメントアウトすることです。
そうしたら音が出るようになりましたが、新たな問題として矢が破壊されなくなりました。
次に試したのは、Destoryの上のif (transform.position.y < -5.0f) を if (transform.position.y < -30.0f) にして、破壊されるのを遅らせたことです。
これで音も出るようになり、矢も破壊されるようになりました(一番下のDestroyはずっとコメントアウトしたままです)。
最後に残った問題ですが、プレイヤに矢が当たった時に矢が破壊され、音も出す、というのは不可能なのでしょうか?

(追記)
矢が衝突によって破壊されなくしたことが原因でしょうが、矢1本との衝突によって0.1fずつ減るはずだったHPのUI(質問のスクリプトには不要なので省きました)が1本に当たっただけで全部削られてしまうようになりました。
多分、当たっている間ずっと0.1fずつ減らし続けているのだと思います。

投稿2020/10/05 09:30

編集2020/10/05 09:44
Frage

総合スコア8

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

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

fiveHundred

2020/10/05 11:37 編集

> プレイヤに矢が当たった時に矢が破壊され、音も出す、というのは不可能なのでしょうか? 音を鳴らすだけのプレハブを用意しておき、プレイヤーが矢に当たったらそれを生成すればよろしいかと思います。 詳細な設定が不要な場合はAudioSource.PlayClipAtPoint()を使うという方法もあります。 (https://docs.unity3d.com/ja/current/ScriptReference/AudioSource.PlayClipAtPoint.html)
Frage

2020/10/08 12:46

具体的には、空のオブジェクトを作り、音を鳴らすスクリプトを書いてそれにアタッチする、という感じでしょうか? 質問内のスクリプトと似たような感じでちょっと書いてみましたが、上手く行きませんでした。
fiveHundred

2020/10/08 13:00

そのようなゲームオブジェクトを作ったら、それをプレハブ化(Projectウィンドウ内にドラッグ)して、そのプレハブのファイルをインスペクターに設定、Instantiate()でそのプレハブを生成、といった具合になります。
Frage

2020/10/08 13:30 編集

プレハブのファイルをインスペクターに設定、Instantiate()でそのプレハブを生成、と言う部分がよく分かりません。 Instantiate()というのは別の空のオブジェクトと新規スクリプトで所謂ジェネレーターを作るということでしょうか? それともインスペクターにInstantiateという機能があるのでしょうか?(見当たりませんが) それ以前に上述したスクリプトにエラーが出ているのですが。 そのスクリプトを質問の追記として書きました。 初心者なりに勘で書いただけのものなのですが。次のようなエラーを受け取りました。 Assets\CollideSound.cs(15,27): error CS1061: 'CollideSound' does not contain a definition for 'arrow' and no accessible extension method 'arrow' accepting a first argument of type 'CollideSound' could be found (are you missing a using directive or an assembly reference?) playerについても同様です。
fiveHundred

2020/10/08 13:42

Instantiate()とはスクリプトの関数で、オブジェクトのコピーを作成します。 特にプレハブはオブジェクトの実体を持っていないので、この関数でコピーして使います。 そもそもプレハブというもの自体を分かっていないと思うので、まずはそれについて調べてみてください。
Frage

2020/10/08 13:58

このプロジェクトでは既に3つのプレハブを扱っていますが、どれもジェネレーター(空のオブジェクト + スクリプト)で生成しています。
fiveHundred

2020/10/08 23:25

「空のオブジェクト+AudioSource+再生が終わったら自身の削除を行うスクリプト」という内容のプレハブを作成し、そのプレハブの実体を矢のスクリプトから生成してみてください。
Frage

2020/10/09 09:46 編集

ありがとうございます。 試行錯誤の末に目的を果たすことは出来ましたので一旦は解決とします。 ご提案された方法も時間を見つけて挑戦してみようと思います。 追記のスクリプトは混乱を招くと思うので削除しました。 fiveHundredさんの他の投稿をベストアンサーにしてしまうと後から見た人にとってややこしく感じてしまうので、自己解決にさせて頂きました。
guest

0

C#

1GetComponent<AudioSource>().Play(); //音を出したい 2Destroy(gameObject);

再生直後に削除したら、そりゃ音は出ません。

すいません、質問文の記載を見落としていました。
撤回します。

投稿2020/10/05 07:55

編集2020/10/05 08:01
fiveHundred

総合スコア9796

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

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

Frage

2020/10/05 09:33

すみません。 きちんと書いていなかったのですが、消したDestroy(gameObject);は一番下のものだけでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問