BlueBeard.Holograms
0.1.0-ci.24
dotnet add package BlueBeard.Holograms --version 0.1.0-ci.24
NuGet\Install-Package BlueBeard.Holograms -Version 0.1.0-ci.24
<PackageReference Include="BlueBeard.Holograms" Version="0.1.0-ci.24" />
<PackageVersion Include="BlueBeard.Holograms" Version="0.1.0-ci.24" />
<PackageReference Include="BlueBeard.Holograms" />
paket add BlueBeard.Holograms --version 0.1.0-ci.24
#r "nuget: BlueBeard.Holograms, 0.1.0-ci.24"
#:package BlueBeard.Holograms@0.1.0-ci.24
#addin nuget:?package=BlueBeard.Holograms&version=0.1.0-ci.24&prerelease
#tool nuget:?package=BlueBeard.Holograms&version=0.1.0-ci.24&prerelease
BlueBeard.Holograms
A proximity-based hologram system for Unturned. Place 3D holograms in the world that automatically show/hide UI overlays when players walk near them. Supports pooling, per-player state, global allocation, and dynamic metadata updates.
Installation
Add a project reference:
<ProjectReference Include="..\BlueBeard.Holograms\BlueBeard.Holograms.csproj" />
Concepts
- HologramDefinition -- A world position + trigger radius. Defines where a hologram exists.
- Hologram -- A pooled UI/Effect pair. The
Effectis the 3D visual; theUIis the screen overlay. - IHologramDisplay -- Your code that populates the UI when a player enters the zone.
- HologramRegistration -- Bundles definitions, pool, and display together for batch registration.
Setup
using BlueBeard.Holograms;
var hologramManager = new HologramManager();
hologramManager.Load();
// On unload:
hologramManager.Unload();
Defining Holograms
1. Create the Pool
Each hologram in the pool is an Effect/UI pair from your Unity asset bundle:
var pool = new List<Hologram>
{
new() { UI = 50600, Effect = 50601 },
new() { UI = 50602, Effect = 50603 },
new() { UI = 50604, Effect = 50605 },
};
Pool size determines how many holograms can be visible simultaneously. With IsGlobal = true, each pool slot is shared across all players. With IsGlobal = false, each player gets their own allocation.
2. Implement IHologramDisplay
This controls what the player sees when they enter the hologram zone:
using BlueBeard.Holograms;
using SDG.NetTransport;
using SDG.Unturned;
public class ShopHologramDisplay : IHologramDisplay
{
public void Show(ITransportConnection connection, short key,
HologramDefinition definition, Dictionary<string, string> metadata)
{
EffectManager.sendUIEffectVisibility(key, connection, true, "Canvas/ShopPanel", true);
EffectManager.sendUIEffectText(key, connection, true, "Canvas/ShopPanel/Title",
metadata.GetValueOrDefault("title", "Shop"));
}
public void Hide(ITransportConnection connection, short key, HologramDefinition definition)
{
EffectManager.sendUIEffectVisibility(key, connection, true, "Canvas/ShopPanel", false);
}
}
3. Create Definitions and Register
var definition = new HologramDefinition
{
Position = new Vector3(100, 50, 200),
Radius = 10f,
Height = 20f,
Metadata = new Dictionary<string, string>
{
{ "title", "Weapon Shop" }
}
};
hologramManager.RegisterDefinition(definition, new ShopHologramDisplay(), pool, isGlobal: true);
Batch Registration
var registration = new HologramRegistration
{
Display = new ShopHologramDisplay(),
Holograms = pool,
Definitions = new List<HologramDefinition> { def1, def2, def3 },
IsGlobal = true
};
hologramManager.Register(registration);
Updating Holograms
Update One Player
hologramManager.UpdatePlayer(player, definition, new Dictionary<string, string>
{
{ "stock", "42" },
{ "discount", "20%" }
});
Update All Players
hologramManager.UpdateAll(definition, new Dictionary<string, string>
{
{ "stock", "0" },
{ "status", "SOLD OUT" }
});
Events
hologramManager.PlayerEnteredHologram += (player, definition) =>
{
Logger.Log($"{player.channel.owner.playerID.playerName} entered hologram zone");
};
hologramManager.PlayerExitedHologram += (player, definition) =>
{
Logger.Log($"{player.channel.owner.playerID.playerName} left hologram zone");
};
Unregistering
hologramManager.UnregisterDefinition(definition);
// Hides UI for all players, clears the effect, destroys the trigger zone
Global vs Per-Player Pools
| Mode | IsGlobal |
Behavior |
|---|---|---|
| Global | true |
Pool slots are shared. If slot 0 is used by any player, no other player gets slot 0. Good for unique world objects. |
| Per-Player | false |
Each player gets their own allocation from the pool. Good for instanced content. |
Player Filtering
hologramManager.RegisterDefinition(definition, display, pool, isGlobal: false,
playerFilter: player => player.life.health > 50);
// Only players with >50 health will see this hologram
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net481 is compatible. |
-
.NETFramework 4.8.1
- BlueBeard.Core (>= 0.1.0-ci.24)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-ci.24 | 82 | 7/4/2026 |
| 0.1.0-ci.23 | 85 | 6/25/2026 |
| 0.1.0-ci.22 | 94 | 5/8/2026 |
| 0.1.0-ci.19 | 72 | 5/7/2026 |
| 0.1.0-ci.18 | 60 | 5/7/2026 |
| 0.1.0-ci.17 | 64 | 5/3/2026 |
| 0.1.0-ci.16 | 78 | 5/3/2026 |
| 0.1.0-ci.15 | 78 | 4/13/2026 |
| 0.1.0-ci.14 | 67 | 4/12/2026 |
| 0.1.0-ci.13 | 67 | 4/12/2026 |
| 0.1.0-ci.12 | 64 | 4/12/2026 |
| 0.1.0-ci.11 | 64 | 4/12/2026 |
| 0.1.0-ci.10 | 78 | 4/11/2026 |
| 0.1.0-ci.9 | 75 | 4/7/2026 |
| 0.1.0-ci.8 | 68 | 4/7/2026 |
| 0.1.0-ci.7 | 73 | 4/7/2026 |
| 0.1.0-ci.6 | 78 | 3/14/2026 |
| 0.1.0-ci.5 | 125 | 2/22/2026 |