private IEnumerator LoadPlayerPositionCoroutine()
{
// Wait one frame to ensure level generation (e.g., Entrance placement) is complete
yield return null;
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
string posXKey = "PlayerPosX_Scene" + currentSceneIndex;
Vector3 targetPos;
if (PlayerPrefs.HasKey(posXKey))
{
float x = PlayerPrefs.GetFloat(posXKey);
float y = PlayerPrefs.GetFloat("PlayerPosY_Scene" + currentSceneIndex);
float z = PlayerPrefs.GetFloat("PlayerPosZ_Scene" + currentSceneIndex);
targetPos = new Vector3(x, y, z);
Debug.Log($"Loaded saved position for scene {currentSceneIndex}: {targetPos}");
}
else
{
Debug.Log("No Saved Position—defaulting based on entry direction.");
string defaultObjectName = GlobalStats.goingUp ? "Exit" : "Entrance"; // Use Exit if returning
GameObject defaultSpawn = GameObject.Find(defaultObjectName);
if (defaultSpawn != null)
{
targetPos = defaultSpawn.transform.position;
Debug.Log($"Spawned at {defaultObjectName}: {targetPos}");
}
else
{
Debug.LogWarning($"{defaultObjectName} not found—using world origin (0,0,0) as fallback.");
targetPos = Vector3.zero; // Explicit fallback
}
}
// Apply position with controller handling
var controller = GetComponent<CharacterController>();
if (controller != null)
{
controller.enabled = false; // Disable to allow direct set without physics interference
}
if (fpController != null)
{
fpController.enabled = false;
}
transform.position = targetPos;
// NEW: Force physics sync and wait an extra frame for any overrides
Physics.SyncTransforms();
yield return new WaitForEndOfFrame(); // Wait for end of frame to apply changes
if (controller != null)
{
controller.enabled = true; // Re-enable
}
if (fpController != null)
{
fpController.enabled = true;
}
yield return null; // Wait another frame
Debug.Log($"Final player position after set: {transform.position} (if different, check for overrides)");
}