-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathDocumentation.html
More file actions
476 lines (399 loc) · 26.7 KB
/
Documentation.html
File metadata and controls
476 lines (399 loc) · 26.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BetaHub Unity Plugin Documentation</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
h1, h2, h3 {
color: #2c3e50;
}
h1 {
border-bottom: 2px solid #3498db;
padding-bottom: 10px;
}
code {
background-color: #f8f8f8;
border: 1px solid #ddd;
border-radius: 3px;
font-family: Consolas, Monaco, 'Andale Mono', monospace;
font-size: 0.9em;
padding: 2px 4px;
}
pre {
background-color: #f8f8f8;
border: 1px solid #ddd;
border-radius: 3px;
padding: 10px;
overflow-x: auto;
}
blockquote {
border-left: 4px solid #3498db;
margin: 0;
padding-left: 20px;
color: #7f8c8d;
}
.note {
background-color: #e8f4f8;
border-left: 4px solid #3498db;
padding: 10px;
margin: 20px 0;
}
.warning {
background-color: #fff5f5;
border-left: 4px solid #e74c3c;
padding: 10px;
margin: 20px 0;
}
</style>
</head>
<body>
<h1>BetaHub Unity Plugin Documentation</h1>
<div class="note">
<h3>API Usage and Terms</h3>
<p>This plugin connects to the BetaHub API at <a href="https://betahub.io">betahub.io</a>. Key points:</p>
<ul>
<li><strong>Free Access:</strong> All users get full access to every feature without volume limits</li>
<li><strong>Video Storage:</strong> Free users can upload up to 60 seconds of video per submission, with no additional fees</li>
<li><strong>No Subscription Required:</strong> The free account allows unlimited feedback reporting</li>
<li><strong>Demo Project Included:</strong> The plugin includes a demo project for immediate testing without configuration</li>
</ul>
<p>For complete API terms and conditions, visit <a href="https://betahub.io/api-terms">betahub.io/api-terms</a></p>
</div>
<p>Welcome to the BetaHub Unity Plugin! This guide will help you integrate our bug reporting tool into your Unity project, streamlining the process of collecting and managing bug reports from your game testers and players.</p>
<h2>Features</h2>
<ul>
<li><strong>In-game bug submission form:</strong> Streamlined form asking only for description and reproduction steps</li>
<li><strong>Device authentication:</strong> Optional OAuth-like sign-in flow via web browser for seamless user experience</li>
<li><strong>Video recording:</strong> Automatic capture of gameplay footage with bug reports</li>
<li><strong>Log collection:</strong> Automatic Unity log capture with support for custom logs</li>
<li><strong>Screenshot capture:</strong> Automatic screenshot attachment with bug submissions</li>
<li><strong>Working examples:</strong> Complete demo scenes and integration examples</li>
<li><strong>Highly customizable:</strong> Flexible configuration for different project needs</li>
</ul>
<h2>Prerequisites</h2>
<p>Before you begin, please ensure you have:</p>
<ol>
<li>A free BetaHub account (Sign up at <a href="https://app.betahub.io">app.betahub.io</a>)</li>
<li>Created a project on BetaHub:
<ul>
<li>Log in to your account</li>
<li>Click the "New Project" button</li>
<li>Follow up with the project creation wizard</li>
<li>While on the project page, click the "Settings/General" menu on the left</li>
<li>Note down your Project ID from the "Project Information" frame (you'll need this for plugin configuration)</li>
</ul>
</li>
</ol>
<h4>FFmpeg Installation</h4>
<p>The plugin uses FFmpeg for video recording. Install it in your project by clicking on <code>Tools > BetaHub > Install FFmpeg</code> in the Unity editor.</p>
<div class="warning">
<strong>Note:</strong> The plugin currently supports <strong>Windows</strong>, <strong>macOS</strong>, and <strong>Linux</strong>. For other platforms, manual FFmpeg installation and code adjustments may be necessary.
</div>
<div class="warning">
<h2>IL2CPP Support and FFmpeg Video Recording</h2>
<p><strong>If you are building your Unity project with IL2CPP as the scripting backend, special handling is required for video recording to work:</strong></p>
<ul>
<li>The plugin uses a native process wrapper library to launch and communicate with FFmpeg when running under IL2CPP. The standard .NET <code>Process</code> class is not available in IL2CPP builds.</li>
<li><strong>You must define the scripting symbol <code>ENABLE_BETAHUB_FFMPEG</code> in your project settings</strong> to enable native FFmpeg support for IL2CPP builds.</li>
<li>The native library (<code>libbetahub_process_wrapper</code>) must be present in your build's <code>Plugins</code> directory for your platform (e.g., <code>Plugins/macOS/</code>, <code>Plugins/Linux/</code>).</li>
<li>If you do not define <code>ENABLE_BETAHUB_FFMPEG</code>, video recording will be disabled in IL2CPP builds and a warning will be logged at runtime.</li>
<li>If you are using Mono or .NET scripting backend, the plugin will use the standard .NET <code>Process</code> class and does not require the native library or the scripting symbol.</li>
</ul>
<p><strong>Summary:</strong></p>
<ul>
<li>For IL2CPP: define <code>ENABLE_BETAHUB_FFMPEG</code> and ensure the native library is present.</li>
<li>For Mono/.NET: no special action is needed.</li>
</ul>
</div>
<div class="warning">
<h2>Performance: Disabling Logger</h2>
<p><strong>If you need to disable BetaHub's logging system for performance reasons or production builds:</strong></p>
<ul>
<li>Define the scripting symbol <code>DISABLE_BETAHUB_LOGGER</code> in Player Settings > Scripting Define Symbols</li>
<li>This prevents the logger from capturing Unity logs, which can cause:
<ul>
<li>File I/O operations every time Unity logs a message</li>
<li>CPU overhead from continuous disk writes</li>
<li>File access violations when multiple Unity instances run simultaneously</li>
</ul>
</li>
<li>Bug reports will still work, but won't include captured Unity logs</li>
<li>A warning will be displayed when BugReportUI starts with logging disabled</li>
</ul>
<p><strong>When to use:</strong></p>
<ul>
<li>Production builds where logging overhead impacts performance</li>
<li>Multi-instance Unity scenarios (automated testing, CI/CD)</li>
<li>Projects with high-frequency logging that causes file access issues</li>
</ul>
</div>
<h3>Quick Start</h3>
<div class="note">
<strong>Demo Project:</strong> The plugin comes pre-configured with a demo project, so you can test bug submissions immediately without any setup. Demo submissions are unlisted, and you'll find a link to view them in the Unity console log after submission.
</div>
<ol>
<li>Locate the BugReportingFormCanvas prefab in Packages/BetaHub Bug Reporter/Runtime/Prefabs.</li>
<li>Drag it into your scene.</li>
<li>Run your game and press <code>F12</code> to test the bug report form with the demo project.</li>
<li>To use your own project:
<ul>
<li>Select the BugReportingFormCanvas object in the hierarchy</li>
<li>In the inspector, find the <code>Project ID</code> field and enter your BetaHub project ID</li>
<li>Enter your <code>Auth Token</code> (found in Project Settings > Integrations > Tokens)</li>
</ul>
</li>
</ol>
<p>You're all set! Run your game and press <code>F12</code> to open the bug report form.</p>
<h2>Device Authentication (Optional)</h2>
<div class="note">
<strong>Enhanced User Experience:</strong> Device authentication provides a seamless sign-in flow that eliminates the need for users to enter email addresses when submitting bug reports. Users authenticate once via web browser and stay signed in across game sessions.
</div>
<h3>How Device Authentication Works</h3>
<ol>
<li><strong>User Initiates Sign-In:</strong> User clicks the "Sign In" button in your game</li>
<li><strong>Browser Authentication:</strong> System opens the default web browser to BetaHub's secure authentication page</li>
<li><strong>User Authenticates:</strong> User signs in with their BetaHub account credentials in the browser</li>
<li><strong>Token Exchange:</strong> Plugin receives a secure JWT token and stores it locally</li>
<li><strong>Seamless Bug Reports:</strong> Authenticated users can submit bug reports without entering email addresses</li>
</ol>
<h3>Benefits</h3>
<ul>
<li><strong>No Email Required:</strong> Authenticated users skip email entry during bug submission</li>
<li><strong>Persistent Authentication:</strong> Users stay signed in across game sessions (24-hour token expiry)</li>
<li><strong>Automatic User Association:</strong> Bug reports are automatically linked to user accounts</li>
<li><strong>Better User Experience:</strong> Reduces friction in the bug reporting process</li>
<li><strong>Optional Feature:</strong> Works alongside traditional anonymous reporting</li>
</ul>
<h3>Setup Instructions</h3>
<ol>
<li>Locate the <code>DeviceAuthCanvas</code> prefab in <strong>Packages/BetaHub Bug Reporter/Runtime/Prefabs/</strong></li>
<li>Drag it into your scene alongside the existing <code>BugReportingFormCanvas</code></li>
<li>Configure the <code>DeviceAuthManager</code> component:
<ul>
<li><strong>Project ID:</strong> Same as your BugReportingFormCanvas (found in BetaHub Project Settings)</li>
<li><strong>Entity Kind:</strong> "game" (default) or customize as needed</li>
<li><strong>Entity Name:</strong> Your game's name (displayed during authentication)</li>
<li><strong>Poll Interval:</strong> How often to check for authentication completion (default: 3 seconds)</li>
<li><strong>Auth Timeout:</strong> Maximum time to wait for authentication (default: 5 minutes)</li>
</ul>
</li>
<li>Link the components together:
<ul>
<li>Set the <code>DeviceAuthManager</code> reference in your <code>BugReportUI</code> component</li>
<li>Set the <code>MessagePanelUI</code> reference in your <code>DeviceAuthUI</code> component</li>
</ul>
</li>
</ol>
<h3>Programmatic Integration</h3>
<p>You can integrate device authentication programmatically:</p>
<pre><code>// Get reference to the DeviceAuthManager
DeviceAuthManager authManager = FindObjectOfType<DeviceAuthManager>();
// Start authentication flow
authManager.StartDeviceAuth();
// Check authentication status
if (authManager.IsAuthenticated())
{
Debug.Log($"User signed in as: {authManager.UserDisplayName}");
string jwtToken = authManager.JwtToken;
}
// Sign out user
authManager.SignOut();
// Listen for authentication state changes
authManager.OnAuthStateChanged += (DeviceAuthState newState) => {
Debug.Log($"Auth state changed to: {newState}");
};
// Handle authentication errors
authManager.OnAuthError += (string error) => {
Debug.LogError($"Authentication error: {error}");
};</code></pre>
<h3>Integration with Bug Reports</h3>
<p>When device authentication is properly set up:</p>
<ul>
<li>Authenticated users will see a "Thank you" message immediately after submitting bug reports</li>
<li>Non-authenticated users will see the traditional email entry form</li>
<li>Bug reports from authenticated users are automatically linked to their BetaHub accounts</li>
<li>The system automatically handles the authentication token in API requests</li>
</ul>
<div class="note">
<strong>Example Scene:</strong> The plugin includes <code>DeviceAuthExample.cs</code> in the Samples folder, demonstrating complete integration between device authentication and bug reporting systems.
</div>
<h2>Optional Components</h2>
<p>The plugin includes two optional components that can enhance bug reports with additional diagnostic information. These components are <strong>not attached to the prefabs by default</strong> and must be manually added to provide enhanced debugging capabilities.</p>
<h3>GeolocationProvider</h3>
<div class="note">
<strong>Purpose:</strong> Automatically collects the user's country and ISP information based on their IP address to help identify location-specific issues and provide geographic context for bug reports.
</div>
<h4>How It Works</h4>
<ol>
<li><strong>Automatic Detection:</strong> Uses BetaHub's ping endpoint to detect the user's country and ISP via IP geolocation</li>
<li><strong>Header Parsing:</strong> Extracts geolocation information from response headers:
<ul>
<li>Country data from headers like <code>X-Viewer-Country</code>, <code>CF-IPCountry</code></li>
<li>ASN (Autonomous System Number) data from <code>X-Viewer-ASN</code> header</li>
</ul>
</li>
<li><strong>ISP Resolution:</strong> ASN data is automatically resolved to ISP/company names on the BetaHub dashboard for easier analysis</li>
<li><strong>Bug Report Integration:</strong> Country and ISP data are automatically included in bug reports as custom fields</li>
</ol>
<h4>Setup Instructions</h4>
<ol>
<li>In your scene, select the GameObject containing your <code>BugReportUI</code> component</li>
<li>Click <strong>Add Component</strong> and search for <code>GeolocationProvider</code>, or drag the script from the project window</li>
<li>Configure the provider in the inspector:
<ul>
<li><strong>Enable Geolocation:</strong> Toggle to enable/disable country code collection</li>
<li><strong>Enable ASN Collection:</strong> Toggle to enable/disable ISP/ASN data collection</li>
<li><strong>Geolocation Endpoint:</strong> API endpoint for geolocation (default: <code>https://ping.betahub.io/ping.txt</code>)</li>
<li><strong>Timeout Seconds:</strong> Request timeout (default: 5 seconds)</li>
</ul>
</li>
<li>The component will automatically link itself to the <code>BugReportUI</code> on the same GameObject</li>
</ol>
<div class="note">
<strong>Automatic Setup:</strong> When <code>GeolocationProvider</code> is attached to the same GameObject as <code>BugReportUI</code>, it will automatically configure itself and display a success message in the console. If placed on a different GameObject, you'll see a warning message with setup instructions.
</div>
<h3>LatencyProvider</h3>
<div class="note">
<strong>Purpose:</strong> Measures network latency to help diagnose network-related issues and provide connection quality context for bug reports.
</div>
<h4>How It Works</h4>
<ol>
<li><strong>Ping Methods:</strong> Supports two measurement methods:
<ul>
<li><strong>ICMP Ping:</strong> Uses Unity's built-in Ping class for traditional network ping (default)</li>
<li><strong>HTTP Ping:</strong> Uses UnityWebRequest for HTTP-based latency measurement</li>
<li><strong>Automatic Fallback:</strong> Automatically switches from ICMP to HTTP if ICMP fails consistently (after 3 consecutive failures per host)</li>
</ul>
</li>
<li><strong>Collection Modes:</strong> Two modes for data collection:
<ul>
<li><strong>OnBugReport:</strong> Collects pings only when bug report window opens (default)</li>
<li><strong>Continuous:</strong> Continuously collects pings in the background at regular intervals</li>
</ul>
</li>
<li><strong>Multiple Host Support:</strong> Can ping multiple ICMP target hosts simultaneously for comprehensive network analysis</li>
<li><strong>Ping Collection:</strong>
<ul>
<li><strong>OnBugReport Mode (default):</strong> Performs 10 ping requests per host (configurable 1-20) when bug report opens</li>
<li><strong>Continuous Mode:</strong> Stores up to 256 pings per host in rolling buffer, collected every 15 seconds in background</li>
</ul>
</li>
<li><strong>Early Termination:</strong> If user submits the bug report before all pings complete, uses available data</li>
<li><strong>Comprehensive Statistics:</strong> Calculates minimum, maximum, and average latency from successful requests, plus packet loss statistics</li>
<li><strong>Results Format:</strong> Includes detailed data like <code>"min/avg/max = 45ms/67ms/89ms (8/10 requests), Lost: 2/10 (20.0%)"</code> in bug reports</li>
</ol>
<h4>Setup Instructions</h4>
<ol>
<li>In your scene, select the GameObject containing your <code>BugReportUI</code> component</li>
<li>Click <strong>Add Component</strong> and search for <code>LatencyProvider</code>, or drag the script from the project window</li>
<li>Configure the provider in the inspector:
<ul>
<li><strong>Enable Latency:</strong> Toggle to enable/disable latency measurement</li>
<li><strong>Collection Mode:</strong> Choose between OnBugReport (default) or Continuous collection</li>
<li><strong>Ping Method:</strong> Select ICMP (default) or HTTP ping method</li>
<li><strong>ICMP Target Hosts:</strong> List of hosts for ICMP ping (default: ping.betahub.io)</li>
<li><strong>HTTP Endpoint:</strong> API endpoint for HTTP latency testing (default: <code>https://ping.betahub.io/ping.txt</code>)</li>
<li><strong>Min Ping Requests:</strong> Minimum number of ping requests per host (default: 10, range: 1-20)</li>
<li><strong>Timeout Seconds:</strong> Request timeout per ping (default: 5 seconds)</li>
<li><strong>Delay Between Requests:</strong> Delay between consecutive pings (default: 0.1 seconds)</li>
<li><strong>Ping Interval:</strong> Interval between background pings in continuous mode (default: 15 seconds)</li>
</ul>
</li>
<li>The component will automatically link itself to the <code>BugReportUI</code> on the same GameObject</li>
</ol>
<div class="warning">
<strong>Performance Considerations:</strong> Latency testing performs network requests while the bug report UI is open. The default settings (10 requests with 0.1s delays) complete in approximately 1-2 seconds under normal conditions. If users frequently submit reports very quickly, consider reducing <code>Max Ping Requests</code> or increasing <code>Delay Between Requests</code> to balance accuracy with responsiveness.
</div>
<h4>Troubleshooting</h4>
<ul>
<li><strong>"No latency data available":</strong> All ping requests failed. Check network connectivity and endpoint accessibility.</li>
<li><strong>"No country information found":</strong> Geolocation service didn't return expected headers. This may indicate network issues or endpoint changes.</li>
<li><strong>Warning messages in console:</strong> If components are not on the same GameObject as <code>BugReportUI</code>, you'll see warnings with setup instructions.</li>
</ul>
<h4>Data Integration</h4>
<p>When both components are enabled, bug reports will include custom fields like:</p>
<pre><code>Custom Fields:
country=US
asn=Cloudflare, Inc.
latency=ping.betahub.io: min/avg/max = 45ms/67ms/89ms (10/10 requests)</code></pre>
<p>This data appears in the BetaHub dashboard and can be used for:</p>
<ul>
<li><strong>Geographic Analysis:</strong> Identifying region-specific issues and user distribution</li>
<li><strong>ISP Analysis:</strong> Understanding which internet service providers may be experiencing issues</li>
<li><strong>Network Diagnosis:</strong> Correlating bugs with connection quality and packet loss rates</li>
<li><strong>Performance Optimization:</strong> Understanding user network conditions across different providers</li>
<li><strong>Support Prioritization:</strong> Triaging issues based on user location, ISP, and connectivity quality</li>
</ul>
<h3>Configuration</h3>
<p>Adjust these settings in the BugReportingFormCanvas inspector:</p>
<ul>
<li><strong>Project ID</strong>: Your BetaHub project identifier (found in Project Settings > General > Project Information).</li>
<li><strong>Auth Token</strong>: Your application token for API authentication (found in Project Settings > Integrations > Tokens). This is <strong>not an API key</strong> and does not need to be kept secret - it's a project identifier that helps prevent API abuse and spam while identifying your application.</li>
<li><strong>Default Email Address</strong>: <em>Optional programmatic field.</em> If set, this email address will be used as the default email address of the reporter. This is a hidden field intended to be pre-filled programmatically by the developer if the user is already logged in with a specific email address.</li>
<li><strong>Shortcut Key</strong>: Default is F12. Set to None to disable and open the form programmatically.</li>
<li><strong>Performance_Sampler</strong>
<ul>
<li><strong>Sample Frequency</strong>: How often to sample game performance.</li>
<li><strong>Sample Duration</strong>: How long to sample game performance.</li>
</ul>
</li>
<li><strong>Game_Recorder</strong>
<ul>
<li><strong>Frame Rate</strong>: Default is 30. Higher rates may increase file size and resource usage.</li>
<li><strong>Recording Duration</strong>: Default is 60 seconds.</li>
<li><strong>Downscale Video</strong>: <em>Off by default.</em> If enabled, the video will be downscaled to a maximum resolution (default: 1920x1080) if your game runs at a higher resolution. This helps reduce CPU usage and file size when recording on high-resolution displays. Enable this option in the inspector if you notice high CPU usage or stuttering during recording at large resolutions.</li>
<li><strong>Render FPS Overlay</strong>: <em>On by default.</em> When enabled, the current FPS (frames per second) will be displayed as an overlay on the recorded video. This is useful for performance analysis and helps identify frame rate issues during bug reports. The FPS counter appears in the bottom-left corner of the video.</li>
<li><strong>Render Cursor</strong>: <em>Off by default.</em> When enabled, the mouse cursor position will be rendered in the recorded video. This is useful for showing user interactions and click locations during bug reports. The cursor is drawn as a white arrow with a black outline for visibility against different backgrounds.</li>
<li><strong>Mirror Vertically</strong>: <em>Off by default.</em> When enabled, the recorded video will be flipped vertically (upside down). This setting is useful for specific rendering setups or platforms where the video output needs to be inverted.</li>
<li><strong>Capture Render Texture</strong>: <em>Optional.</em> When set, the recorder will capture from this specific render texture instead of the main screen. This is useful for recording from specific cameras, UI canvases, or other render targets. The recorder will automatically handle scaling if the render texture dimensions don't match the output resolution. Leave empty to record the main screen.</li>
</ul>
</li>
<li><strong>Unity Events</strong>
<ul>
<li><strong>On Bug Report Window Shown</strong>: Unity event triggered when the bug reporting window is displayed. Use this to pause your game, modify UI states, or perform other actions when bug reporting begins.</li>
<li><strong>On Bug Report Window Hidden</strong>: Unity event triggered when the bug reporting window is closed or hidden. Use this to resume your game, restore UI states, or perform cleanup actions when bug reporting ends.</li>
</ul>
</li>
</ul>
<h3>Programmatic Integration</h3>
<p>To open the bug report form on specific events:</p>
<ol>
<li>Call <code>SetActive</code> on the <code>BugReportUI</code> object.</li>
<li>Be aware of default inclusions:
<ul>
<li>Video: Yes (control with <code>IncludeVideo</code>)</li>
<li>Player.log: Yes (control with <code>IncludePlayerLog</code>)</li>
<li>Screenshots: No (add manually)</li>
</ul>
</li>
</ol>
<h4>Including Screenshots</h4>
<p>Use <code>AddScreenshot</code> on the <code>BugReportUI</code> object:</p>
<pre><code>public void AddScreenshot(string path, bool removeAfterUpload)</code></pre>
<div class="note">
<strong>Tip:</strong> Capture screenshots before opening menus for more valuable bug context.
</div>
<h4>Including Logs</h4>
<p>Use <code>AddLog</code> on the <code>BugReportUI</code> object:</p>
<pre><code>public void AddLog(string path, bool removeAfterUpload)</code></pre>
<div class="note">
<strong>Note:</strong> Call these functions each time you want to include screenshots or logs. The plugin doesn't store them between reports.
</div>
<h2>Support</h2>
<p>For any questions or issues, please contact us:</p>
<ul>
<li>Email: <a href="mailto:support@betahub.io">support@betahub.io</a></li>
<li>Discord: <a href="https://discord.gg/g2wpRtG">Join our community</a></li>
</ul>
<p>Thank you for choosing BetaHub for your game development needs!</p>
</body>
</html>