146 lines
4.7 KiB
C#
146 lines
4.7 KiB
C#
using UnityEngine;
|
|
|
|
/// <summary>
|
|
/// 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).
|
|
/// </summary>
|
|
[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<LineRenderer>();
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Configure le LineRenderer pour ressembler à un câble d'alimentation.
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Dessine le câble en courbe de Bézier entre deux points.
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Courbe de Bézier quadratique.
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initialise le câble avec ses deux extrémités.
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Supprime le câble et déconnecte les deux extrémités.
|
|
/// </summary>
|
|
public void Supprimer()
|
|
{
|
|
if (prisePDU != null)
|
|
{
|
|
prisePDU.Deconnecter();
|
|
}
|
|
if (portEquipement != null)
|
|
{
|
|
portEquipement.Deconnecter();
|
|
}
|
|
|
|
Destroy(gameObject);
|
|
}
|
|
} |