前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【虚幻引擎】实现惊险闪避触发时停效果

【虚幻引擎】实现惊险闪避触发时停效果

作者头像
六月丶
发布2022-12-26 18:06:08
4950
发布2022-12-26 18:06:08
举报
文章被收录于专栏:六月-游戏开发六月-游戏开发

效果演示

https://hctra.cn/file/video/avoidTimeStop.mp4

实现思路

惊险闪避触发时机 在敌人攻击动画种,攻击触发前(比如脚踩到地)一小段时间,先开启攻击的检测碰撞,这段时间玩家如果发生触碰同时按下闪避键,就会触发时停效果。

时停效果实现逻辑 先降低游戏时间缩放,然后提高玩家动画播放速率和移动速度,即可实现所有事物变慢,但玩家速度保持不变。

具体实现步骤

惊险闪避触发时机

  • 在敌人招式触发前,添加notify通知:
image.png
image.png

GiantStatusAttack.lua:

代码语言:javascript
复制
-- notify通知触发函数
local notifyBeginFunc = function(name)
    if name == GE.MontageNotifyName.CheckAvoid then
        own.checkAvoid_ = true
        --提前开启碰撞做预警
        own["bp_LeftFootForDamageCol"]:SetCollisionProfileName(GE.CollisionSet.ForDamage, true)

    elseif name == GE.MontageNotifyName.Release then
        --关闭检查
        own["bp_LeftFootForDamageCol"]:SetCollisionProfileName(GE.CollisionSet.NoCollision, true)
        own:CloseAttack_()
        own.checkAvoid_ = false
        释放攻击代码...
    end
end

GiantMonster.lua:

代码语言:javascript
复制
function cls:DamageColBeginOverlap(overlappedComponent, otherActor, otherComp, otherBodyIndex, bFromSweep, sweepResult)
    -- 不是玩家或已碰撞 return
    if otherActor.isPlayer_bp == nil or self.attackedActor_[otherActor] then
        return
    end
    self.attackedActor_[otherActor] = true
    -- 根据类型发送对应通知
    if self.checkAvoid_ then
        GD:Post(self, otherActor, GEVT.CHECK_AVOID, true)
    else
        GD:Post(self, otherActor, GEVT.APPLY_DAMAGE, self, self.aggressivity_bp * self.damageMultipler_, self.impactForce_, false)
    end
end

玩家接收到通知,改变相应状态 Character.lua:

代码语言:javascript
复制
function cls:OnCheckAvoid(isCheck)
    self.checkAvoidToTimeStop_ = isCheck
end

CharacterStatusAvoid.lua:

代码语言:javascript
复制
-- 触发时停
if own.checkAvoidToTimeStop_ then
    own.checkAvoidToTimeStop_ = false
    own.isAvoidTimeStop_ = true
    local timeScale = 0.3
    GF:SetGlobalTimeDilation(timeScale)
    own:SetAnimRate_(1 / timeScale)
    own:SetMaxWalkSpeed_(own.initMaxSpeed_ / timeScale)
    own:DelayCall(3 * timeScale, function()
        own.isAvoidTimeStop_ = false
        GF:SetGlobalTimeDilation(1)
        own:SetAnimRate_(1)
        own:SetMaxWalkSpeed_(own.initMaxSpeed_)
        own.animRate_bp = 1
    end)
end
-- 延迟调用 动画1.3
own:DelayCall(0.7 / own.animRate_bp, function()
    if(own.status_ == Enums.Status.Avoid) then
        own:ChangeNormalStatus_()
    end
end)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022 年 09 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 效果演示
  • 实现思路
  • 具体实现步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档