From e46b26c1d79203d8244581c7a0b4550066f58879 Mon Sep 17 00:00:00 2001 From: MrMaho Date: Fri, 23 Oct 2026 21:16:37 +0200 Subject: [PATCH] Show Bolt Size 1.0.4: find the wrench 'Check' FSM among inactive objects too, log wrench size, bolt scale, mesh size and all FSM numbers for diagnosis Co-Authored-By: Claude Opus 5.5 --- examples/ShowBoltSize/ShowBoltSize.cs | 74 ++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/examples/ShowBoltSize/ShowBoltSize.cs b/examples/ShowBoltSize/ShowBoltSize.cs index e57d3cc..19ed5fa 100644 --- a/examples/ShowBoltSize/ShowBoltSize.cs +++ b/examples/ShowBoltSize/ShowBoltSize.cs @@ -7,9 +7,9 @@ using UnityEngine; [assembly: AssemblyTitle("Show Bolt Size")] [assembly: AssemblyProduct("Show Bolt Size")] [assembly: AssemblyDescription("Shows the size of the bolt you look at, so you pick the right wrench.")] -[assembly: AssemblyVersion("1.0.3.0")] -[assembly: AssemblyFileVersion("1.0.3.0")] -[assembly: AssemblyInformationalVersion("1.0.3")] +[assembly: AssemblyVersion("1.0.4.0")] +[assembly: AssemblyFileVersion("1.0.4.0")] +[assembly: AssemblyInformationalVersion("1.0.4")] namespace ShowBoltSize { @@ -22,7 +22,7 @@ namespace ShowBoltSize { public override string ID { get { return "showboltsize"; } } public override string Name { get { return "Show Bolt Size"; } } - public override string Version { get { return "1.0.3"; } } + public override string Version { get { return "1.0.4"; } } public override string Author { get { return "MBM"; } } const float MaxDistance = 1.5f; @@ -126,14 +126,18 @@ namespace ShowBoltSize { if (toolCheck == null) { - Transform raycast = cam.transform.Find("2Spanner/Raycast"); - if (raycast == null) return 0f; - foreach (PlayMakerFSM f in raycast.GetComponents()) - if (f.FsmName == "Check") { toolCheck = f; break; } - if (toolCheck == null) return 0f; + // Werkzeug-FSM suchen - auch inaktive Objekte (ohne Werkzeug in der Hand ist sie aus), höchstens alle 5 s + if (Time.realtimeSinceStartup < nextToolSearch) return 0f; + nextToolSearch = Time.realtimeSinceStartup + 5f; + toolCheck = FindToolCheck(cam); + if (toolCheck == null) + { + if (!toolMissingLogged) { toolMissingLogged = true; Log("tool FSM (Spanner/Raycast 'Check') not found yet"); } + return 0f; + } toolSize = toolCheck.FsmVariables.FindFsmFloat("BoltSize"); toolSizeI = toolCheck.FsmVariables.FindFsmInt("BoltSize"); - Log("tool found: " + toolCheck.name + "/" + toolCheck.FsmName + (toolSize != null ? " with float BoltSize" : toolSizeI != null ? " with int BoltSize" : " without BoltSize")); + Log("tool found: " + PathOf(toolCheck.transform) + " / " + toolCheck.FsmName + (toolSize != null ? " with float BoltSize" : toolSizeI != null ? " with int BoltSize" : " without BoltSize")); } if (!toolCheck.gameObject.activeInHierarchy || !toolCheck.enabled) return 0f; if (!dumped) @@ -142,7 +146,7 @@ namespace ShowBoltSize else if (Time.realtimeSinceStartup >= dumpAt) { dumped = true; - try { Log("tool dump: " + FsmDump.Write("2spanner#0|raycast#0")); } + try { Log("tool dump: " + FsmDump.Write("spanner#0|raycast")); } catch (System.Exception e) { Log("tool dump failed: " + e.Message); } } } @@ -151,18 +155,62 @@ namespace ShowBoltSize { lastToolSize = value; toolLogs++; - Log("tool BoltSize=" + value + " (state " + toolCheck.ActiveStateName + ")"); + FsmFloat wrench = FsmVariables.GlobalVariables.FindFsmFloat("ToolWrenchSize"); + Log("tool BoltSize=" + value + " (state " + toolCheck.ActiveStateName + ", wrench size " + (wrench != null ? wrench.Value.ToString() : "?") + ")"); } return value; } + float nextToolSearch; + bool toolMissingLogged; + + /// "Check"-FSM unter ...Spanner/Raycast (Schraubenschlüssel/Ratsche des Spielers), auch wenn sie gerade aus ist. + static PlayMakerFSM FindToolCheck(Camera cam) + { + Transform raycast = cam.transform.Find("2Spanner/Raycast"); + if (raycast != null) + foreach (PlayMakerFSM f in raycast.GetComponents()) + if (f.FsmName == "Check") return f; + foreach (PlayMakerFSM f in Resources.FindObjectsOfTypeAll()) + { + if (f == null || f.FsmName != "Check" || f.gameObject.hideFlags != HideFlags.None) continue; + Transform t = f.transform; + if (t.name == "Raycast" && t.parent != null && t.parent.name.IndexOf("Spanner", System.StringComparison.OrdinalIgnoreCase) >= 0) return f; + } + return null; + } + + static string PathOf(Transform t) + { + string path = t.name; + for (Transform p = t.parent; p != null; p = p.parent) path = p.name + "/" + path; + return path; + } + + /// Alle Zahlen-Variablen der FSMs auf der Schraube und darunter (wo steckt die Größe?). + static string Numbers(Transform t) + { + var sb = new System.Text.StringBuilder(); + foreach (PlayMakerFSM f in t.GetComponentsInChildren(true)) + { + sb.Append(" [").Append(f.name).Append('/').Append(f.FsmName); + foreach (FsmFloat v in f.FsmVariables.FloatVariables) sb.Append(' ').Append(v.Name).Append('=').Append(v.Value.ToString("0.###")); + foreach (FsmInt v in f.FsmVariables.IntVariables) sb.Append(' ').Append(v.Name).Append('=').Append(v.Value); + sb.Append(']'); + } + return sb.ToString(); + } + static string Info(Bolt b, Vector3 eyePos, Vector3 forward) { Vector3 to = Center(b) - eyePos; float raw = b.SizeF != null ? b.SizeF.Value : (b.SizeI != null ? b.SizeI.Value : -1); return b.Transform.name + " under " + (b.Transform.parent != null ? b.Transform.parent.name : "-") + ", distance " + Vector3.Dot(to, forward).ToString("0.00") + " m, off the line " + (Vector3.Cross(forward, to).magnitude * 100f).ToString("0") + " cm" - + ", angle " + Vector3.Angle(forward, to).ToString("0.0") + "°, BoltSize=" + raw + (b.Renderer != null ? "" : " (no renderer)"); + + ", angle " + Vector3.Angle(forward, to).ToString("0.0") + "°, BoltSize=" + raw + (b.Renderer != null ? "" : " (no renderer)") + + ", scale " + b.Transform.localScale.ToString("0.###") + " / world " + b.Transform.lossyScale.ToString("0.###") + + (b.Renderer != null ? ", mesh size " + (b.Renderer.bounds.size * 1000f).ToString("0") + " mm" : "") + + ", FSMs:" + Numbers(b.Transform); } ///