ElectricArc.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. [RequireComponent(typeof(LineRenderer))]
  4. public class ElectricArc : MonoBehaviour
  5. {
  6. [Header("Arc Points")]
  7. public Transform pointA;
  8. public Transform pointB;
  9. [Header("Arc Settings")]
  10. public int arcCount = 3;
  11. public int segmentCount = 20;
  12. public float arcAmplitude = 0.2f;
  13. public float arcUpdateRate = 0.05f;
  14. public float arcWidth = 0.05f;
  15. [Header("Flicker Settings")]
  16. public bool enableFlicker = true;
  17. public float flickerInterval = 0.1f;
  18. [Header("Color Gradient")]
  19. public Gradient arcColorGradient;
  20. public Material material;
  21. private List<LineRenderer> arcs = new List<LineRenderer>();
  22. private float updateTimer = 0f;
  23. private float flickerTimer = 0f;
  24. void Start()
  25. {
  26. for (int i = 0; i < arcCount; i++)
  27. {
  28. GameObject arcObj = new GameObject("Arc_" + i);
  29. arcObj.transform.parent = transform;
  30. LineRenderer lr = arcObj.AddComponent<LineRenderer>();
  31. lr.positionCount = segmentCount;
  32. lr.widthMultiplier = arcWidth;
  33. lr.material = material;
  34. lr.colorGradient = arcColorGradient;
  35. lr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
  36. lr.receiveShadows = false;
  37. lr.useWorldSpace = true;
  38. arcs.Add(lr);
  39. }
  40. }
  41. void Update()
  42. {
  43. updateTimer += Time.deltaTime;
  44. flickerTimer += Time.deltaTime;
  45. // 更新电弧形状
  46. if (updateTimer >= arcUpdateRate)
  47. {
  48. foreach (LineRenderer arc in arcs)
  49. {
  50. GenerateArc(arc);
  51. }
  52. updateTimer = 0f;
  53. }
  54. // 电弧闪烁
  55. if (enableFlicker && flickerTimer >= flickerInterval)
  56. {
  57. foreach (LineRenderer arc in arcs)
  58. {
  59. arc.enabled = Random.value > 0.3f; // 70% 概率可见
  60. }
  61. flickerTimer = 0f;
  62. }
  63. }
  64. void GenerateArc(LineRenderer lr)
  65. {
  66. Vector3 start = pointA.position;
  67. Vector3 end = pointB.position;
  68. Vector3 dir = (end - start).normalized;
  69. for (int i = 0; i < segmentCount; i++)
  70. {
  71. float t = (float)i / (segmentCount - 1);
  72. Vector3 point = Vector3.Lerp(start, end, t);
  73. // 在垂直于方向的平面上添加扰动
  74. Vector3 right = Vector3.Cross(dir, Vector3.up).normalized;
  75. Vector3 up = Vector3.Cross(right, dir).normalized;
  76. Vector3 randomOffset = right * Random.Range(-arcAmplitude, arcAmplitude) + up * Random.Range(-arcAmplitude, arcAmplitude);
  77. point += randomOffset;
  78. lr.SetPosition(i, point);
  79. }
  80. }
  81. }