You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:30:18