| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- using UnityEngine;
- using System.Collections.Generic;
- [RequireComponent(typeof(LineRenderer))]
- public class ElectricArc : MonoBehaviour
- {
- [Header("Arc Points")]
- public Transform pointA;
- public Transform pointB;
- [Header("Arc Settings")]
- public int arcCount = 3;
- public int segmentCount = 20;
- public float arcAmplitude = 0.2f;
- public float arcUpdateRate = 0.05f;
- public float arcWidth = 0.05f;
- [Header("Flicker Settings")]
- public bool enableFlicker = true;
- public float flickerInterval = 0.1f;
- [Header("Color Gradient")]
- public Gradient arcColorGradient;
- public Material material;
- private List<LineRenderer> arcs = new List<LineRenderer>();
- private float updateTimer = 0f;
- private float flickerTimer = 0f;
- void Start()
- {
- for (int i = 0; i < arcCount; i++)
- {
- GameObject arcObj = new GameObject("Arc_" + i);
- arcObj.transform.parent = transform;
- LineRenderer lr = arcObj.AddComponent<LineRenderer>();
- lr.positionCount = segmentCount;
- lr.widthMultiplier = arcWidth;
- lr.material = material;
- lr.colorGradient = arcColorGradient;
- lr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
- lr.receiveShadows = false;
- lr.useWorldSpace = true;
- arcs.Add(lr);
- }
- }
- void Update()
- {
- updateTimer += Time.deltaTime;
- flickerTimer += Time.deltaTime;
- // 更新电弧形状
- if (updateTimer >= arcUpdateRate)
- {
- foreach (LineRenderer arc in arcs)
- {
- GenerateArc(arc);
- }
- updateTimer = 0f;
- }
- // 电弧闪烁
- if (enableFlicker && flickerTimer >= flickerInterval)
- {
- foreach (LineRenderer arc in arcs)
- {
- arc.enabled = Random.value > 0.3f; // 70% 概率可见
- }
- flickerTimer = 0f;
- }
- }
- void GenerateArc(LineRenderer lr)
- {
- Vector3 start = pointA.position;
- Vector3 end = pointB.position;
- Vector3 dir = (end - start).normalized;
- for (int i = 0; i < segmentCount; i++)
- {
- float t = (float)i / (segmentCount - 1);
- Vector3 point = Vector3.Lerp(start, end, t);
- // 在垂直于方向的平面上添加扰动
- Vector3 right = Vector3.Cross(dir, Vector3.up).normalized;
- Vector3 up = Vector3.Cross(right, dir).normalized;
- Vector3 randomOffset = right * Random.Range(-arcAmplitude, arcAmplitude) + up * Random.Range(-arcAmplitude, arcAmplitude);
- point += randomOffset;
- lr.SetPosition(i, point);
- }
- }
- }
|