我有一个简单的2d混合树,其中包含4个动画,每个动画都有2个动画事件,所有动画都具有相同的名称:Step。脚本上的函数Step()会播放脚步声。我的问题是声音重叠。 我该如何解决?
答案 0 :(得分:0)
重叠是什么意思?如果您希望声音分开播放(即使同时播放),则应该有多个AudioSource
。
如果要使用相同的AudioSource,则需要替换当前的音频片段或等待旧的声音播放完新声音(但它将与动画不同步)。
答案 1 :(得分:0)
好了,很简单,但是我累了,需要休息一下xD。 只需使用是否允许播放声音即可:
if(Time.time - lastTime >= duration)
{
lastTime = Time.time;
FindObjectOfType<AudioManager>().Play("Footstep");
}
答案 2 :(得分:0)
您可以沿 Z 轴和 X 轴拆分步骤事件。当您的字符沿 Z 轴移动时,调用一种方法,如果字符沿 X 轴移动 - 另一种方法。 您可以沿着 Z 轴和 X 轴获得速度,并像下面的代码一样制作一些逻辑。
我有 2d 混合树和 4 个动画剪辑,在我的例子中代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class FootstepSound : MonoBehaviour
{
public AudioClip leftStep, rightStep;
[Range(0, 1f)]
public float footStepsVolume = 1f;
private AudioSource _audioSource;
Animator _anim;
private void Start()
{
_audioSource = GetComponent<AudioSource>();
_anim = GetComponent<Animator>();
}
public void stepLeft()
{
if (_anim.GetFloat("DeltaX") == 0 && _anim.GetFloat("DeltaZ") != 0)
_audioSource.PlayOneShot(leftStep, footStepsVolume);
}
public void stepRight()
{
if (_anim.GetFloat("DeltaX") == 0 && _anim.GetFloat("DeltaZ") != 0)
_audioSource.PlayOneShot(rightStep, footStepsVolume);
}
public void strafeLeft()
{
if (_anim.GetFloat("DeltaX") != 0)
_audioSource.PlayOneShot(leftStep, footStepsVolume);
}
public void strafeRight()
{
if (_anim.GetFloat("DeltaX") != 0)
_audioSource.PlayOneShot(rightStep, footStepsVolume);
}
}