DanielWillett.UnturnedUITools
1.4.3
dotnet add package DanielWillett.UnturnedUITools --version 1.4.3
NuGet\Install-Package DanielWillett.UnturnedUITools -Version 1.4.3
<PackageReference Include="DanielWillett.UnturnedUITools" Version="1.4.3" />
paket add DanielWillett.UnturnedUITools --version 1.4.3
#r "nuget: DanielWillett.UnturnedUITools, 1.4.3"
// Install DanielWillett.UnturnedUITools as a Cake Addin #addin nuget:?package=DanielWillett.UnturnedUITools&version=1.4.3 // Install DanielWillett.UnturnedUITools as a Cake Tool #tool nuget:?package=DanielWillett.UnturnedUITools&version=1.4.3
UI Tools and Extensions
Powerful Unturned Module/Library for manipulating Glazier/Sleek UI.
Requires HarmonyLib 2.3.3+
.
NuGet package: DanielWillett.UnturnedUITools
Reflection Tools
This package references my Reflection Tools library which has a lot of good tools for efficient access to non-public members.
XML Documentation
This package includes complete XML documentation for SDG.Glazier.Runtime.dll
, which houses all of the Glazier code.
Note: this is done by including a reference assembly in the package, so don't copy it from the output directory to your libraries.
UI Tools
The UIAccessor
class has many tools for working with UIs:
- Many efficient getters for internal types and instances of vanilla UIs.
- Optional managed Harmony log that clears on startup to help diagnose transpilers.
EditorUIReady
andPlayerUIReady
events.- UI
TypeInfo
with basic information about each UI type (used by UI extensions). OnInitializingUIInfo
to add your own information toTypeInfo
.LoadUIToILGenerator
andEnumerateUIInstructions
to load instance singleton UIs toILGenerators
or transpilers.- Extension for
ISleekElement
:CopyTransformFrom
to copy all transform values from one element to another.
UI Extensions
Add a class as an extension to existing vanilla or modded UI classes.
You can extend the following types. It is also possible to add your own types.
- Singleton and Static UIs. This includes any of the 'standard' in-game UI classes.
Useable
UIs (Guns, Housing Planners, etc).- Node and Volume editor menus.
- Any class deriving from
SleekWrapper
. - Modules can add their own classes in as well.
Existing Members
Easy access to members of the class you're expanding (static or instance) is possible with Existing Members.
// Property getter will be patched to return messageLabel.
[ExistingMember("messageLabel")]
private ISleekLabel MessageLabel { get; }
// Property will be set before the constructor runs. Change this behavior with the 'InitializeMode' attribute property.
// If you choose to use the 'PatchGetter' option with a setter,
// you cannot use the setter to set the existing member's value back.
[ExistingMember("messageLabel")]
private ISleekLabel MessageLabel { get; set; }
// Field will be set before the constructor runs.
[ExistingMember("messageLabel")]
private readonly ISleekLabel _messageLabel;
Common Mistake
Due to the way UI extensions are created, setting existing members to null!
to suppress nullability warnings actually overrides the value set before the constructor runs.
Take care to avoid doing this.
// Setting this to null here to fix nullable references will run after the fields
// are initialized but before the constructor so _container will have a null value.
//
// Instead use #nullable disable and #nullable restore to do this,
// or simply mark the field nullable.
// ================== BAD ==============================
[ExistingMember("container")]
private readonly SleekFullscreenBox _container = null!;
// ================== GOOD =============================
#nullable disable
// ...
[ExistingMember("container")]
private readonly SleekFullscreenBox _container;
// ...
#nullable restore
// ================== GOOD =============================
[ExistingMember("container")]
private readonly SleekFullscreenBox? _container;
// =====================================================
Static Compatibility
The system is designed to be able to be accessed from a static context (like a patch, for example).
// Getting static or singleton UI extensions:
MenuDashboardUIExtension? extension = UnturnedUIToolsNexus.UIExtensionManager.GetInstance<MenuDashboardUIExtension>();
// Getting non-singleton UI extensions:
static void Postfix(object __instance)
{
SleekItemExtension? extension = UnturnedUIToolsNexus.UIExtensionManager.GetInstance<SleekItemExtension>(__instance);
}
Examples
More examples available in: ExampleModule/Examples.
This example adds a button to the bottom left of the main menu.
[UIExtension(typeof(MenuDashboardUI))]
internal class MenuDashboardUIExtension : UIExtension, IDisposable
{
private const string Url = "https://github.com/DanielWillett/UnturnedUITools";
private readonly ISleekButton _githubButton;
[ExistingMember("exitButton")]
private readonly SleekButtonIcon _exitButton;
[ExistingMember("container")]
private readonly SleekFullscreenBox _container;
public MenuDashboardUIExtension()
{
_githubButton = Glazier.Get().CreateButton();
_githubButton.CopyTransformFrom(_exitButton);
_githubButton.PositionOffset_Y -= 60;
_githubButton.Text = "UITools GitHub";
_githubButton.FontSize = ESleekFontSize.Medium;
_githubButton.OnClicked += OnClickedGithubButton;
_githubButton.BackgroundColor = ESleekTint.BACKGROUND;
_container.AddChild(_githubButton);
}
private static void OnClickedGithubButton(ISleekElement button)
{
Process.Start(new ProcessStartInfo
{
FileName = Url,
UseShellExecute = true
});
}
public void Dispose()
{
_githubButton.OnClicked -= OnClickedGithubButton;
_container.RemoveChild(_githubButton);
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
.NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.1
- DanielWillett.ReflectionTools (>= 3.0.0)
- DanielWillett.ReflectionTools.Harmony (>= 3.0.0)
- Lib.Harmony (>= 2.3.3)
-
.NETStandard 2.1
- DanielWillett.ReflectionTools (>= 3.0.0)
- DanielWillett.ReflectionTools.Harmony (>= 3.0.0)
- Lib.Harmony (>= 2.3.3)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on DanielWillett.UnturnedUITools:
Package | Downloads |
---|---|
DevkitServer.Client
Module for Unturned that enables multi-user map editing. |
|
DevkitServer.Server
Module for Unturned that enables multi-user map editing. |
|
Breakdown.Tools
Package containing several tools for plugin and module development. |
|
DanielWillett.LevelObjectIcons
LevelObject icon renderer for the Unturned Map Editor. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Updated for v3.24.5.0. Added SetIsClickable extension for any generic element.