add quest terrain runtime diagnostics and render-state probe

This commit is contained in:
2026-02-10 02:33:05 +01:00
parent d9dc50782d
commit 1ec973c48e
2 changed files with 102 additions and 8 deletions

View File

@@ -3,6 +3,7 @@ using System.IO;
using System.Reflection;
using System.Text;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
[DisallowMultipleComponent]
@@ -73,6 +74,7 @@ public sealed class RuntimeBootProbe : MonoBehaviour
if (geoTileLoader == null)
{
sb.Append("geoTileLoader=null ");
AppendRenderState(sb);
Debug.Log(sb.ToString());
return;
}
@@ -103,9 +105,66 @@ public sealed class RuntimeBootProbe : MonoBehaviour
else
sb.Append("catalogExists=unknown ");
AppendRenderState(sb);
Debug.Log(sb.ToString());
}
private static void AppendRenderState(StringBuilder sb)
{
var rp = GraphicsSettings.currentRenderPipeline;
string rpName = rp != null ? $"{rp.name} ({rp.GetType().Name})" : "BuiltInRenderPipeline";
int qualityIndex = QualitySettings.GetQualityLevel();
string qualityName = qualityIndex >= 0 && qualityIndex < QualitySettings.names.Length
? QualitySettings.names[qualityIndex]
: "<unknown>";
sb.Append("quality=").Append(qualityIndex).Append(":").Append(qualityName).Append(" ");
sb.Append("renderPipeline=").Append(rpName).Append(" ");
var cam = Camera.main;
if (cam == null)
{
sb.Append("mainCamera=<none> ");
}
else
{
sb.Append("mainCamera=").Append(cam.name).Append(" ");
sb.Append("mainCamera.farClip=").Append(cam.farClipPlane.ToString("F1")).Append(" ");
sb.Append("mainCamera.nearClip=").Append(cam.nearClipPlane.ToString("F3")).Append(" ");
sb.Append("mainCamera.cullingMask=0x").Append(cam.cullingMask.ToString("X")).Append(" ");
}
AppendXrState(sb);
}
private static void AppendXrState(StringBuilder sb)
{
try
{
Type xrSettingsType = Type.GetType("UnityEngine.XR.XRSettings, UnityEngine.XRModule");
if (xrSettingsType == null)
{
sb.Append("xrEnabled=<unavailable> ");
return;
}
var enabledProp = xrSettingsType.GetProperty("enabled", BindingFlags.Public | BindingFlags.Static);
bool xrEnabled = enabledProp != null && enabledProp.GetValue(null) is bool enabled && enabled;
sb.Append("xrEnabled=").Append(xrEnabled).Append(" ");
if (!xrEnabled)
return;
var stereoModeProp = xrSettingsType.GetProperty("stereoRenderingMode", BindingFlags.Public | BindingFlags.Static);
object stereoMode = stereoModeProp?.GetValue(null);
sb.Append("xrStereoMode=").Append(stereoMode != null ? stereoMode.ToString() : "<unknown>").Append(" ");
}
catch
{
sb.Append("xrEnabled=<error> ");
}
}
private static string ReadPrivateField(GeoTileAddressablesLoader loader, string fieldName, string fallback)
{
try
@@ -149,17 +208,15 @@ public sealed class RuntimeBootProbe : MonoBehaviour
{
case RuntimePlatform.Android:
return "Android";
case RuntimePlatform.IPhonePlayer:
return "iOS";
case RuntimePlatform.WindowsPlayer:
case RuntimePlatform.WindowsEditor:
return "Windows";
return "StandaloneWindows64";
case RuntimePlatform.OSXPlayer:
case RuntimePlatform.OSXEditor:
return "macOS";
return "StandaloneOSX";
case RuntimePlatform.LinuxPlayer:
case RuntimePlatform.LinuxEditor:
return "Linux";
return "StandaloneLinux64";
default:
return "Android";
}

View File

@@ -5,6 +5,7 @@ using System.IO;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.Rendering;
public class GeoTileAddressablesLoader : MonoBehaviour
{
@@ -89,6 +90,7 @@ public class GeoTileAddressablesLoader : MonoBehaviour
Debug.Log(
$"[GeoTileAddressablesLoader] Startup: platform={Application.platform}, " +
$"persistentDataPath={Application.persistentDataPath}, basePath={basePath}, manifestPath={manifestPath}");
LogRuntimeRenderState();
Log($"Initializing loader. BasePath={basePath}");
Log($"ManifestPath={manifestPath}");
@@ -462,7 +464,10 @@ public class GeoTileAddressablesLoader : MonoBehaviour
var terrain = instance.GetComponent<Terrain>();
if (terrain == null)
{
Debug.LogWarning($"[GeoTileAddressablesLoader] Tile {tileKey}: no Terrain component on instance.");
int rendererCount = instance.GetComponentsInChildren<Renderer>(true).Length;
Debug.LogWarning(
$"[GeoTileAddressablesLoader] Tile {tileKey}: no Terrain component on instance, " +
$"rendererCount={rendererCount}, rootPos={FormatVec3(instance.transform.position)}");
return;
}
@@ -484,10 +489,22 @@ public class GeoTileAddressablesLoader : MonoBehaviour
}
string materialName = terrain.materialTemplate != null ? terrain.materialTemplate.name : "<none>";
string shaderName = terrain.materialTemplate != null && terrain.materialTemplate.shader != null
? terrain.materialTemplate.shader.name
: "<none>";
bool shaderSupported = terrain.materialTemplate != null &&
terrain.materialTemplate.shader != null &&
terrain.materialTemplate.shader.isSupported;
Bounds localBounds = td.bounds;
Vector3 worldCenter = terrain.GetPosition() + localBounds.center;
Vector3 extents = localBounds.extents;
Debug.Log(
$"[GeoTileAddressablesLoader] Tile {tileKey}: terrain ok, " +
$"drawHeightmap={terrain.drawHeightmap}, layers={layerCount}, " +
$"hasDiffuse={hasDiffuse}, diffuse={diffuseName}, material={materialName}");
$"enabled={terrain.enabled}, drawHeightmap={terrain.drawHeightmap}, " +
$"layers={layerCount}, hasDiffuse={hasDiffuse}, diffuse={diffuseName}, " +
$"material={materialName}, shader={shaderName}, shaderSupported={shaderSupported}, " +
$"worldCenter={FormatVec3(worldCenter)}, extents={FormatVec3(extents)}, " +
$"rootPos={FormatVec3(instance.transform.position)}");
}
private void RemoveEmbeddedBuildings(GameObject tileInstance, string tileKey)
@@ -679,4 +696,24 @@ public class GeoTileAddressablesLoader : MonoBehaviour
if (verboseLogging)
Debug.Log($"[GeoTileAddressablesLoader] {message}");
}
private void LogRuntimeRenderState()
{
var rp = GraphicsSettings.currentRenderPipeline;
string rpName = rp != null ? $"{rp.name} ({rp.GetType().Name})" : "BuiltInRenderPipeline";
int qualityIndex = QualitySettings.GetQualityLevel();
string qualityName = qualityIndex >= 0 && qualityIndex < QualitySettings.names.Length
? QualitySettings.names[qualityIndex]
: "<unknown>";
string cameraName = Camera.main != null ? Camera.main.name : "<none>";
Debug.Log(
$"[GeoTileAddressablesLoader] RenderState: quality={qualityIndex}:{qualityName}, " +
$"renderPipeline={rpName}, mainCamera={cameraName}");
}
private static string FormatVec3(Vector3 v)
{
return $"({v.x:F2},{v.y:F2},{v.z:F2})";
}
}