---
name: "say3D"
type: command
status: ok
groups: ["Sounds"]
arma3_since: "0.50"
locality: {"argument": "global", "effect": "local", "server_exec": false}
source: https://community.bistudio.com/wiki/say3D
revid: 379095
updated: 2026-09-27T21:30:33Z
---

# say3D

*Command · Sounds · Arma 3 v0.50 · introduced in Arma 2 v1.00*

Locality: arguments **global** · effect **local**

## Description

Lets an object say given sound in 3D space.
This allows broadcasting of positional music or sound from a source, without having to script a fade sound or music command. The source has to be [alive](../commands/alive.md).
Compare this with [say2D](../commands/say2D.md) which will always play a sound at the location of the player after he has been in the vicinity of a broadcasting sound.
Sound is defined in ["CfgSounds"](../topics/Description.ext.md#cfgsounds) of the [Description.ext](../topics/Description.ext.md) or main config.

> [!NOTE]
> The name of the command is the clue to its usage. It is meant for playing short sounds within short range. Consecutive execution of the command queues the sounds, the next sound would not start until the previous sound is finished, hence the need for the short sounds. The simulation of speed of sound would delay next sound and might mess with the timing of the queued sounds, especially if used globally. Additionally the sounds are not synced for JIP players. A long playing sound will not be heard by newly joined payers. To summarise:
>
> - An object can only "say" **one** sound at a time
> - In order to stop a [say3D](../commands/say3D.md) sound: delete the returned **sound source** with [deleteVehicle](../commands/deleteVehicle.md), or kill the **sound source** with e.g [setDamage](../commands/setDamage.md).
> - Forcing the speed of sound simulation may delay the queued sound to play right after the previous sound, even if the second sound does not simulate sound delay (e.g sound 1 plays with a 5s delay, ends, *then* sound 2 plays). If the queued sound uses speed of sound simulation, it will be delayed from the end of the first sound (they will not follow "as expected"). Makes the *offset* parameter ignored.
> - **Do use** it for short distance short sounds with speed of sound simulation off.
> - When used with 'isGlobal' option, a null NetObject is returned. To stop such sound globally, destroy the sound source 'from' object.

## Syntax

```sqf
from say3D sound
```

**Parameters:**

- `from`: [Object](../topics/Object.md) or [Array](../topics/Array.md) of [Object](../topics/Object.md)s
  - [Object](../topics/Object.md) - origin of the sound
  - [Array](../topics/Array.md) with [from, to]
    - from: [Object](../topics/Object.md) - origin of the sound
    - to: [Object](../topics/Object.md) - (Optional, default [objNull](../commands/objNull.md)) target
- `sound`: [String](../topics/String.md) or [Array](../topics/Array.md)
  - [String](../topics/String.md) - classname of the sound to be played. Defined in [CfgSounds](../topics/Description.ext.md) including [Description.ext](../topics/Description.ext.md)
  - [Array](../topics/Array.md) with [sound, maxDistance, pitchCoef, isSpeech, offset, simulateSpeedOfSound, playMode, isGlobal]
    - sound: [String](../topics/String.md) - classname of the sound to be played. Defined in [CfgSounds](../topics/Description.ext.md#cfgsounds) including [Description.ext](../topics/Description.ext.md)
    - maxDistance: [Number](../topics/Number.md) - (Optional, default 100) maximum distance in meters at which the sound can be heard. -1 to use the maxDistance from the sound config
    - pitchCoef: [Number](../topics/Number.md) - (Optional, default 1) **multiplier** to the [CfgSounds](../topics/Description.ext.md) defined pitch. The final audio pitch is clipped between 0.5 and 2.0
    - Arma 3 v1.92 isSpeech: [Boolean](../topics/Boolean.md) or Arma 3 v2.04 [Number](../topics/Number.md) - (Optional, default [false](../commands/false.md))
      - 0/[false](../commands/false.md) = play as sound ([fadeSound](../commands/fadeSound.md) applies)
      - 1/[true](../commands/true.md) = play as speech ([fadeSpeech](../commands/fadeSpeech.md) applies), filters are not applied to it (i.e. house or vehicle interior one)
      - 2 = play as sound ([fadeSound](../commands/fadeSound.md) applies) without interior/vehicle muffling
    - Arma 3 v2.00 offset: [Number](../topics/Number.md) - (Optional, default 0) offset in seconds; ignored when *simulateSpeedOfSound* is used
    - Arma 3 v2.18 simulateSpeedOfSound: [Boolean](../topics/Boolean.md) - (Optional, default [false](../commands/false.md)) [true](../commands/true.md) to simulate speed of sound (see description note)
    - Arma 3 v2.24 isInside: [Boolean](../topics/Boolean.md) - (Optional, default [false](../commands/false.md)) [true](../commands/true.md) if the sound is well audible inside the source (only for 'isSpeech' 0/[false](../commands/false.md))
    - Arma 3 v2.24 playMode: [Number](../topics/Number.md) - (Optional, default 0) Could be one of the following:
      - 0 - queued sound playback. The same source plays queued sounds in sequence
      - 1 - single sound playback. The queue is cleared and a single sound is played instantly
      - 2 - multiple sounds playback. The same source can play multiple sounds simultaneously and instantly
    - Arma 3 v2.24 isGlobal: [Boolean](../topics/Boolean.md) - (Optional, default [false](../commands/false.md)) [true](../commands/true.md) to play the sound on every client currently in game

**Returns:** [Object](../topics/Object.md) - the sound source or NetObject - when 'isGlobal' is [true](../commands/true.md)

## Examples

### Example 1

All possible combinations:

```sqf
helicopter1 say3D "FortunateSon";
helicopter1 say3D ["FortunateSon", 500, 1, 0, 0, true];
[helicopter1, player] say3D "FortunateSon";
[helicopter1, player] say3D ["FortunateSon", 500, 1, 0, 0, true];
```

### Example 2

Workaround for dead bodies:

```sqf
private _dummy = "#particlesource" createVehicleLocal ASLToAGL getPosWorld _corpse;
_dummy say3D "whatever";
_dummy spawn {
    sleep 5; // at least the length of your sound
    deleteVehicle _this;
};
```

### Example 3

```sqf
// Since Arma 3 v2.00, the sound source is returned and can be deleted directly
_soundSrc = helicopter1 say3D "Fortunateson";
sleep 5;
deleteVehicle _soundSrc; // stop the sound after ~5 seconds
```

## See also

[say](../commands/say.md) · [say2D](../commands/say2D.md) · [playSound](../commands/playSound.md) · [playSound3D](../commands/playSound3D.md) · [createSoundSource](../commands/createSoundSource.md) · [playSoundUI](../commands/playSoundUI.md) · [setRandomLip](../commands/setRandomLip.md) · [stopSound](../commands/stopSound.md) · [soundParams](../commands/soundParams.md)

## Community notes

**Rocket** — 2013-03-07

The only difference with this command and [say](../commands/say.md) is during cutscenes (when some camera effect is active). In cutscenes, [say3D](../commands/say3D.md) is 3D, [say](../commands/say.md) is not.

---

**Benargee** — 2015-06-19

In Arma 2 1.63, the object this command is assigned to must be alive for the sound to broadcast. If the object is killed while the sound is still playing, the sound will stop immediately.

Here is [a link to the forum](http://forums.bistudio.com/showthread.php?146122-Making-a-dead-soldier-play-a-sound-in-3d) to get around this issue.

I have not tested this in Arma 3 yet.

---

**Killzone_Kid** — 2017-03-11

This command creates sound object "#soundonvehicle" which can be detected with [allMissionObjects](../commands/allMissionObjects.md)

```sqf
onEachFrame { hintSilent str allMissionObjects "#soundonvehicle" };
0 spawn { sleep 1; player say3D "Alarm" };
```

<sub>Source: [BI Community Wiki — say3D](https://community.bistudio.com/wiki/say3D) (revision 379095).</sub>
