using UnityEngine;
using System.Collections;
///
/// Example integration of the faceoff system with your main game loop
/// This shows how to use all the components together
///
public class GameFlowExample : MonoBehaviour
{
[Header("References")]
[SerializeField] private FaceoffManager faceoffManager;
[SerializeField] private FaceoffPositioning faceoffPositioning;
[SerializeField] private PuckController puck;
[Header("Game State")]
[SerializeField] private int homeScore = 0;
[SerializeField] private int awayScore = 0;
[SerializeField] private float periodLength = 1200f; // 20 minutes in seconds
private float periodTimer = 0f;
private int currentPeriod = 1;
private bool gameActive = false;
void Start()
{
// Find components if not assigned
if (faceoffManager == null)
faceoffManager = FindObjectOfType();
if (faceoffPositioning == null)
faceoffPositioning = FindObjectOfType();
if (puck == null)
puck = FindObjectOfType();
StartNewGame();
}
void Update()
{
if (gameActive)
{
periodTimer += Time.deltaTime;
if (periodTimer >= periodLength)
{
EndPeriod();
}
CheckForGoal();
}
// Debug controls
if (Input.GetKeyDown(KeyCode.G))
{
SimulateGoal(true); // Home team scores
}
}
public void StartNewGame()
{
Debug.Log("=== NEW GAME STARTING ===");
homeScore = 0;
awayScore = 0;
currentPeriod = 1;
periodTimer = 0f;
StartCoroutine(GameStartSequence());
}
IEnumerator GameStartSequence()
{
// Position players for opening faceoff
faceoffPositioning.PositionPlayersForFaceoff(FaceoffPositioning.FaceoffLocation.CenterIce);
yield return new WaitForSeconds(2f);
// Start the game with a faceoff
faceoffManager.StartFaceoff();
yield return new WaitForSeconds(3f);
gameActive = true;
Debug.Log("Game is now active!");
}
void CheckForGoal()
{
// This is simplified - you'd check if puck crossed goal line
// For example purposes only
if (puck != null)
{
Vector3 puckPos = puck.transform.position;
// Example: Check if puck is past goal line (adjust coordinates for your rink)
if (puckPos.z > 28f) // Away team's goal
{
SimulateGoal(true); // Home scores
}
else if (puckPos.z < -28f) // Home team's goal
{
SimulateGoal(false); // Away scores
}
}
}
void SimulateGoal(bool homeTeamScored)
{
if (!gameActive) return;
gameActive = false; // Pause game during celebration
if (homeTeamScored)
{
homeScore++;
Debug.Log($"🚨 HOME TEAM SCORES! Score: {homeScore} - {awayScore}");
}
else
{
awayScore++;
Debug.Log($"🚨 AWAY TEAM SCORES! Score: {homeScore} - {awayScore}");
}
StartCoroutine(GoalSequence());
}
IEnumerator GoalSequence()
{
// Goal celebration
Debug.Log("Goal scored! Celebrating...");
yield return new WaitForSeconds(3f);
// Return to center ice
Debug.Log("Returning to center ice...");
faceoffPositioning.PositionPlayersForFaceoff(FaceoffPositioning.FaceoffLocation.CenterIce);
yield return new WaitForSeconds(2f);
// Faceoff after goal
faceoffManager.StartFaceoff();
yield return new WaitForSeconds(3f);
// Resume game
gameActive = true;
Debug.Log("Game resumed!");
}
void EndPeriod()
{
gameActive = false;
currentPeriod++;
Debug.Log($"=== END OF PERIOD {currentPeriod - 1} ===");
Debug.Log($"Score: {homeScore} - {awayScore}");
if (currentPeriod <= 3)
{
StartCoroutine(IntermissionSequence());
}
else
{
EndGame();
}
}
IEnumerator IntermissionSequence()
{
Debug.Log("Intermission...");
yield return new WaitForSeconds(5f);
periodTimer = 0f;
StartCoroutine(GameStartSequence()); // Start next period
}
void EndGame()
{
Debug.Log("=== GAME OVER ===");
Debug.Log($"Final Score: {homeScore} - {awayScore}");
if (homeScore > awayScore)
{
Debug.Log("HOME TEAM WINS! 🏆");
}
else if (awayScore > homeScore)
{
Debug.Log("AWAY TEAM WINS! 🏆");
}
else
{
Debug.Log("TIE GAME - Going to Overtime!");
// You could implement overtime here
}
}
// Example: AI uses puck information to make decisions
public void ExampleAIDecisionMaking(PlayerController player)
{
if (player == null) return;
// Check puck state
if (puck.IsLoose)
{
// Puck is free - go get it!
Vector3 toPuck = puck.transform.position - player.transform.position;
// player.MoveTo(puck.transform.position);
Debug.Log($"{player.stats.playerName}: Chasing loose puck!");
}
else if (player.HasPuck())
{
// I have the puck - decide what to do
PlayerController openTeammate = FindOpenTeammate(player);
if (openTeammate != null && IsGoodPassOpportunity(player, openTeammate))
{
player.Pass(openTeammate);
Debug.Log($"{player.stats.playerName}: Passing to {openTeammate.stats.playerName}");
}
else if (IsGoodShootingPosition(player))
{
Vector3 goalDirection = GetGoalDirection(player);
player.Shoot(goalDirection, 1.0f);
Debug.Log($"{player.stats.playerName}: Taking a shot!");
}
else
{
// Skate with puck
Debug.Log($"{player.stats.playerName}: Carrying puck...");
}
}
else if (puck.CurrentCarrier != null)
{
// Someone else has it
if (IsOpponent(player, puck.CurrentCarrier))
{
// Opponent has puck - apply pressure
float distance = Vector3.Distance(player.transform.position, puck.CurrentCarrier.transform.position);
if (distance < 2f)
{
player.Check(puck.CurrentCarrier);
Debug.Log($"{player.stats.playerName}: Checking {puck.CurrentCarrier.stats.playerName}!");
}
else
{
// Chase the carrier
Debug.Log($"{player.stats.playerName}: Pressuring opponent!");
}
}
else
{
// Teammate has puck - position for support
Debug.Log($"{player.stats.playerName}: Supporting teammate!");
}
}
}
// Helper methods (implement based on your game)
private PlayerController FindOpenTeammate(PlayerController player)
{
// Find best open teammate for passing
// This is simplified - you'd check actual positioning
PlayerController[] allPlayers = FindObjectsOfType();
foreach (var candidate in allPlayers)
{
if (candidate != player && !IsOpponent(player, candidate))
{
// Check if they're open (not too close to opponents, etc.)
return candidate;
}
}
return null;
}
private bool IsGoodPassOpportunity(PlayerController passer, PlayerController receiver)
{
// Check if pass lane is clear
float distance = Vector3.Distance(passer.transform.position, receiver.transform.position);
return distance > 3f && distance < 20f;
}
private bool IsGoodShootingPosition(PlayerController player)
{
// Check if player is in good position to shoot
Vector3 goalDirection = GetGoalDirection(player);
float distanceToGoal = goalDirection.magnitude;
return distanceToGoal < 15f; // Within shooting range
}
private Vector3 GetGoalDirection(PlayerController player)
{
// Determine which goal to shoot at based on team
bool isHomeTeam = player.CompareTag("HomeTeam");
Vector3 goalPosition = isHomeTeam ? new Vector3(0, 0, 30f) : new Vector3(0, 0, -30f);
return goalPosition - player.transform.position;
}
private bool IsOpponent(PlayerController player1, PlayerController player2)
{
// Check if two players are on different teams
return player1.CompareTag("HomeTeam") != player2.CompareTag("HomeTeam");
}
// GUI for testing
void OnGUI()
{
GUILayout.BeginArea(new Rect(Screen.width - 310, 10, 300, 200));
GUILayout.BeginVertical("box");
GUILayout.Label($"GAME STATE", new GUIStyle(GUI.skin.label) { richText = true, fontSize = 16 });
GUILayout.Label($"Period: {currentPeriod}");
GUILayout.Label($"Time: {Mathf.FloorToInt(periodTimer / 60):00}:{Mathf.FloorToInt(periodTimer % 60):00}");
GUILayout.Label($"Score: {homeScore} - {awayScore}");
GUILayout.Label($"Game Active: {gameActive}");
GUILayout.Space(10);
if (GUILayout.Button("Simulate Home Goal (G)"))
{
SimulateGoal(true);
}
if (GUILayout.Button("Simulate Away Goal"))
{
SimulateGoal(false);
}
if (GUILayout.Button("Reset Game"))
{
StartNewGame();
}
GUILayout.EndVertical();
GUILayout.EndArea();
}
}