using System.Linq; using UnityEngine; using Object = UnityEngine.Object; namespace LLM.Editor.Analysis { /// /// Provides a list of GameObjects found in the current scene based on a query. /// Supports searching by name, component type, or tag. /// public class FindInSceneProvider : IContextProvider { private class SceneQueryResult { public string name; public string id; } public object GetContext(Object target, string qualifier) { if (string.IsNullOrEmpty(qualifier)) { return "Error: A query string (qualifier) is required for FindInScene (e.g., 'name: Player', 'component: Rigidbody', 'tag: Enemy')."; } var gameObjects = Object.FindObjectsOfType(); var queryParts = qualifier.Split(new[] { ':' }, 2); var queryType = queryParts[0].Trim().ToLower(); var queryValue = queryParts.Length > 1 ? queryParts[1].Trim() : ""; var results = gameObjects.AsQueryable(); switch (queryType) { case "name": results = results.Where(go => go.name.ToLower().Contains(queryValue.ToLower())); break; case "component": results = results.Where(go => go.GetComponent(queryValue)); break; case "tag": results = results.Where(go => go.CompareTag(queryValue)); break; case "layer": results = results.Where(go => go.layer == LayerMask.NameToLayer(queryValue)); break; default: return $"Error: Invalid query type '{queryType}'. Use 'name', 'component', or 'tag'."; } // Return a structured result with name and instance ID for each found object. return results.Select(go => new SceneQueryResult { name = go.name, id = go.GetInstanceID().ToString() }).ToList(); } } }