94 lines
4.0 KiB
C#
94 lines
4.0 KiB
C#
using UnityEngine;
|
||
|
||
/// <summary>
|
||
/// TEMPORAIRE - Debug pour diagnostiquer le problème de chute sous la map.
|
||
/// Ajouter sur le prefab PlayerCapsule, supprimer après diagnostic.
|
||
/// </summary>
|
||
public class DebugFalling : MonoBehaviour, IClientOnly
|
||
{
|
||
private CharacterController _cc;
|
||
private StarterAssets.FirstPersonController _fpc;
|
||
private float _lastLogTime = 0f;
|
||
private float _lastY;
|
||
private bool _wasFalling = false;
|
||
|
||
void Start()
|
||
{
|
||
_cc = GetComponent<CharacterController>();
|
||
_fpc = GetComponent<StarterAssets.FirstPersonController>();
|
||
_lastY = transform.position.y;
|
||
|
||
if (_cc != null)
|
||
{
|
||
Debug.Log($"[DebugFall] CharacterController: center={_cc.center} height={_cc.height} radius={_cc.radius} skinWidth={_cc.skinWidth}");
|
||
Debug.Log($"[DebugFall] Layer joueur: {gameObject.layer} ({LayerMask.LayerToName(gameObject.layer)})");
|
||
}
|
||
|
||
if (_fpc != null)
|
||
{
|
||
Debug.Log($"[DebugFall] FPC enabled={_fpc.enabled} GroundLayers={_fpc.GroundLayers.value} GroundedOffset={_fpc.GroundedOffset} GroundedRadius={_fpc.GroundedRadius}");
|
||
}
|
||
|
||
// Test : y a-t-il un sol sous nous ?
|
||
RaycastHit hit;
|
||
if (Physics.Raycast(transform.position + Vector3.up * 0.5f, Vector3.down, out hit, 50f))
|
||
Debug.Log($"[DebugFall] Sol détecté: {hit.collider.gameObject.name} layer={LayerMask.LayerToName(hit.collider.gameObject.layer)} distance={hit.distance:F2} point={hit.point}");
|
||
else
|
||
Debug.Log("[DebugFall] AUCUN SOL DÉTECTÉ sous le joueur !");
|
||
|
||
// Test GroundLayers
|
||
if (_fpc != null)
|
||
{
|
||
int solLayer = LayerMask.NameToLayer("Sol");
|
||
bool solInclus = (_fpc.GroundLayers.value & (1 << solLayer)) != 0;
|
||
Debug.Log($"[DebugFall] Layer Sol ({solLayer}) inclus dans GroundLayers: {solInclus}");
|
||
|
||
// Test CheckSphere comme le fait le FPC
|
||
Vector3 spherePos = new Vector3(transform.position.x, transform.position.y - _fpc.GroundedOffset, transform.position.z);
|
||
bool grounded = Physics.CheckSphere(spherePos, _fpc.GroundedRadius, _fpc.GroundLayers, QueryTriggerInteraction.Ignore);
|
||
Debug.Log($"[DebugFall] CheckSphere grounded={grounded} spherePos={spherePos} radius={_fpc.GroundedRadius}");
|
||
}
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
if (_fpc == null || _cc == null) return;
|
||
|
||
float y = transform.position.y;
|
||
bool falling = y < _lastY - 0.01f;
|
||
|
||
// Log quand on commence à tomber
|
||
if (falling && !_wasFalling)
|
||
{
|
||
Debug.LogWarning($"[DebugFall] DÉBUT CHUTE à Y={y:F2} pos={transform.position} Grounded={_fpc.Grounded} FPC.enabled={_fpc.enabled} CC.enabled={_cc.enabled} CC.isGrounded={_cc.isGrounded}");
|
||
|
||
// Vérifier ce qu'il y a sous nous
|
||
RaycastHit hit;
|
||
if (Physics.Raycast(transform.position, Vector3.down, out hit, 50f))
|
||
Debug.LogWarning($"[DebugFall] Sous nous: {hit.collider.gameObject.name} layer={LayerMask.LayerToName(hit.collider.gameObject.layer)} dist={hit.distance:F2}");
|
||
else
|
||
Debug.LogWarning("[DebugFall] RIEN sous le joueur !");
|
||
}
|
||
|
||
// Log continu pendant la chute (1x par seconde)
|
||
if (falling && Time.time - _lastLogTime > 1f)
|
||
{
|
||
_lastLogTime = Time.time;
|
||
Debug.LogWarning($"[DebugFall] EN CHUTE Y={y:F2} velocity.y={_cc.velocity.y:F2} Grounded={_fpc.Grounded} CC.isGrounded={_cc.isGrounded}");
|
||
}
|
||
|
||
// Log quand on tombe trop bas
|
||
if (y < -5f && Time.time - _lastLogTime > 2f)
|
||
{
|
||
_lastLogTime = Time.time;
|
||
Debug.LogError($"[DebugFall] SOUS LA MAP Y={y:F2} téléportation de secours !");
|
||
// Téléporter au spawn de secours
|
||
_cc.enabled = false;
|
||
transform.position = new Vector3(0, 2, 0);
|
||
_cc.enabled = true;
|
||
}
|
||
|
||
_wasFalling = falling;
|
||
_lastY = y;
|
||
}
|
||
} |