diff --git a/Tooling/generate-docs.ps1 b/Tooling/generate-docs.ps1
new file mode 100644
index 000000000..7f5cd2d49
--- /dev/null
+++ b/Tooling/generate-docs.ps1
@@ -0,0 +1,143 @@
+# Copyright (c) Mixed Reality Toolkit Contributors
+# Licensed under the BSD 3-Clause
+
+<#
+.SYNOPSIS
+ Generates XML documentation files and validates CS1591 across MRTK production assemblies locally.
+
+.DESCRIPTION
+ Runs Unity in batch mode to compile production assemblies with /doc and /warnaserror:1591,
+ surfacing any missing XML documentation on public APIs without requiring external CI tools.
+
+.PARAMETER ProjectPath
+ Path to the Unity project (defaults to UnityProjects/MRTKDevTemplate).
+
+.PARAMETER OutputDirectory
+ Directory where generated DLLs and XML files will be placed (defaults to artifacts/docs).
+
+.PARAMETER AssemblyFilter
+ Optional filter string to build only specific assemblies (e.g. "Input", "Core", "SpatialManipulation").
+
+.PARAMETER WarnAsError
+ Treat CS1591 missing XML documentation warnings as build errors (default: $true).
+
+.PARAMETER IncludeEditor
+ Include Editor assemblies in documentation generation.
+
+.PARAMETER VerboseLog
+ Enable verbose compiler output.
+
+.EXAMPLE
+ .\Tooling\generate-docs.ps1
+ # Generates and validates docs for all production assemblies
+
+.EXAMPLE
+ .\Tooling\generate-docs.ps1 -AssemblyFilter Input
+ # Validates only MixedReality.Toolkit.Input
+#>
+[CmdletBinding()]
+param(
+ [Parameter(Position = 0)]
+ [string]$ProjectPath = "$PSScriptRoot/../UnityProjects/MRTKDevTemplate",
+
+ [Parameter(Position = 1)]
+ [string]$OutputDirectory = "$PSScriptRoot/../artifacts/docs",
+
+ [string]$AssemblyFilter = "",
+
+ [bool]$WarnAsError = $true,
+
+ [switch]$IncludeEditor,
+
+ [switch]$VerboseLog
+)
+
+$ErrorActionPreference = "Stop"
+
+$resolvedProject = Resolve-Path $ProjectPath
+$resolvedOutput = [System.IO.Path]::GetFullPath($OutputDirectory)
+
+if (-not (Test-Path $resolvedOutput)) {
+ New-Item -ItemType Directory -Path $resolvedOutput -Force | Out-Null
+}
+
+$commonArgs = @(
+ "-executeMethod", "MixedReality.Toolkit.Editor.DocGen.GenerateDocsBinariesBatchMode",
+ "-docOutput:$resolvedOutput"
+)
+if ($AssemblyFilter) { $commonArgs += "-docFilter:$AssemblyFilter" }
+if ($WarnAsError) { $commonArgs += "-docWarnAsError:true" } else { $commonArgs += "-docWarnAsError:false" }
+if ($IncludeEditor) { $commonArgs += "-docIncludeEditor" }
+if ($VerboseLog) { $commonArgs += "-docVerbose" }
+
+Write-Host "========================================================" -ForegroundColor Cyan
+Write-Host " MRTK Local Documentation Generator & CS1591 Validator" -ForegroundColor Cyan
+Write-Host "========================================================" -ForegroundColor Cyan
+Write-Host "Project: $resolvedProject"
+Write-Host "Output: $resolvedOutput"
+if ($AssemblyFilter) { Write-Host "Filter: $AssemblyFilter" }
+Write-Host "WarnAsErr: $WarnAsError"
+Write-Host ""
+
+# Check for 'unity' CLI in PATH
+$unityCli = Get-Command "unity" -ErrorAction SilentlyContinue
+
+if ($null -ne $unityCli) {
+ Write-Host "Using Unity CLI: $($unityCli.Source)" -ForegroundColor Green
+ $logFile = Join-Path $resolvedOutput "docgen.log"
+ $cliArgs = @("run", "$resolvedProject", "--no-banner", "--no-tail", "-l", "$logFile", "--") + $commonArgs
+ & unity @cliArgs
+ $exitCode = $LASTEXITCODE
+
+ if (Test-Path $logFile) {
+ $docGenLines = Get-Content $logFile | Where-Object { $_ -match "\[DocGen\]" }
+ if ($docGenLines) {
+ Write-Host "`n--- DocGen Output Summary ---" -ForegroundColor Cyan
+ foreach ($line in $docGenLines) {
+ if ($line -match "FAILED|error CS") {
+ Write-Host $line -ForegroundColor Red
+ } elseif ($line -match "warning CS") {
+ Write-Host $line -ForegroundColor Yellow
+ } elseif ($line -match "PASSED|SUCCEEDED|compiled successfully") {
+ Write-Host $line -ForegroundColor Green
+ } else {
+ Write-Host $line -ForegroundColor Gray
+ }
+ }
+ }
+ }
+} else {
+ # Fallback to direct Unity.exe
+ $projectVersionPath = Join-Path $resolvedProject "ProjectSettings/ProjectVersion.txt"
+ $unityVersion = "2021.3.45f2"
+ if (Test-Path $projectVersionPath) {
+ $versionLine = Get-Content $projectVersionPath | Where-Object { $_ -match "^m_EditorVersion:\s*(.+)$" } | Select-Object -First 1
+ if ($versionLine -match "^m_EditorVersion:\s*(.+)$") {
+ $unityVersion = $Matches[1].Trim()
+ }
+ }
+
+ $unityExePath = "C:\Program Files\Unity\Hub\Editor\$unityVersion\Editor\Unity.exe"
+ if (-not (Test-Path $unityExePath)) {
+ Write-Error "Unity editor executable not found at '$unityExePath' and 'unity' CLI is not in PATH."
+ exit 1
+ }
+
+ Write-Host "Using Unity executable: $unityExePath" -ForegroundColor Green
+ $processArgs = @("-projectPath", "$resolvedProject", "-batchmode") + $commonArgs + @("-quit", "-logFile", "$logFile")
+
+ $proc = Start-Process -FilePath $unityExePath -ArgumentList $processArgs -PassThru -Wait -NoNewWindow
+ $exitCode = $proc.ExitCode
+
+ if (Test-Path $logFile) {
+ Get-Content $logFile | Select-String "\[DocGen\]" | ForEach-Object { Write-Host $_.Line }
+ }
+}
+
+if ($exitCode -eq 0) {
+ Write-Host "`nDocumentation generation and CS1591 validation SUCCEEDED." -ForegroundColor Green
+} else {
+ Write-Host "`nDocumentation generation or CS1591 validation FAILED (Exit code: $exitCode)." -ForegroundColor Red
+}
+
+exit $exitCode
diff --git a/org.mixedrealitytoolkit.core/CHANGELOG.md b/org.mixedrealitytoolkit.core/CHANGELOG.md
index 95f237481..20d7b984f 100644
--- a/org.mixedrealitytoolkit.core/CHANGELOG.md
+++ b/org.mixedrealitytoolkit.core/CHANGELOG.md
@@ -14,11 +14,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
### Added
* Added edit mode tests for `AssemblyExtensions`, `SystemType`, and `SerializableDictionary`. [PR #1122](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1122)
+* Added documentation generation and CS1591 validation tooling. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148)
### Fixed
* Fixed "The type `MixedReality.Toolkit.Core MixedReality.Toolkit.Experimental.BubbleChildHoverEvents/TrickleChildHoverEvents/BubbleChildSelectEvents/TrickleChildSelectEvents` is being serialized by `[SerializeReference]`, but is missing the `[Serializable]` attribute." on Unity 6.3. [PR #1107](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1107)
* Fixed object identity API usages and obsolete sorting warnings for Unity 6.4 and newer in `FindObjectUtility`. [PR #1136](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1136)
+* Fixed missing XML documentation comments in `SerializableDictionary`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148)
## Deprecated
diff --git a/org.mixedrealitytoolkit.core/Editor/DocTools.meta b/org.mixedrealitytoolkit.core/Editor/DocTools.meta
new file mode 100644
index 000000000..e3398b466
--- /dev/null
+++ b/org.mixedrealitytoolkit.core/Editor/DocTools.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a784f8829c65467e88908efa541e39ac
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs
new file mode 100644
index 000000000..6645595d8
--- /dev/null
+++ b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs
@@ -0,0 +1,273 @@
+// Copyright (c) Mixed Reality Toolkit Contributors
+// Licensed under the BSD 3-Clause
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using UnityEditor;
+using UnityEditor.Compilation;
+using UnityEngine;
+
+namespace MixedReality.Toolkit.Editor
+{
+ ///
+ /// Generates XML documentation and compiled binaries for MRTK packages,
+ /// and validates that all publicly visible APIs have XML documentation (CS1591).
+ ///
+ public static class DocGen
+ {
+ private const string DefaultOutputFolder = "artifacts/docs";
+
+ ///
+ /// Menu item to generate XML documentation and validate CS1591 across all production MRTK assemblies.
+ ///
+ [MenuItem("Mixed Reality/MRTK3/Utilities/Documentation/Generate and Validate Docs")]
+ public static void GenerateDocsMenu()
+ {
+ GenerateDocsBinaries(outputFolder: DefaultOutputFolder, warnAsError: true, verbose: false);
+ }
+
+ ///
+ /// Menu item to generate XML documentation without failing on missing doc warnings.
+ ///
+ [MenuItem("Mixed Reality/MRTK3/Utilities/Documentation/Generate Docs (No WarnAsError)")]
+ public static void GenerateDocsNoWarnAsErrorMenu()
+ {
+ GenerateDocsBinaries(outputFolder: DefaultOutputFolder, warnAsError: false, verbose: false);
+ }
+
+ ///
+ /// Entry point for batch mode execution from command line or CI.
+ ///
+ ///
+ /// Command line arguments supported:
+ ///
+ /// - -docOutput:<path>: Output folder for generated XML and DLL files.
+ /// - -docFilter:<substring>: Filter to compile only matching assemblies (e.g. "Input").
+ /// - -docWarnAsError: Fail build if CS1591 doc warnings are encountered (default: true).
+ /// - -docIncludeEditor: Include Editor assemblies in addition to runtime assemblies.
+ /// - -docVerbose: Print verbose compiler diagnostic messages.
+ ///
+ ///
+ public static void GenerateDocsBinariesBatchMode()
+ {
+ string outputFolder = DefaultOutputFolder;
+ string filter = null;
+ bool warnAsError = true;
+ bool includeEditor = false;
+ bool verbose = false;
+
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 0; i < args.Length; i++)
+ {
+ string arg = args[i];
+ if (arg.StartsWith("-docOutput:", StringComparison.OrdinalIgnoreCase))
+ {
+ outputFolder = arg["-docOutput:".Length..];
+ }
+ else if (arg.StartsWith("-docFilter:", StringComparison.OrdinalIgnoreCase))
+ {
+ filter = arg["-docFilter:".Length..];
+ }
+ else if (arg.Equals("-docWarnAsError", StringComparison.OrdinalIgnoreCase) ||
+ arg.Equals("-docWarnAsError:true", StringComparison.OrdinalIgnoreCase))
+ {
+ warnAsError = true;
+ }
+ else if (arg.Equals("-docWarnAsError:false", StringComparison.OrdinalIgnoreCase))
+ {
+ warnAsError = false;
+ }
+ else if (arg.Equals("-docIncludeEditor", StringComparison.OrdinalIgnoreCase))
+ {
+ includeEditor = true;
+ }
+ else if (arg.Equals("-docVerbose", StringComparison.OrdinalIgnoreCase))
+ {
+ verbose = true;
+ }
+ }
+
+ bool success = GenerateDocsBinaries(outputFolder, warnAsError, verbose, filter, includeEditor);
+
+ if (Application.isBatchMode)
+ {
+ // Ensure logs flush
+ Thread.Sleep(500);
+ EditorApplication.Exit(success ? 0 : 1);
+ }
+ }
+
+ ///
+ /// Compiles assemblies with the /doc flag enabled and optionally enforces CS1591 as an error.
+ ///
+ /// Folder to write compiled DLLs and XML doc files to.
+ /// Whether to treat CS1591 missing XML comment warnings as errors.
+ /// Whether to log all compiler warnings and verbose progress.
+ /// Optional substring filter for assembly names.
+ /// Whether to include editor assemblies.
+ /// if all target assemblies compiled successfully without documentation errors, otherwise .
+ public static bool GenerateDocsBinaries(
+ string outputFolder = DefaultOutputFolder,
+ bool warnAsError = true,
+ bool verbose = false,
+ string assemblyFilter = null,
+ bool includeEditor = false)
+ {
+ Directory.CreateDirectory(outputFolder);
+
+ Assembly[] allAssemblies = CompilationPipeline.GetAssemblies();
+ var targetAssemblies = allAssemblies.Where(a =>
+ a.name.StartsWith("MixedReality.Toolkit") &&
+ !a.name.EndsWith(".Tests") &&
+ !a.name.EndsWith("Tests") &&
+ !a.name.Contains(".Tests.") &&
+ !a.name.EndsWith("TestUtilities") &&
+ (includeEditor || !a.flags.HasFlag(AssemblyFlags.EditorAssembly))
+ );
+
+ if (!string.IsNullOrEmpty(assemblyFilter))
+ {
+ targetAssemblies = targetAssemblies.Where(a =>
+ a.name.IndexOf(assemblyFilter, StringComparison.OrdinalIgnoreCase) >= 0);
+ }
+
+ List assemblyList = targetAssemblies.OrderBy(a => a.name).ToList();
+
+ if (assemblyList.Count == 0)
+ {
+ Debug.LogWarning($"[DocGen] No assemblies matched criteria (Filter: '{assemblyFilter ?? "None"}', IncludeEditor: {includeEditor})");
+ return true;
+ }
+
+ Debug.Log($"[DocGen] Starting documentation generation for {assemblyList.Count} assemblies into '{outputFolder}' (WarnAsError: {warnAsError})...");
+
+ int successCount = 0;
+ int failureCount = 0;
+ int totalCs1591 = 0;
+
+ foreach (Assembly assembly in assemblyList)
+ {
+ string dllFileName = Path.GetFileName(assembly.outputPath);
+ string outputDllPath = Path.Combine(outputFolder, dllFileName);
+ string xmlFileName = Path.GetFileNameWithoutExtension(dllFileName) + ".xml";
+ string outputXmlPath = Path.Combine(outputFolder, xmlFileName);
+
+ AssemblyBuilder builder = new AssemblyBuilder(outputDllPath, assembly.sourceFiles)
+ {
+ additionalDefines = assembly.defines,
+ referencesOptions = ReferencesOptions.UseEngineModules
+ };
+
+ if (assembly.flags.HasFlag(AssemblyFlags.EditorAssembly))
+ {
+ builder.flags = AssemblyBuilderFlags.EditorAssembly;
+ }
+
+ builder.additionalReferences = assembly.allReferences;
+ builder.compilerOptions = assembly.compilerOptions;
+ builder.excludeReferences = builder.defaultReferences.Except(assembly.allReferences).ToArray();
+
+ // Add /doc compiler argument
+ var compilerArgs = new List(builder.compilerOptions.AdditionalCompilerArguments ?? Array.Empty())
+ {
+ $"/doc:{outputXmlPath}"
+ };
+ if (warnAsError)
+ {
+ compilerArgs.Add("/warnaserror:1591");
+ }
+ builder.compilerOptions.AdditionalCompilerArguments = compilerArgs.ToArray();
+
+ List messages = new List();
+ builder.buildFinished += (path, compilerMessages) =>
+ {
+ if (compilerMessages != null)
+ {
+ messages.AddRange(compilerMessages);
+ }
+ };
+
+ Debug.Log($"[DocGen] Compiling {assembly.name} -> {xmlFileName}...");
+
+ if (!builder.Build())
+ {
+ Debug.LogError($"[DocGen] Failed to initiate build for {assembly.name}!");
+ failureCount++;
+ continue;
+ }
+
+ int timeoutMs = 60000;
+ int elapsed = 0;
+ while (builder.status != AssemblyBuilderStatus.Finished && elapsed < timeoutMs)
+ {
+ Thread.Sleep(50);
+ elapsed += 50;
+ }
+
+ if (builder.status != AssemblyBuilderStatus.Finished)
+ {
+ Debug.LogError($"[DocGen] Build timed out for assembly {assembly.name} after {timeoutMs / 1000}s!");
+ failureCount++;
+ continue;
+ }
+
+ int errorCount = 0;
+ int assemblyCs1591 = 0;
+
+ foreach (CompilerMessage msg in messages)
+ {
+ bool isCs1591 = msg.message.Contains("CS1591");
+ if (isCs1591)
+ {
+ assemblyCs1591++;
+ totalCs1591++;
+ }
+
+ if (msg.type == CompilerMessageType.Error)
+ {
+ errorCount++;
+ Debug.LogError($"[DocGen] [{assembly.name}] {msg.file}({msg.line},{msg.column}): {msg.message}");
+ }
+ else if (msg.type == CompilerMessageType.Warning)
+ {
+ if (verbose || isCs1591)
+ {
+ Debug.LogWarning($"[DocGen] [{assembly.name}] {msg.file}({msg.line},{msg.column}): {msg.message}");
+ }
+ }
+ }
+
+ if (errorCount > 0 || (warnAsError && assemblyCs1591 > 0))
+ {
+ failureCount++;
+ Debug.LogError($"[DocGen] {assembly.name} FAILED: {errorCount} errors, {assemblyCs1591} missing XML doc comments (CS1591).");
+ }
+ else
+ {
+ successCount++;
+ Debug.Log($"[DocGen] {assembly.name} PASSED. (XML: {outputXmlPath})");
+ }
+ }
+
+ Debug.Log($"[DocGen] ========================================================");
+ Debug.Log($"[DocGen] Documentation Build Summary:");
+ Debug.Log($"[DocGen] Total assemblies: {assemblyList.Count}, Succeeded: {successCount}, Failed: {failureCount}");
+ Debug.Log($"[DocGen] Total CS1591 missing doc warnings: {totalCs1591}");
+ Debug.Log($"[DocGen] ========================================================");
+
+ bool success = failureCount == 0;
+
+ if (!Application.isBatchMode)
+ {
+ string title = success ? "Doc Generation Succeeded" : "Doc Generation Failed";
+ string message = $"Assemblies: {assemblyList.Count}\nSucceeded: {successCount}\nFailed: {failureCount}\nCS1591 Warnings: {totalCs1591}\n\nOutput folder: {outputFolder}";
+ EditorUtility.DisplayDialog(title, message, "OK");
+ }
+
+ return success;
+ }
+ }
+}
diff --git a/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs.meta b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs.meta
new file mode 100644
index 000000000..be0886bcf
--- /dev/null
+++ b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 27b67b988a974593a6f3a34402f06250
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs b/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs
index 6b8317397..44186b07e 100644
--- a/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs
+++ b/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs
@@ -59,12 +59,21 @@ void ISerializationCallbackReceiver.OnAfterDeserialize()
}
#if UNITY_EDITOR
+ ///
+ /// Removes all keys and values from the .
+ ///
public new void Clear()
{
entries.Clear();
base.Clear();
}
+ ///
+ /// Removes the value with the specified key from the , and copies the element to the value parameter.
+ ///
+ /// The key of the element to remove.
+ /// The value of the element that was removed, or the default value if key was not found.
+ /// if the element is successfully found and removed; otherwise, .
public new bool Remove(TKey key, out TValue value)
{
if (base.Remove(key, out value))
@@ -80,6 +89,11 @@ void ISerializationCallbackReceiver.OnAfterDeserialize()
return false;
}
+ ///
+ /// Removes the value with the specified key from the .
+ ///
+ /// The key of the element to remove.
+ /// if the element is successfully found and removed; otherwise, .
public new bool Remove(TKey key)
{
return Remove(key, out _);
diff --git a/org.mixedrealitytoolkit.input/CHANGELOG.md b/org.mixedrealitytoolkit.input/CHANGELOG.md
index 23b92079a..242fc0539 100644
--- a/org.mixedrealitytoolkit.input/CHANGELOG.md
+++ b/org.mixedrealitytoolkit.input/CHANGELOG.md
@@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
* Fixed "leaked managed shell" issue in `InteractionModeManager`. [PR #1096](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1096)
* Fixed `EyeCalibrationChecker` build issue on UWP when the Mixed Reality OpenXR Plugin wasn't installed. [PR #1106](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1106)
* Fixed object identity API usages for Unity 6.4 and newer in `InteractionModeManagerEditor`. [PR #1136](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1136)
+* Fixed missing XML documentation comments in `ProximityEnteredEventArgs`, `ProximityExitedEventArgs`, and `LOSAngularOffsetHandRayPoseSource`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148)
## [3.3.0] - 2025-11-12
diff --git a/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs b/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs
index 1af15c03c..bd55122be 100644
--- a/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs
+++ b/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs
@@ -3,6 +3,9 @@
namespace MixedReality.Toolkit.Input
{
+ ///
+ /// Event data associated with proximity entered events triggered by a .
+ ///
public class ProximityEnteredEventArgs : BaseProximityEventArgs
{
///
diff --git a/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs b/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs
index 75be94113..90f19d712 100644
--- a/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs
+++ b/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs
@@ -3,6 +3,9 @@
namespace MixedReality.Toolkit.Input
{
+ ///
+ /// Event data associated with proximity exited events triggered by a .
+ ///
public class ProximityExitedEventArgs : BaseProximityEventArgs
{
///
diff --git a/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs b/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs
index f23220eae..d000f42d0 100644
--- a/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs
+++ b/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs
@@ -37,6 +37,9 @@ public class LOSAngularOffsetHandRayPoseSource : HandBasedPoseSource
private readonly Vector2 MinMaxPitchAngleOffset = new Vector2(-24f, -85f);
private const float MinMaxAngleAdjustHandProximity = .5f;
+ ///
+ /// Initializes a new instance of the class.
+ ///
public LOSAngularOffsetHandRayPoseSource()
{
StabilizedHandRay = new Lazy(() =>
diff --git a/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs b/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs
index a40709694..d65cc805e 100644
--- a/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs
+++ b/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs
@@ -78,8 +78,10 @@ public bool MaintainGlobalSize
set => scaleMaintainType = value ? ScaleMaintainType.GlobalSize : ScaleMaintainType.FixedScale;
}
+ ///
public void OnBeforeSerialize() { }
+ ///
public void OnAfterDeserialize()
{
// Only update the scaleMaintainType if it hasn't been set and the old property was not migrated yet
@@ -184,6 +186,9 @@ protected virtual void LateUpdate()
UpdateLocalScale();
}
+ ///
+ /// Maintains the aspect ratio/proportion of the handles based on .
+ ///
protected virtual void UpdateLocalScale()
{
transform.localScale = Vector3.one;
@@ -234,7 +239,11 @@ protected virtual void UpdateLocalScale()
}
}
- // Returns the local scale this transform needs to have in order to have the desired lossy scale
+ ///
+ /// Returns the local scale this transform needs to have in order to have the desired lossy scale.
+ ///
+ /// The desired lossy scale.
+ /// The local scale vector to produce the target lossy scale.
protected Vector3 GetLocalScale(float lossyScale) => new(
transform.lossyScale.x == 0 ? transform.localScale.x : (lossyScale / transform.lossyScale.x),
transform.lossyScale.y == 0 ? transform.localScale.y : (lossyScale / transform.lossyScale.y),
diff --git a/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md b/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md
index 627a89ce4..de1de0619 100644
--- a/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md
+++ b/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
* Fixed "leaked managed shell" issue in `BoundsCalculator`. [PR #1096](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1096)
* Fixed object identity API usages for Unity 6.4 and newer in `ConstraintManagerEditor`. [PR #1136](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1136)
+* Fixed missing XML documentation comments in `BoundsHandleInteractable`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148)
### Changed
diff --git a/org.mixedrealitytoolkit.uxcore/CHANGELOG.md b/org.mixedrealitytoolkit.uxcore/CHANGELOG.md
index f5b02e2d5..481665cc3 100644
--- a/org.mixedrealitytoolkit.uxcore/CHANGELOG.md
+++ b/org.mixedrealitytoolkit.uxcore/CHANGELOG.md
@@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
* Fixed "leaked managed shell" issue in `UGUIInputAdapter`. [PR #1096](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1096)
* Fixed "Attribute 'SerializeField' is not valid on this declaration type. It is only valid on 'field' declarations" error on `DialogButton` in Unity 6.3. [PR #1108](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1108)
+* Fixed missing XML documentation comments in `VirtualizedScrollRectList` and `SeeItSayItLabelEnabler`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148)
## [3.3.0] - 2025-11-12
diff --git a/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs b/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs
index ae61c2105..f1f327a06 100644
--- a/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs
+++ b/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Mixed Reality Toolkit Contributors
+// Copyright (c) Mixed Reality Toolkit Contributors
// Licensed under the BSD 3-Clause
using System;
@@ -361,6 +361,9 @@ protected void OnValidate()
ResetLayout();
}
+ ///
+ /// A Unity event function that is called when the script component has been enabled.
+ ///
protected void OnEnable()
{
// Check if reset was called while this script was disabled and ensure the layout is reset
diff --git a/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs b/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs
index 1b0c53a88..d1f5bd5e9 100644
--- a/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs
+++ b/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs
@@ -93,6 +93,9 @@ public Transform PositionControl
private const float CanvasOffset = -10f;
private const float NonCanvasOffset = -0.004f;
+ ///
+ /// A Unity event function that is called when the script instance is being loaded.
+ ///
protected virtual void Awake()
{
pressableButton = GetComponent();
@@ -163,6 +166,9 @@ protected virtual void Start()
}
}
+ ///
+ /// A Unity event function that is called when the MonoBehaviour will be destroyed.
+ ///
protected virtual void OnDestroy()
{
#if MRTK_INPUT_PRESENT && MRTK_SPEECH_PRESENT
@@ -179,6 +185,10 @@ protected virtual void OnDestroy()
#endif
}
+ ///
+ /// Updates the See-It Say-It label text based on the specified speech recognition keyword.
+ ///
+ /// The speech recognition keyword to display.
protected virtual void UpdateLabel(string keyword)
{
#if MRTK_INPUT_PRESENT && MRTK_SPEECH_PRESENT
@@ -197,6 +207,10 @@ protected virtual void UpdateLabel(string keyword)
}
#if MRTK_INPUT_PRESENT && MRTK_SPEECH_PRESENT && UNITY_LOCALIZATION_PRESENT
+ ///
+ /// Callback invoked when the localized label pattern string changes.
+ ///
+ /// The updated localized string value.
protected virtual void OnLocalizedPatternChanged(string value)
{
UpdateLabel(pressableButton.SpeechRecognitionKeyword);