2017-11-15 5 views
0

플레이어가 움직이는 동안 오디오를 재생하는 Unity 스크립트가 있습니다. 스크립트가 작동하고 있지만 문제가 하나 더 있습니다. 재생과 일시 중지 사이의 전환이 너무 길어서 오디오가 너무 어둡게 보일 수 있습니다. Unity3d - 재생과 일시 중지 사이의 전환시 오디오 거친 소리가납니다.

내 스크립트

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityStandardAssets.CrossPlatformInput; 

public class PlayerController : MonoBehaviour { 
    Rigidbody playerRigid; 
    private Vector3 pindah; 
    public AudioSource audioSource; 
    public AudioClip audioClip; 
    public float lowPitchRange = .95f; 
    public float hiPitchRange = 1.05f; 

    void Awake() { 
     audioSource = GetComponent<AudioSource>(); 
     audioSource.clip = audioClip; 
     float randomPitch = Random.Range (lowPitchRange, hiPitchRange); 
     audioSource.pitch = randomPitch; 
    } 

    // Use this for initialization 
    void Start() { 
     //mengambil komponen rigidbody player 
     playerRigid = GetComponent<Rigidbody>(); 
    } 

    // Update is called once per frame 
    void Update() { 
     //untuk mendapatkan input dari virtual joystick button 
     float h = CrossPlatformInputManager.GetAxisRaw ("Horizontal"); 
     float v = CrossPlatformInputManager.GetAxisRaw ("Vertical"); 

     if ((h != 0f || v != 0f) && !audioSource.isPlaying) { 
      audioSource.Play(); 
     } else { 
      audioSource.Pause(); 
     } 
     //memindah posisi player sesuai input yang didapat 
     pindah = new Vector3 (h, 0.0f, v); 
     playerRigid.velocity = pindah; 
    } 
} 

답변

1

난 당신이 이런 식으로 코드를 변경해야 할 생각입니다 : 문제가 당신이 그것을 일시 정지 할 때 오디오 소스가 나올 경우

if (h != 0f || v != 0f) { 
    if (!audioSource.isPlaying) audioSource.Play(); 
} else { 
    audioSource.Pause(); 
} 
2

을, 어쩌면 당신은 고려해야한다 대신이 볼륨과 비슷한 것을 사용하여 볼륨을 희미하게합니다 (나 자신을 테스트하지는 않았지만 나중에 시도 할 것입니다) :

// fade/increase time in seconds 
public float rateTime = 1; 

public FadeSound() { 
    //audioSource.Play(); 
    StartCoroutine(_FadeSound); 
    } 

public IncreaseSound() { 
    StartCoroutine(_IncreaseSound); 
} 

IEnumerator _FadeSound() { 
    float t = rateTime; 

    while (t > 0) { 
     yield return null; 
     t-= Time.deltaTime; 
     source.volume = t/rateTime; 
    } 
    yield break; 
    //yield audioSource.Pause(); 
} 

IEnumerator _IncreaseSound() { 
    float t = 0; 

    while (t < 1) { 
     yield return null; 
     t+= Time.deltaTime; 
     source.volume = t/rateTime; 
    } 
    yield break; 
} 

if ((h != 0f || v != 0f) && !audioSource.isPlaying) { 
    IncreaseSound(); 
} else { 
    FadeSound(); 
} 
+2

보통 ag 이런 종류의 부드러운 전환을 편집 된 매개 변수의 현재 값 즉이 경우 source.volume에서 시작하는 것이 좋습니다. 그렇지 않으면 볼륨이 0 또는 1 인 전환의 시작 값으로 순간적으로 점프하므로 FadeSound와 IncreaseSound간에 너무 빨리 전환 할 경우 팝이 표시됩니다. 새 충돌을 시작하기 전에 충돌하는 coroutine을 중지해야 할 수도 있습니다. –

+0

의견을 보내 주셔서 감사합니다. 오늘 오후에 답변을 업데이트하겠습니다. 나는 이것이 사용자가 기대했던 것이 아니라고 생각하지만, 어쨌든 나에게 유용 할 것이다. 감사!! –