Я думаю, что приведенные выше ответы по-прежнему не решают вашу проблему «Когда игрок выходит за границы, звук будет играть один раз.»
Я поделюсь более чистым способомделать это (возможно, оптимизировать)
Использование границ
Создать наши собственные границы с помощью Bounds
https://docs.unity3d.com/ScriptReference/Bounds.html
Конструктор Bounds
равно Bounds(Vector3 center,vector3 size)
Таким образом, в вашем случае центр будет center = (-9.5f, 0, -9.5f)
(формула средней точки) и, наконец, размер ограничивающей рамки будет size = (39.0f, 0f, 39.0f)
Давайте перейдем к части кода
public class BoundsCheck: MonoBehaviour
{
public bool isInside = false;
public bool isPlayedOnce = false;
private Bounds bounds;
void Start()
{
bounds = new Bounds(new Vector3(-9.5f, 0, -9.5f), new Vector3(39.0f, 0f, 39.0f));
}
void Update()
{
CheckBounds();// play the sound if the player is outside some boundaries
if (!isInside &&!isPlayedOnce)
{
Debug.Log("PLAY");
isPlayedOnce = true;
}
}
private void CheckBounds()
{
bool isInsideBound = bounds.Contains(transform.position);
if (isInsideBound)
{
isInside = true;
if (isPlayedOnce)
{
isPlayedOnce = false;
}
}
else
{
isInside = false;
}
}
}
Таким образом, вместо нескольких if, мы можем просто проверить, находится ли позиция преобразования внутри границы, используя bool isInsideBound = bounds.Contains(transform.position);
Примечание: - Для воспроизведения звука только один раз, я использовал еще один логический isPlayedOnce
Я не уверен, является ли это наиболее оптимизированным способом сделать это.Но, безусловно, более чистый способ (через код).