Unity 2021+ 实战:用LineRenderer和贝塞尔曲线,5分钟搞定GitHub地球同款动态射线
Unity 2021 实战5分钟实现GitHub地球动态射线特效在游戏和交互式应用中动态射线效果总能带来强烈的视觉冲击力。GitHub官网那个环绕地球的科技感射线相信让不少开发者眼前一亮。今天我们就用Unity的LineRenderer配合贝塞尔曲线快速实现这个效果。无需复杂数学基础跟着步骤操作5分钟就能看到成果。1. 环境准备与基础设置1.1 创建Unity项目打开Unity Hub选择2021或更高版本创建新项目项目名称EarthRayDemo模板3D (URP)推荐使用URP模板以获得更好的渲染效果// 验证Unity版本 #if !UNITY_2021_OR_NEWER Debug.LogError(请使用Unity 2021或更高版本); #endif1.2 基础场景搭建在Hierarchy面板右键创建Directional Light主光源Sphere重命名为EarthCamera调整到合适视角提示按CtrlShiftF可快速将摄像机对齐到当前视图2. 地球材质与特效配置2.1 地球材质制作为地球创建PBR材质1. 在Assets文件夹右键创建Material 2. 命名EarthMat 3. 设置Shader为Universal Render Pipeline/Lit 4. 配置参数 - Albedo地球贴图 - Metallic0.7 - Smoothness0.9 - Emission启用HDR蓝色2.2 动态天空盒设置实现宇宙背景效果// 动态设置天空盒的脚本 using UnityEngine; using UnityEngine.Rendering; public class SkyboxController : MonoBehaviour { public Material skyboxMat; void Start() { RenderSettings.skybox skyboxMat; DynamicGI.UpdateEnvironment(); } }3. 贝塞尔射线核心实现3.1 LineRenderer基础配置为地球添加LineRenderer组件- 参数设置 - Positions空 - Width0.05曲线起始→0.01曲线末端 - Material新建LineMat使用Particles/Additive Shader - Color Gradient蓝→白渐变3.2 三阶贝塞尔曲线算法创建BezierCurve.cs脚本using UnityEngine; public class BezierCurve : MonoBehaviour { [Header(控制点)] public Transform p0, p1, p2, p3; [Header(曲线参数)] [Range(10, 100)] public int segments 30; private LineRenderer lr; void Start() { lr GetComponentLineRenderer(); lr.positionCount segments 1; } void Update() { for (int i 0; i segments; i) { float t i / (float)segments; lr.SetPosition(i, CalculateBezierPoint(t)); } } Vector3 CalculateBezierPoint(float t) { float u 1 - t; return u * u * u * p0.position 3 * u * u * t * p1.position 3 * u * t * t * p2.position t * t * t * p3.position; } }3.3 动态控制点生成优化控制点生成逻辑Vector3 GetRandomSurfacePoint(Vector3 center, float radius) { Vector3 randomDir new Vector3( Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f) ).normalized; return center randomDir * radius; } Vector3 GetControlPoint(Vector3 start, Vector3 end, Vector3 center) { Vector3 midPoint (start end) * 0.5f; return midPoint (midPoint - center).normalized * Vector3.Distance(start, end) * 0.5f; }4. 动画效果与性能优化4.1 射线生长动画修改绘制逻辑实现动态效果IEnumerator AnimateLine(Vector3[] points) { lr.positionCount 0; for (int i 0; i points.Length; i) { lr.positionCount; lr.SetPosition(i, points[i]); yield return new WaitForSeconds(0.01f); } // 粒子爆发效果 EmitParticles(points[points.Length-1]); }4.2 对象池优化创建LinePool.cs管理射线实例using System.Collections.Generic; using UnityEngine; public class LinePool : MonoBehaviour { public GameObject linePrefab; public int poolSize 10; private QueueGameObject pool new QueueGameObject(); void Start() { for (int i 0; i poolSize; i) { GameObject obj Instantiate(linePrefab); obj.SetActive(false); pool.Enqueue(obj); } } public GameObject GetLine() { if (pool.Count 0) { GameObject obj pool.Dequeue(); obj.SetActive(true); return obj; } return Instantiate(linePrefab); } public void ReturnLine(GameObject obj) { obj.SetActive(false); pool.Enqueue(obj); } }5. 高级效果扩展5.1 粒子系统增强为射线添加头尾粒子特效1. 创建Particle System子对象 2. 关键参数配置 - Start Speed0 - ShapeCone角度5° - Emission over Distance启用 - RendererMaterial使用Additive着色器5.2 音效同步添加射线生成音效[RequireComponent(typeof(AudioSource))] public class SoundManager : MonoBehaviour { public AudioClip rayStartSound; public AudioClip rayHitSound; private AudioSource audioSource; void Awake() { audioSource GetComponentAudioSource(); } public void PlayRayStart() { audioSource.PlayOneShot(rayStartSound); } public void PlayRayHit() { audioSource.PlayOneShot(rayHitSound); } }6. 参数调试技巧6.1 关键参数调节表参数推荐值效果影响曲线分段数30-50值越大曲线越平滑性能消耗越高动画时长0.5-2s控制射线生长速度宽度曲线0.1→0.01起始端较粗更显科技感发射间隔0.3-1s控制射线生成频率6.2 调试控制面板创建编辑器扩展脚本#if UNITY_EDITOR using UnityEditor; [CustomEditor(typeof(BezierController))] public class BezierControllerEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); BezierController controller (BezierController)target; if (GUILayout.Button(测试射线)) { controller.TestRay(); } EditorGUILayout.Space(); EditorGUILayout.LabelField(实时调试, EditorStyles.boldLabel); controller.rayCount EditorGUILayout.IntSlider(射线数量, controller.rayCount, 1, 10); } } #endif在VR项目中应用时发现调整控制点偏移量为半径的1.2倍时曲线弧度最接近GitHub效果。如果遇到性能问题可以尝试降低LineRenderer的Shadow Casting设置为Off。