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); } }