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

无法修改控制设置页面开关的Value值,值自动恢复为1

设置页面状态值自动恢复的问题

我想用一个Value值标记玩家当前所处页面,支持通过该值或按钮开关设置页面。但将控制设置页面开启的Value值从1改为0时,它会自动恢复为1,且无报错信息,检查代码未发现明显问题,相关代码如下:

function openSettings()
    -- Send an event to Server if the Player is opening Settings.
    ReplicatedStorage.OpenSettingsSignal:FireServer()
    
    -- Code
    if player.InteractionsActivity.IsSettingsOpen.Value == 1 then
        TweenService:Create(SettingsPage, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(ChoosenTab, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(SettingsOption, quadInOut250ms, halfBackgroundTransparency):Play()

        TweenService:Create(ChooseSO, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(ChooseSO, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(DisplayButton, quadInOut250ms, nonTextTransparency):Play()

        TweenService:Create(ExclusiveMovileOption, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(ScreenOrientation, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(DisplayTab, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(TitlePage, quadInOut250ms, nonTextTransparency):Play()

        wait(0.25)
        GameGUI.MainMenu.Visible = false

        return nil
    end
    
    TweenService:Create(SettingsPage, quadInOut250ms, nonBackgroundTransparency):Play()
    TweenService:Create(ChoosenTab, quadInOut250ms, nonBackgroundTransparency):Play()
    TweenService:Create(SettingsOption, quadInOut250ms, halfBackgroundTransparency):Play()
    
    TweenService:Create(ChooseSO, quadInOut250ms, nonBackgroundTransparency):Play()
    TweenService:Create(ChooseSO, quadInOut250ms, nonTextTransparency):Play()
    TweenService:Create(CancelButton, quadInOut250ms, nonBackgroundTransparency):Play()
    TweenService:Create(CancelButton, quadInOut250ms, nonTextTransparency):Play()
    TweenService:Create(DoneButton, quadInOut250ms, nonBackgroundTransparency):Play()
    TweenService:Create(DoneButton, quadInOut250ms, nonTextTransparency):Play()
    TweenService:Create(DisplayButton, quadInOut250ms, nonTextTransparency):Play()
    
    TweenService:Create(ExclusiveMovileOption, quadInOut250ms, nonTextTransparency):Play()
    TweenService:Create(ScreenOrientation, quadInOut250ms, nonTextTransparency):Play()
    TweenService:Create(DisplayTab, quadInOut250ms, nonTextTransparency):Play()
    TweenService:Create(TitlePage, quadInOut250ms, nonTextTransparency):Play()
    
    wait(0.25)
    GameGUI.MainMenu.Visible = false
end

function closeSettings()
    -- Send an event to Server if the Player is closing Settings.
    ReplicatedStorage.CloseSettingsSignal:FireServer()

    -- Code
    if player.InteractionsActivity.IsSettingsOpen.Value == 0 or player.InteractionsActivity.IsSettingsOpen.Value > 1 then
        GameGUI.MainMenu.Visible = true
        
        TweenService:Create(SettingsPage, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(ChoosenTab, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(SettingsOption, quadInOut250ms, fullBackgroundTransparency):Play()

        TweenService:Create(ChooseSO, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(ChooseSO, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(DisplayButton, quadInOut250ms, fullTextTransparency):Play()

        TweenService:Create(ExclusiveMovileOption, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(ScreenOrientation, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(DisplayTab, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(TitlePage, quadInOut250ms, fullTextTransparency):Play()
        
        return nil
    end
end

-- Connect to the event When Mouse clicked on Button Element or Something has changed to value to Functions
GameGUI.MainMenu.ProfileMenu.Settings.MouseButton1Click:Connect(openSettings)
GameGUI.MainMenu.SettingsButton.MouseButton1Click:Connect(openSettings)
player.InteractionsActivity.IsSettingsOpen.Changed:Connect(openSettings)
player.InteractionsActivity.IsSettingsOpen.Changed:Connect(closeSettings)

问题原因

  • Changed事件冲突:同时将IsSettingsOpen.Changed绑定给openSettings和closeSettings,状态值变化时两个函数会同时执行。比如把值改成0时,closeSettings触发的同时openSettings也会被调用,而openSettings里触发的OpenSettingsSignal可能让服务器把值又改回1。
  • 状态值修改缺失:openSettings和closeSettings只做了UI动画,没有在客户端修改IsSettingsOpen.Value,状态全靠服务器同步,容易出现不一致。
  • 逻辑冗余:openSettings里的两个分支执行完全相同的动画代码,属于无效判断。

修复方案

1. 合并开关逻辑,统一处理状态变化

把打开和关闭的逻辑整合到一个函数里,通过状态值判断执行对应操作,避免事件冲突。

2. 按钮点击直接切换状态值

点击按钮时先修改客户端的状态值,再通知服务器,确保客户端与服务器状态同步。

3. 移除重复的事件绑定

只保留一个Changed事件监听,避免重复触发。

修复后的代码

-- 统一处理设置页面的显示/隐藏
function handleSettingsState(newValue)
    local isOpening = newValue == 1
    if isOpening then
        -- 执行打开动画
        TweenService:Create(SettingsPage, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(ChoosenTab, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(SettingsOption, quadInOut250ms, halfBackgroundTransparency):Play()

        TweenService:Create(ChooseSO, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(ChooseSO, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, nonBackgroundTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(DisplayButton, quadInOut250ms, nonTextTransparency):Play()

        TweenService:Create(ExclusiveMovileOption, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(ScreenOrientation, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(DisplayTab, quadInOut250ms, nonTextTransparency):Play()
        TweenService:Create(TitlePage, quadInOut250ms, nonTextTransparency):Play()

        wait(0.25)
        GameGUI.MainMenu.Visible = false
        ReplicatedStorage.OpenSettingsSignal:FireServer()
    else
        -- 执行关闭动画
        GameGUI.MainMenu.Visible = true
        TweenService:Create(SettingsPage, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(ChoosenTab, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(SettingsOption, quadInOut250ms, fullBackgroundTransparency):Play()

        TweenService:Create(ChooseSO, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(ChooseSO, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(CancelButton, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, fullBackgroundTransparency):Play()
        TweenService:Create(DoneButton, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(DisplayButton, quadInOut250ms, fullTextTransparency):Play()

        TweenService:Create(ExclusiveMovileOption, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(ScreenOrientation, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(DisplayTab, quadInOut250ms, fullTextTransparency):Play()
        TweenService:Create(TitlePage, quadInOut250ms, fullTextTransparency):Play()
        ReplicatedStorage.CloseSettingsSignal:FireServer()
    end
end

-- 按钮点击切换状态值
function toggleSettings()
    local currentVal = player.InteractionsActivity.IsSettingsOpen.Value
    player.InteractionsActivity.IsSettingsOpen.Value = currentVal == 1 and 0 or 1
end

-- 绑定事件
GameGUI.MainMenu.ProfileMenu.Settings.MouseButton1Click:Connect(toggleSettings)
GameGUI.MainMenu.SettingsButton.MouseButton1Click:Connect(toggleSettings)
player.InteractionsActivity.IsSettingsOpen.Changed:Connect(handleSettingsState)

额外注意

  • 确保服务器端的信号处理逻辑不会强制覆盖客户端的状态值,仅做权限验证后同步状态即可。
  • 避免在Changed事件处理函数中再次修改状态值,防止无限循环触发事件。

内容的提问来源于stack exchange,提问作者mukeenanyafiq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:55:20