FindInSceneProvider.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System.Linq;
  2. using UnityEngine;
  3. using Object = UnityEngine.Object;
  4. namespace LLM.Editor.Analysis
  5. {
  6. /// <summary>
  7. /// Provides a list of GameObjects found in the current scene based on a query.
  8. /// Supports searching by name, component type, or tag.
  9. /// </summary>
  10. public class FindInSceneProvider : IContextProvider
  11. {
  12. private class SceneQueryResult
  13. {
  14. public string name;
  15. public string id;
  16. }
  17. public object GetContext(Object target, string qualifier)
  18. {
  19. if (string.IsNullOrEmpty(qualifier))
  20. {
  21. return "Error: A query string (qualifier) is required for FindInScene (e.g., 'name: Player', 'component: Rigidbody', 'tag: Enemy').";
  22. }
  23. var gameObjects = Object.FindObjectsOfType<GameObject>();
  24. var queryParts = qualifier.Split(new[] { ':' }, 2);
  25. var queryType = queryParts[0].Trim().ToLower();
  26. var queryValue = queryParts.Length > 1 ? queryParts[1].Trim() : "";
  27. var results = gameObjects.AsQueryable();
  28. switch (queryType)
  29. {
  30. case "name":
  31. results = results.Where(go => go.name.ToLower().Contains(queryValue.ToLower()));
  32. break;
  33. case "component":
  34. results = results.Where(go => go.GetComponent(queryValue));
  35. break;
  36. case "tag":
  37. results = results.Where(go => go.CompareTag(queryValue));
  38. break;
  39. case "layer":
  40. results = results.Where(go => go.layer == LayerMask.NameToLayer(queryValue));
  41. break;
  42. default:
  43. return $"Error: Invalid query type '{queryType}'. Use 'name', 'component', or 'tag'.";
  44. }
  45. // Return a structured result with name and instance ID for each found object.
  46. return results.Select(go => new SceneQueryResult { name = go.name, id = go.GetInstanceID().ToString() }).ToList();
  47. }
  48. }
  49. }