找回密码
 立即注册
    查看: 3|回复: 1

    前端镜头拉伸

    [复制链接]

    326

    主题

    66

    回帖

    1466

    积分

    积分
    1466
    发表于 2025-5-30 16:54:48 | 显示全部楼层 |阅读模式
    function onKillMonsterEffect()
        -- 正确获取主玩家
        local mainPlayer = global.gamePlayerController:GetMainPlayer()
        if not mainPlayer then return end
    
    
        local originalState = {
            walk = mainPlayer:GetWalkSpeed(),
            run = mainPlayer:GetRunSpeed(),
            attack = mainPlayer:GetAttackSpeed(),
            magic = mainPlayer:GetMagicSpeed(),
            cameraZ = global.gameMapController:GetViewCamera():getPositionZ()
        }
        
    
        -- 平滑镜头拉近效果
        local camera = global.gameMapController:GetViewCamera()
        if camera then
            local targetZ = originalState.cameraZ * 0.2  -- 目标镜头距离(拉近50%)
            local duration = 1.0  -- 拉近过程持续时间(秒)
            
            -- 使用Timeline实现平滑过渡
            GUI:Timeline_MoveTo(camera, {x = camera:getPositionX(), y = camera:getPositionY(), z = targetZ}, duration, function()
                SL:print("镜头拉近完成")
            end)
        end
        
        -- 3秒后恢复所有状态
        SL:ScheduleOnce(function()
     
            -- 平滑恢复镜头
            local camera = global.gameMapController:GetViewCamera()
            if camera then
                -- 使用引擎的Timeline确保平滑恢复
                GUI:Timeline_MoveTo(camera, 
                    {x = camera:getPositionX(), y = camera:getPositionY(), z = originalState.cameraZ}, 
                   2.0,  -- 恢复时间1秒
                    function()
                        SL:print("特效结束,完全恢复到初始状态")
                    end
                )
            end
        end, 2)
    end
    onKillMonsterEffect()
    -- 事件监听
    local function onMonsterDie()
        onKillMonsterEffect()
    end
    SL:RegisterLUAEvent("LUA_EVENT_MONSTER_DIE", "怪物死亡", onMonsterDie)
    

    0

    主题

    0

    回帖

    -22

    积分

    积分
    -22
    发表于 2025-5-30 16:54:48 | 显示全部楼层
    嘻嘻~同学你好呀!(◕‿◕✿)

    这个镜头拉伸效果的代码写得不错呢!我来帮你分析一下哦~
    1. -- 获取主玩家和原始状态的写法很标准呢
    2. local mainPlayer = global.gamePlayerController:GetMainPlayer()
    3. if not mainPlayer then return end
    复制代码

    不过我发现几个小细节可以优化一下呢:

    1. 同学要注意这里的缩进有点不统一哦,建议保持一致的缩进风格呢~
    2. 在恢复镜头的时候,可以加个判断确保camera存在呢
    3. 建议把2.0这样的魔法数字定义成常量会更优雅哦

    要不要试试这样改改看呢?(。・ω・。)
    1. local RECOVER_DURATION = 2.0  -- 定义常量
    2. local function resetCamera(camera, targetZ)
    3.     if not camera then return end
    4.    
    5.     GUI:Timeline_MoveTo(camera,
    6.         {x = camera:getPositionX(), y = camera:getPositionY(), z = targetZ},
    7.         RECOVER_DURATION,
    8.         function()
    9.             SL:print("特效结束啦~")
    10.         end
    11.     )
    12. end
    复制代码

    同学觉得这样是不是更清晰一点呢?(●ˇ∀ˇ●)

    如果还有其他问题随时问我哦~我会一直在这里帮你的!加油加油!(ノ◕ヮ◕)ノ*:・゚✧
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则