using UnityEngine;
///
/// Câble d'alimentation C13/C14 visible entre une prise PDU et un port équipement.
/// Utilise un LineRenderer avec courbe de Bézier, comme CableRJ45.
/// Câble noir par défaut (contrairement aux câbles réseau colorés).
///
[RequireComponent(typeof(LineRenderer))]
public class CableAlimentation : MonoBehaviour
{
[Header("Connexions")]
public PriseC13 prisePDU; // Côté PDU
public PortAlimentation portEquipement; // Côté équipement
[Header("Visuel")]
public Color couleurCable = new Color(0.05f, 0.05f, 0.05f, 1f); // Noir
public float epaisseur = 0.006f; // Plus épais que le RJ45
public int pointsCourbe = 20;
[Header("Courbe")]
[Tooltip("Facteur de courbure vers le bas (gravité visuelle)")]
public float courbure = 0.3f;
// Privé
private LineRenderer _lineRenderer;
void Awake()
{
// Cote dedicated server : pas de LineRenderer (Shader.Find retourne null
// et casserait le composant). Le cable existe logiquement pour la connexion
// electrique, mais pas visuellement.
if (DedicatedServerMode.IsDedicatedServer)
return;
_lineRenderer = GetComponent();
ConfigurerLineRenderer();
}
void Update()
{
// Cote dedicated server : pas de visuel a mettre a jour
if (DedicatedServerMode.IsDedicatedServer)
return;
// Met à jour la courbe en temps réel (les équipements peuvent bouger)
if (prisePDU != null && portEquipement != null)
{
DessinerCable(prisePDU.transform.position, portEquipement.transform.position);
}
}
///
/// Configure le LineRenderer pour ressembler à un câble d'alimentation.
///
private void ConfigurerLineRenderer()
{
_lineRenderer.positionCount = pointsCourbe;
_lineRenderer.startWidth = epaisseur;
_lineRenderer.endWidth = epaisseur;
_lineRenderer.useWorldSpace = true;
_lineRenderer.numCapVertices = 4;
_lineRenderer.numCornerVertices = 4;
// Material noir
_lineRenderer.material = new Material(Shader.Find("Sprites/Default"));
_lineRenderer.startColor = couleurCable;
_lineRenderer.endColor = couleurCable;
// Shadows
_lineRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
_lineRenderer.receiveShadows = false;
}
///
/// Dessine le câble en courbe de Bézier entre deux points.
///
public void DessinerCable(Vector3 debut, Vector3 fin)
{
if (_lineRenderer == null) return;
_lineRenderer.positionCount = pointsCourbe;
// Point de contrôle au milieu avec courbure vers le bas
float distance = Vector3.Distance(debut, fin);
Vector3 milieu = (debut + fin) / 2f;
milieu.y -= distance * courbure; // Effet de gravité
for (int i = 0; i < pointsCourbe; i++)
{
float t = (float)i / (pointsCourbe - 1);
Vector3 point = CalculerBezierQuadratique(debut, milieu, fin, t);
_lineRenderer.SetPosition(i, point);
}
}
///
/// Courbe de Bézier quadratique.
///
private Vector3 CalculerBezierQuadratique(Vector3 p0, Vector3 p1, Vector3 p2, float t)
{
float u = 1f - t;
return u * u * p0 + 2f * u * t * p1 + t * t * p2;
}
///
/// Initialise le câble avec ses deux extrémités.
///
public void Initialiser(PriseC13 prise, PortAlimentation port)
{
prisePDU = prise;
portEquipement = port;
// Nomme le câble
gameObject.name = $"CableAlim_{prise.pduParent.name}_P{prise.indexPrise}_vers_{port.nomPort}";
// Réapplique la couleur (peut avoir été modifiée avant Initialiser)
if (_lineRenderer != null)
{
_lineRenderer.startColor = couleurCable;
_lineRenderer.endColor = couleurCable;
}
// Cote serveur : pas de dessin, juste les refs logiques
if (DedicatedServerMode.IsDedicatedServer)
return;
DessinerCable(prise.transform.position, port.transform.position);
}
///
/// Supprime le câble et déconnecte les deux extrémités.
///
public void Supprimer()
{
if (prisePDU != null)
{
prisePDU.Deconnecter();
}
if (portEquipement != null)
{
portEquipement.Deconnecter();
}
Destroy(gameObject);
}
}