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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

Q&A

1回答

3042閲覧

Unityでのアイテム獲得をしたときのSEの付け方を教えて下さい。

takamasataka

総合スコア0

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

0グッド

0クリップ

投稿2020/11/09 01:35

編集2020/11/11 12:41

Unityでアイテムを獲得したとき音を鳴らせるようにしたいです。

2Dの横アクションゲームを作成しています。

動かすプレイヤーには、上下左右キーを押すと、移動するスクリプトを、

アイテムの方には、衝突すると、カウントして自分自身を消すスクリプトをつけています。

SEを付けたい場合、新しいゲームオブジェクトを作り、どのようなスクリプトを書いたら良いのかを教えていただければと思っています。

ゲームスタート時や、プレイヤーがジャンプしたときに音が鳴るようにはできました。プレイヤーがアイテムと衝突したときに音が鳴ってほしいとおもっています。

プレイヤーとアイテムに付けたスクリプトを下に付けます。 

ご回答のほど、よろしくお願いします。

プレイヤーを動かすソースコード

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

// キーを押すと、移動する
public class OnKeyPress_Move : MonoBehaviour {

public float speed = 2; // スピード:Inspectorで指定 float vx = 0; float vy = 0; bool leftFlag = false; Rigidbody2D rbody; void Start () { // 最初に行う // 重力を0にして、衝突時に回転させない rbody = GetComponent<Rigidbody2D>(); rbody.gravityScale = 0; rbody.constraints = RigidbodyConstraints2D.FreezeRotation; } void Update () { // ずっと行う vx = 0; vy = 0; if(Input.GetKey("right")) { // もし、右キーが押されたら vx = speed; // 右に進む移動量を入れる leftFlag = false; } if(Input.GetKey("left")) { // もし、左キーが押されたら vx = -speed; // 左に進む移動量を入れる leftFlag = true; } if(Input.GetKey("up")) { // もし、上キーが押されたら vy = speed; // 上に進む移動量を入れる } if(Input.GetKey("down")) { // もし、下キーが押されたら vy = -speed; // 下に進む移動量を入れる } } void FixedUpdate() { // ずっと行う(一定時間ごとに) // 移動する rbody.velocity = new Vector2(vx, vy); // 左右の向きを変える this.GetComponent<SpriteRenderer>().flipX = leftFlag; }

}

アイテムのソースコード

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

// 衝突すると、カウントを増やして自分を消す
public class OnCollision_CountAndHide : MonoBehaviour {

public string targetObjectName; // 目標オブジェクト名:Inspectorで指定 public int addValue = 1; // 増加量:Inspectorで指定 void OnCollisionEnter2D(Collision2D collision) { // 衝突したとき // もし、衝突したものの名前が目標オブジェクトだったら if (collision.gameObject.name == targetObjectName) { // カウンターの値を増やす GameCounter.value = GameCounter.value + addValue; // 自分自身を消す this.gameObject.SetActive(false); } }

}

試したこと

音を付けようと、スクリプトを追加してみましたが、上手くいきませんでした。

補足情報(FW/ツールのバージョンなど)

Unityのバージョンは、Unity 2020.1.7f1です。

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

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

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

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

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

guest

回答1

0

個人的な意見ですが、私だったらプレイヤーやアイテムにアタッチするのではなく、音を鳴らすだけのゲームオブジェクト(のプレハブ)を用意します。
今回の場合、アイテムに付けるのが自然かと思いますが、その場合「アイテムが消えると音も無くなってしまう」ため、別のゲームオブジェクトとして生成する必要があるからです。

詳細な設定が不要であれば、AudioSource.PlayClipAtPoint()という選択肢もあります。

投稿2020/11/09 01:48

編集2020/11/09 01:53
fiveHundred

総合スコア10152

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

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

takamasataka

2020/11/09 03:06

ご回答ありがとうございます! 新しくゲームオブジェクトを作る考え方はなかったです。 ありがとうございます。 試しに左クリックすると音がなるようなスクリプトを書いたところ上手く音が鳴ったのですが、衝突させたいスクリプトにしたところエラーになってしまいました。  ソースコードを添付しますので、よければ、改善点を指摘してくださいますでしょうか? フォローさせていただきました。 もしよろしければフォローバックしていただけると、助かります。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { void OnCollisionEnter2D(Collision2D collision) { // 衝突したとき // もし、衝突したものの名前が目標オブジェクトだったら if (collision.gameObject.name == targetObjectName) { GetComponent<AudioSource>().Play(); // 効果音を鳴らす } } }
fiveHundred

2020/11/09 05:50

変数targetObjectNameが何者か分からないです。 そのままでは未定義でエラーになりますし、他の箇所で定義しているのであればそれを記載すべきです。 もし「targetObjectNameという文字列」のつもりであれば、""で囲んでください。
takamasataka

2020/11/09 11:00

ご回答ありがとうございます。 目標オブジェクト名を宣言してみましたが、上手く音がなってくれません。 目標オブジェクトは、プレイヤー、アイテムどちらにすべきでしょうか? using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { public string targetObjectName; // 目標オブジェクト名:Inspectorで指定 void OnCollisionEnter2D(Collision2D collision) { // 衝突したとき // もし、衝突したものの名前が目標オブジェクトだったら if (collision.gameObject.name == targetObjectName) { GetComponent<AudioSource>().Play(); // 効果音を鳴らす } } }
fiveHundred

2020/11/09 11:50

見落としていましたが、このオブジェクトに物理判定を持たせるという意味ではありません。 OnCollisionEnter2D()はアイテムに持たせ、プレイヤーと接触したらこのオブジェクトを生成して再生させる、という意味です。
takamasataka

2020/11/09 11:59

ご回答ありがとうございます。 OnCollisionEnter2Dを、Updateに変えてみましたが、エラーになってしまいました。 どういうメソッドを使えばいいでしょうか。
fiveHundred

2020/11/09 12:08

Start()で「GetComponent<AudioSource>().Play();」するだけです。 targetObjectNameとの比較は不要なので、削除してください。 あるいはAudioSourceの「Play On Awake」にチェックを入れれば自動で再生されるので、その場合はスクリプトに書く必要も無くなります。 これだけだと残り続けるので、再生が終わったら破棄するという処理は必要かもしれないですが。
takamasataka

2020/11/09 12:17

ご回答ありがとうございます。 説明不足で申し訳ないです。 スタート時に音を鳴らすのではなく、アイテムを獲得したときに鳴らしたいのです。 アイテムにプレイヤーが衝突したときにというスクリプトは必要でしょうか。
fiveHundred

2020/11/09 12:36

最初からシーンに配置するのではなく、プレハブ化しておいたものを(衝突したときに)Instantiate()で生成するといった形になります。 この場合Start()は「シーン開始時」ではなく「生成時」に実行されます。
takamasataka

2020/11/09 12:53

ご回答ありがとうございます。 下のようなスクリプトのことでしょうか。 public GameObject newPrefab; GameObject newGameObject = Instantiate(newPrefab) as GameObject;
fiveHundred

2020/11/09 13:00

アイテム側のスクリプトということであれば、それで合ってます。
takamasataka

2020/11/09 23:47

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問