LightsEffectCore灯光方向切换异常:如何从当前索引变更移动方向?
解决灯光方向切换时从当前索引开始移动的问题
看起来你遇到的问题是灯光方向切换时,没有从当前点亮的索引继续移动,而是跳转到了其他位置——这通常是因为切换方向时错误地修改了currentIndex,或者用了数组反转这种会打乱当前位置的操作。
核心问题分析
大多数灯光流动逻辑会依赖两个关键变量:
currentIndex:跟踪当前点亮的灯光位置moveDirection:控制移动方向(比如1表示正向递增,-1表示反向递减)
如果切换方向时直接反转数组,或者重置了currentIndex,就会出现跳索引的问题。正确的做法是只切换方向变量,保持当前索引不变,让下一次移动操作沿着新方向从当前位置出发。
修正后的代码实现
这里以Unity环境为例(你提到的LightsEffectCore看起来是Unity项目里的脚本),给出完整的可运行逻辑:
using System; using UnityEngine; public class LightsEffectCore : MonoBehaviour { // 挂载你的灯光数组 public Light[] lightSequence; // 当前激活的灯光索引 private int currentLightIndex = 0; // 移动方向:1=正向(索引递增),-1=反向(索引递减) private int movementDirection = 1; // 灯光切换的时间间隔 public float switchInterval = 0.8f; private float timer = 0f; void Start() { // 初始化:点亮第一个灯光(可选) if (lightSequence.Length > 0) { lightSequence[currentLightIndex].enabled = true; } } void Update() { timer += Time.deltaTime; if (timer >= switchInterval) { // 关闭当前灯光 lightSequence[currentLightIndex].enabled = false; // 按照当前方向更新索引 currentLightIndex += movementDirection; // 处理边界:到达数组两端时自动切换方向(可选,根据你的需求) if (currentLightIndex < 0 || currentLightIndex >= lightSequence.Length) { movementDirection *= -1; // 修正索引到有效范围 currentLightIndex = Mathf.Clamp(currentLightIndex, 0, lightSequence.Length - 1); } // 点亮新的灯光 lightSequence[currentLightIndex].enabled = true; timer = 0f; } } // 手动触发方向切换的方法 public void ToggleLightDirection() { // 只反转方向,不修改当前索引 movementDirection *= -1; // 如果你想要立即切换方向并移动(不需要等间隔),取消下面的注释: // lightSequence[currentLightIndex].enabled = false; // currentLightIndex += movementDirection; // lightSequence[currentLightIndex].enabled = true; } }
关键细节说明
- 方向切换逻辑:调用
ToggleLightDirection()时,仅仅将movementDirection取反,currentLightIndex保持当前值不变。下一次Update周期时,就会沿着新方向移动(比如当前在索引5,方向从1变-1,下一次就会到4)。 - 立即移动选项:如果不需要等待切换间隔,想要点击切换按钮后立即看到灯光移动,就取消
ToggleLightDirection()里的注释代码,直接执行一次索引更新和灯光状态切换。 - 边界处理:当灯光到达数组两端时,自动切换方向并修正索引,避免数组越界。如果你的需求是到达边界后停止,只需要移除这部分逻辑即可。
为什么原来的逻辑会出错?
如果你的旧代码里用了数组反转(比如Array.Reverse(lightSequence)),或者切换方向时重置了currentLightIndex(比如设为lightSequence.Length - 1),就会导致灯光跳转到其他位置——因为这些操作没有保留当前的激活位置,而是直接改变了整个序列或索引的起点。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

