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

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

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

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

Q&A

解決済

4回答

728閲覧

Unity サウンド アクションに合わせ1回だけ鳴らす

14dai

総合スコア15

Unity

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

0グッド

1クリップ

投稿2020/01/23 15:41

編集2020/01/24 00:53

![イメージ説明]イメージ説明下記のようにプレイヤーが近づくと開くスライド扉のアクションに合わせてサウンドが鳴るように作成したスクリプトですが、
実行するサウンドが鳴り続けてしまいます。
開いたとき(isNear==True)に1回と閉じるとき(isNear==False)に1回鳴らしたいのですがどこを修正すればよろしいでしょうか?

C#

1コードusing System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class DoorSlide : MonoBehaviour 6{ 7 private bool isNear; 8 public float distance; // スライドする長さ 9 public AudioClip se; 10 11 12 13 Vector3 startPos; // 初期位置座標 14 Transform player; // プレイヤー座標 15 void Start() 16 { 17 player = GameObject.Find("Player").transform;// Playerという名前のオブジェクトを取得 18 startPos = transform.position; // 初期位置を代入 19 20 } 21 22 23 // Update is called once per frame 24 void Update() 25 { 26 Vector3 pos = transform.position; 27 28 if (isNear) 29 { 30 pos.z = Mathf.Lerp(pos.z, startPos.z + 2.5f, Time.deltaTime * 1.5f); 31 32 33 } 34 else 35 { 36 pos.z = Mathf.Lerp(pos.z, startPos.z, Time.deltaTime * 1.5f); 37 } 38 39 transform.position = pos; 40 } 41 42 43 44 void OnTriggerEnter(Collider other) 45 { 46 if(other.tag == "Player") 47 { 48 isNear = true; 49 GetComponent<AudioSource>().PlayOneShot(se); 50 51 } 52 } 53 private void OnTriggerExit(Collider other) 54 { 55 if(other.tag == "Player") 56 { 57 isNear = false; 58 } 59 }

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

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

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

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

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

guest

回答4

0

ベストアンサー

図を見た感じ、扉とColliderが同一オブジェクトになっているので、扉がスライドした場合にColliderも動いてしまい、触れて離れてを繰り返しているのかもしれません。

なので、判定領域とDoorオブジェクトを分け判定領域が動かないようにし、判定領域からDoorオブジェクトを動かすようにします。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class DoorSlide : MonoBehaviour 6{ 7 private bool isNear; 8 public float distance; // スライドする長さ 9 10 public GameObject DoorObj; //扉オブジェクト 11 12 public AudioClip se; 13 14 Vector3 startPos; // 初期位置座標 15 Transform player; // プレイヤー座標 16 void Start () 17 { 18 player = GameObject.Find ("Player").transform; // Playerという名前のオブジェクトを取得 19 startPos = DoorObj.transform.position; // 初期位置を代入 20 } 21 22 // Update is called once per frame 23 void Update () 24 { 25 Vector3 pos = DoorObj.transform.position; 26 27 /*distance...それっぽい変数があったので勝手に拝借 28 別途使用していましたら新しく変数を作成してください。*/ 29 30 //領域内かつスライド距離以下であれば 31 if (isNear && (pos.z - startPos.z) < distance) 32 { 33 pos.z = Mathf.Lerp (pos.z, startPos.z + 2.5f, Time.deltaTime * 1.5f); 34 } 35 else if (!isNear) 36 { 37 pos.z = Mathf.Lerp (pos.z, startPos.z, Time.deltaTime * 1.5f); 38 } 39 40 DoorObj.transform.position = pos; 41 } 42 43 void OnTriggerEnter (Collider other) 44 { 45 if (other.tag == "Player") 46 { 47 isNear = true; 48 GetComponent<AudioSource> ().PlayOneShot (se); 49 } 50 } 51 private void OnTriggerExit (Collider other) 52 { 53 if (other.tag == "Player") 54 { 55 isNear = false; 56 } 57 } 58}

判定領域にスクリプトをアタッチし、DoorObj変数にDoorオブジェクトを入れてください。親子関係にする場合はDoorオブジェクトのColliderは外してください。

投稿2020/01/24 01:58

編集2020/01/24 02:10
simapiko

総合スコア332

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

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

14dai

2020/01/24 02:24

皆様コメントありがとうございます。simapiko様が述べられているようにコライダーとオブジェクトを分けかつ、ご提示いただいたスクリプトを適用することでサウンドの反映とよりスライドドアのような動きになりました。また、勉強にもなりましたありがとうございます。
guest

0

インスペクターのボックスコライダーみたいなのにトリガーにチェックしてますか?
https://www.sejuku.net/blog/83742

void OnTriggerEnter(Collider other)を使うならvoid Update()はいらないかもしれません。

public AudioClip se; void Start() { } void Update() { } void OnTriggerEnter(Collider other) { if (other.tag == "Player") { //GetComponent<AudioSource>().PlayOneShot(se); Debug.Log("yes"); } } private void OnTriggerExit(Collider other) { if (other.tag == "Player") { Debug.Log("no"); } }

投稿2020/01/24 02:01

usamino

総合スコア59

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

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

0

PlayOneShotではなくPlayで再生したら重複しないと思うのですが、どうでしょうか

投稿2020/01/24 01:34

Y0241-N

総合スコア1066

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

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

0

if (isNear) { pos.z = Mathf.Lerp(pos.z, startPos.z + 2.5f, Time.deltaTime * 1.5f); isNear = true; } else { pos.z = Mathf.Lerp(pos.z, startPos.z, Time.deltaTime * 1.5f); isNear = false; } コード

にするのでは?

投稿2020/01/23 16:23

編集2020/01/23 16:25
usamino

総合スコア59

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

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

14dai

2020/01/24 00:55

修正してみました。 修正したところ、添付画像のようにプレイヤーが判定領域に入ってから領域の間に挟まれているときに いisNearのTrueとFalseを繰り返してしまっている状態なのかと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問