GameSetup.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using UnityEngine;
  2. public class GameSetup : MonoBehaviour
  3. {
  4. [Header("Auto Setup")]
  5. [SerializeField] private bool setupOnAwake = true;
  6. [SerializeField] private bool createLayersIfMissing = true;
  7. void Awake()
  8. {
  9. if (setupOnAwake)
  10. {
  11. SetupPhysicsLayers();
  12. AssignLayers();
  13. }
  14. }
  15. void SetupPhysicsLayers()
  16. {
  17. // Layer 6 = Player
  18. // Layer 7 = Puck
  19. // Layer 8 = Rink
  20. // Puck passes through players (we'll add interception logic separately)
  21. Physics.IgnoreLayerCollision(6, 7, true); // Player <-> Puck = ignore collision
  22. // Players still collide with each other
  23. Physics.IgnoreLayerCollision(6, 6, false); // Player <-> Player = collide
  24. // Players collide with rink
  25. Physics.IgnoreLayerCollision(6, 8, false); // Player <-> Rink = collide
  26. // Puck collides with rink
  27. Physics.IgnoreLayerCollision(7, 8, false); // Puck <-> Rink = collide
  28. Debug.Log("✓ Physics layers configured: Puck will pass through players");
  29. }
  30. void AssignLayers()
  31. {
  32. int playerLayer = LayerMask.NameToLayer("Player");
  33. int puckLayer = LayerMask.NameToLayer("Puck");
  34. int rinkLayer = LayerMask.NameToLayer("Rink");
  35. // Check if layers exist
  36. if (playerLayer == -1 || puckLayer == -1 || rinkLayer == -1)
  37. {
  38. Debug.LogWarning("⚠ Layers not found! Please create them manually:");
  39. Debug.LogWarning("Edit → Project Settings → Tags and Layers");
  40. Debug.LogWarning("Set Layer 6 = 'Player', Layer 7 = 'Puck', Layer 8 = 'Rink'");
  41. return;
  42. }
  43. // Assign all players to Player layer (6)
  44. PlayerController[] players = FindObjectsByType<PlayerController>(FindObjectsSortMode.None);
  45. foreach (var player in players)
  46. {
  47. SetLayerRecursively(player.gameObject, playerLayer);
  48. }
  49. Debug.Log($"✓ Assigned {players.Length} players to Player layer");
  50. // Assign puck to Puck layer (7)
  51. PuckController puck = FindFirstObjectByType<PuckController>();
  52. if (puck != null)
  53. {
  54. SetLayerRecursively(puck.gameObject, puckLayer);
  55. Debug.Log("✓ Assigned Puck to Puck layer");
  56. }
  57. // Find rink objects (anything with "Rink", "Ice", "Board" in name)
  58. GameObject[] allObjects = FindObjectsByType<GameObject>(FindObjectsSortMode.None);
  59. int rinkCount = 0;
  60. foreach (var obj in allObjects)
  61. {
  62. string nameLower = obj.name.ToLower();
  63. if (nameLower.Contains("rink") || nameLower.Contains("ice") ||
  64. nameLower.Contains("board") || nameLower.Contains("surface"))
  65. {
  66. SetLayerRecursively(obj, rinkLayer);
  67. rinkCount++;
  68. }
  69. }
  70. Debug.Log($"✓ Assigned {rinkCount} rink objects to Rink layer");
  71. }
  72. void SetLayerRecursively(GameObject obj, int layer)
  73. {
  74. obj.layer = layer;
  75. foreach (Transform child in obj.transform)
  76. {
  77. SetLayerRecursively(child.gameObject, layer);
  78. }
  79. }
  80. [ContextMenu("Setup Now")]
  81. public void SetupNow()
  82. {
  83. SetupPhysicsLayers();
  84. AssignLayers();
  85. }
  86. }