技术标签: UE4 UE4 Possess UE4 Jump UE4 Crouch UE4 Movement
原创内容,转载请注明出处。
创建一个基于Character的蓝图,可以看到左侧可以覆盖一些方法,针对这些方法在代码层面做一个介绍。
如下图,写这篇文章的目的其实希望大家知道引擎原生提供的一些方法,能够更快的写逻辑。
防止各位同仁自造轮子。
本文只介绍Character的事件,Actor的事件在上篇文章中讲过了。UE4 Actor事件接口详解
是否可跳跃,跳跃之前的条件判断
检查角色是否可以在当前状态下跳跃。跳跃之前的一些你的逻辑判断。
描述:是否可以跳跃?
源码:其实由上面的源码可以看出,由BlueprintCallable所修饰的CanJump虚方法其实调用的就是由
BlueprintNativeEvent所修饰的CanJumpInternal(), CanJumpInternal()这个方法蓝图可以重载实现,
当蓝图中重载了之后C++ 的CanJumpInternal()将不再会调用。
C++默认的CanJumpInternal_Implementation()(默认这个方法的实现体会有些条件判断,
比如不是蹲着的时候返回true,蹲着的时候是不允许跳跃的;判断跳跃是否超过了最大跳跃限制次数,比如二段跳);
如果是你的C++想重载的话,请重载CanJump()逻辑,而不是CanJumpInternal()。
返回值:bool:是否可以在当前状态跳转
当触发一次跳跃,执行逻辑依次为
1>CanJump? 我可以跳吗?
2>CanJump? 我可以跳吗?
3>OnJump 跳起来了
4>OnLanded 我落地了
如果蓝图中直接实现了CanJump, return true的话,Character上面的JumpMaxCount(最大限制跳跃次数)将失去效果,需要自己增加这部分的逻辑。如果你发现你的二段跳功能失效了,怀疑是不是这里的问题,或者搜索JumpMaxCount也能找到原因。
事件在角色刚开始跳跃时触发,当你触发跳跃的一瞬间,就会调用这个函数
在C++中调用
在蓝图中重写OnJump
事件在角色刚开始跳跃落地时触发,当你接触Floor的一瞬间,就会调用这个函数。 参数是当时落地的坐标的一些参数,比如有具体的位置,落地时候地表的物理材质等信息。
在C++中你想重载写一些逻辑的话,重载virtual void Landed(const FHitResult& Hit);
在蓝图中你想重载写一些逻辑的话,直接实现OnLanded(const FHitResult& Hit)即可。
发射角色,和Jump有点像,这个是会给一个力。应用到就像CF里面生化模式跳到某个传送门一下跳老高的那种效果。我觉得就是为FPS游戏设计的该功能
我在场景中放了一个传送门,很丑,用了个火的粒子。
当角色与这个TriigerBox发生Overlap时候,会将角色弹射起来,给角色一个向上的力。就像CF里面那种效果。下面是在关卡蓝图里面的实现。
回到蓝图中的OnLaunched方法介绍上
UFUNCTION(BlueprintImplementableEvent)
void OnLaunched(FVector LaunchVelocity, bool bXYOverride, bool bZOverride)
其实这个方法触发的时候,就是角色被调用了LaunchCharacter,之后会调用CharacterMovement->Launch(FinalVel),
然后调用让蓝图知道一下这个角色被发射了。
触发现象是当你的walk切换到fall,比如从高处掉下的时候会调用。
我认为可以做一些从步行->跌倒的功能。
官方解释不包括跳跃或其他可能导致运动模式中发生相同过渡的事物。
下面是Character.h中的相关代码
/**
* Event fired when the Character is walking off a surface and is about to fall because CharacterMovement->CurrentFloor became unwalkable.
* If CharacterMovement->MovementMode does not change during this event then the character will automatically start falling afterwards.
* @note Z velocity is zero during walking movement, and will be here as well. Another velocity can be computed here if desired and will be used when starting to fall.
*
* @param PreviousFloorImpactNormal Normal of the previous walkable floor.
* @param PreviousFloorContactNormal Normal of the contact with the previous walkable floor.
* @param PreviousLocation Previous character location before movement off the ledge.
* @param TimeTick Time delta of movement update resulting in moving off the ledge.
*/
UFUNCTION(BlueprintNativeEvent, Category=Character)
void OnWalkingOffLedge(const FVector& PreviousFloorImpactNormal, const FVector& PreviousFloorContactNormal, const FVector& PreviousLocation, float TimeDelta);
virtual void OnWalkingOffLedge_Implementation(const FVector& PreviousFloorImpactNormal, const FVector& PreviousFloorContactNormal, const FVector& PreviousLocation, float TimeDelta);
想要角色开始蹲下, 需要满足下面条件
1>需要将UCharacterMovementComponent里面的NavAgentProps参数中bCanCrouch设置为true
2>需要调用Crouch进入蹲下状态,相反的是调用UnCrouch退出蹲下状态
角色蹲下后走到边坡不能进入自由落体,怎么解决?
1>将UCharacterMovementComponent对象的bCanWalkOffLedgesWhenCrouching设置为true
下面是CharacterMovementComponent.h中关于蹲下的相关参数声明(请看具体的注释理解)
//蹲下时候的最大移动速度,也就是说蹲下后走的慢了。没错符合物理真实,这很UE4。
UPROPERTY(Category="Character Movement: Walking", EditAnywhere, BlueprintReadWrite, meta=(ClampMin="0", UIMin="0"))
float MaxWalkSpeedCrouched;
//蹲下时候角色的Capsule的高度
UPROPERTY(Category="Character Movement (General Settings)", EditAnywhere, BlueprintReadOnly, meta=(ClampMin="0", UIMin="0"))
float CrouchedHalfHeight;
//这个比较有意思,默认为false。如果false的话走到边坡你会发现没法掉下去。当为true的时候就能掉下去了。
//并且也会触发On Walking Off Ledge
UPROPERTY(Category="Character Movement: Walking", EditAnywhere, BlueprintReadWrite)
uint8 bCanWalkOffLedgesWhenCrouching:1;
下面是Character.h中关于蹲下的相关函数声明
//调用该方法让 蹲下
UFUNCTION(BlueprintCallable, Category=Character, meta=(HidePin="bClientSimulation"))
virtual void Crouch(bool bClientSimulation = false);
//调用该方法让角色 停止蹲下
UFUNCTION(BlueprintCallable, Category=Character, meta=(HidePin="bClientSimulation"))
virtual void UnCrouch(bool bClientSimulation = false);
//可以蹲下吗?
UFUNCTION(BlueprintCallable, Category=Character)
virtual bool CanCrouch() const;
//当角起身的时候调用 调用了UnCrouch之后
virtual void OnEndCrouch(float HalfHeightAdjust, float ScaledHalfHeightAdjust);
//蓝图版本的OnEndCrouch
UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName="OnEndCrouch", ScriptName="OnEndCrouch"))
void K2_OnEndCrouch(float HalfHeightAdjust, float ScaledHalfHeightAdjust);
//角色蹲下的时候调用, 调用了Crouch之后
virtual void OnStartCrouch(float HalfHeightAdjust, float ScaledHalfHeightAdjust);
//蓝图版本的OnStartCrouch
UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName="OnStartCrouch", ScriptName="OnStartCrouch"))
void K2_OnStartCrouch(float HalfHeightAdjust, float ScaledHalfHeightAdjust);
这个比较好理解,Character上CharacterMovement中的变量
UPROPERTY(Category=“Character Movement: MovementMode”, BlueprintReadOnly)
TEnumAsByte MovementMode;
也就是说当这个枚举发生变化的时候会有个通知
下面是C++的代码部分
//MovementMode改变
//参数:PrevMovementMode 更改之前是啥模式
//参数:PreviousCustomMode 更改之前的自定义模式是啥。注意是自定义模式。比如绝地求生的climbing攀爬模式
virtual void OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode = 0);
//MovementMode改变的时候广播这个多播代理
UPROPERTY(BlueprintAssignable, Category=Character)
FMovementModeChangedSignature MovementModeChangedDelegate;
//蓝图中用的,就是在上面的OnMovementModeChanged中调用的。
//参数:PrevMovementMode 更改之前是啥模式
//参数:NewMovementMode 新的模式
//参数:PrevCustomMode 更改之前的自定义模式是啥。注意是自定义模式
//参数:NewCustomMode 更改之后的自定义模式是啥模式。比如绝地求生的climbing攀爬模式
UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName="OnMovementModeChanged", ScriptName="OnMovementModeChanged"))
void K2_OnMovementModeChanged(EMovementMode PrevMovementMode, EMovementMode NewMovementMode, uint8 PrevCustomMode, uint8 NewCustomMode);
Controller和Pawn其实是一个相互持有的关系,比如有想切换操控的角色的功能,可以用这个实现。
那么应该怎么去实现切换角色的功能呢?
1>调用Controller->Possess(传一个Pawn的对象即可完成切换角色的功能)
2>不建议调用角色身上的PossessedBy, 可能会遇到一些问题,因为Controller的部分逻辑没有被执行到。
3>往往切换角色功能会伴随着要spawn一个新的character逻辑,然后再将这个新spawn出来的character进行Controller->Possess(新spawn的character),再将老的character进行Destroy();
Character继承自Pawn,下面Pawn.h的代码
//当Controller调用Possess的时候呢,会调用到这个方法
virtual void PossessedBy(AController* NewController);
//在ReceivePossessed中调用的,目的是为了通知蓝图
UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName= "Possessed"))
void ReceivePossessed(AController* NewController);
/** Event called when the Pawn is no longer possessed by a Controller. */
UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName= "Unpossessed"))
void ReceiveUnpossessed(AController* OldController);
//当Controller调用UnPossess的时候调用Pawn的UnPossessed
virtual void UnPossessed();
下面是Controller.h的代码, 可以看到下面俩方法都已经是final,不允许在进行重写了。
/**
* Handles attaching this controller to the specified pawn.
* Only runs on the network authority (where HasAuthority() returns true).
* @param InPawn The Pawn to be possessed.
* @see HasAuthority()
*/
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category=Pawn, meta=(Keywords="set controller"))
virtual void Possess(APawn* InPawn) final; // DEPRECATED(4.22, "Posssess is marked virtual final as you should now be overriding OnPossess instead")
/** Called to unpossess our pawn for any reason that is not the pawn being destroyed (destruction handled by PawnDestroyed()). */
UFUNCTION(BlueprintCallable, Category=Pawn, meta=(Keywords="set controller"))
virtual void UnPossess() final; // DEPRECATED(4.22, "Posssess is marked virtual final as you should now be overriding OnUnPossess instead")
和上面的Possessed相反
比如此时我有个需求,不想控制这个角色了,怎么办?
1 >关闭角色的Input, DisableInput(Controller和Character身上都有,调用一次)
2>来个狠的,直接调用Unpossessed.
这个函数是当MovementMode设置成Custom的时候,这个方法会调用。下面是堆栈信息。这个是通过UCharacterMovementComponent::PhysCustom()过来的
相对应的UCharacterMovementComponent中还有PhysWalking/PhysNavWalking/PhysFlying/PhysSwimming/还有PhysCustom等几个方法。这个里面可以重载了实现自定义模式下的逻辑。
下面是Character.h中对这个方法的定义
/**
* Event for implementing custom character movement mode. Called by CharacterMovement if MovementMode is set to Custom.
* @note C++ code should override UCharacterMovementComponent::PhysCustom() instead.
* @see UCharacterMovementComponent::PhysCustom()
*/
UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName="UpdateCustomMovement", ScriptName="UpdateCustomMovement"))
void K2_UpdateCustomMovement(float DeltaTime);
下面是一个关于K2_UpdateCustomMovement调用的一个堆栈信息
谢谢!创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)
文章浏览阅读90次。【代码】js-选项卡原理。_选项卡js原理
文章浏览阅读67次。原型模式是一种对象创建型模式,它采用复制原型对象的方法来创建对象的实例。它创建的实例,具有与原型一样的数据结构和值分为深度克隆和浅度克隆。浅度克隆:克隆对象的值类型(基本数据类型),克隆引用类型的地址;深度克隆:克隆对象的值类型,引用类型的对象也复制一份副本。UML图:具体代码:浅度复制:import java.util.List;/*..._prototype 设计模式
文章浏览阅读59次。入选国内首批云计算服务创新发展试点城市的北京、上海、深圳、杭州和无锡起到了很好的示范作用,不仅促进了当地产业的升级换代,而且为国内其他城市发展云计算产业提供了很好的借鉴。据了解,目前国内至少有20个城市确定将云计算作为重点发展的产业。这势必会形成新一轮的云计算基础设施建设的**。由于云计算基础设施建设具有投资规模大,运维成本高,投资回收周期长,地域辐射性强等诸多特点,各地在建...
文章浏览阅读9.4k次,点赞2次,收藏20次。一、功能及目的 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。BOOT1=x BOOT0=0 // 从用户闪存启动,这是正常的工作模式。BOOT1=0 BOOT0=1 // 从系统存储器启动,这种模式启动的程序_stm32boot0和boot1作用
文章浏览阅读3.4k次,点赞2次,收藏22次。C语言函数递归调用_c语言函数递归调用
文章浏览阅读410次。明日方舟bilibili服是一款天灾驾到战斗热血的创新二次元废土风塔防手游,精妙的二次元纸片人设计,为宅友们源源不断更新超多的纸片人老婆老公们,玩家将扮演废土正义一方“罗德岛”中的指挥官,与你身边的感染者们并肩作战。与同类塔防手游与众不同的几点,首先你可以在这抽卡轻松获得稀有,同时也可以在战斗体系和敌军走位机制看到不同。明日方舟bilibili服设定:1、起因不明并四处肆虐的天灾,席卷过的土地上出..._明日方舟抽卡模拟器
文章浏览阅读437次。Maven上传Jar到私服报错:ReasonPhrase: Repository version policy: SNAPSHOT does not allow version: xxx_repository version policy snapshot does not all
文章浏览阅读1.2k次。斐波那契数列(Fibonacci Sequence)是由如下形式的一系列数字组成的:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …上述数字序列中反映出来的规律,就是下一个数字是该数字前面两个紧邻数字的和,具体如下所示:示例:比如上述斐波那契数列中的最后两个数,可以推导出34后面的数为21+34=55下面是一个更长一些的斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,_斐波那契日
文章浏览阅读363次。PHP必会面试题1. 基础篇1. 用 PHP 打印出前一天的时间格式是 2017-12-28 22:21:21? //>>1.当前时间减去一天的时间,然后再格式化echo date('Y-m-d H:i:s',time()-3600*24);//>>2.使用strtotime,可以将任何字符串时间转换成时间戳,仅针对英文echo date('Y-m-d H:i:s',str..._//该层循环用来控制每轮 冒出一个数 需要比较的次数
文章浏览阅读1.3k次,点赞26次,收藏26次。windows下用mingw编译opencv貌似不支持cuda,选cuda会报错,我无法解决,所以没选cuda,下面两种编译方式支持。打开cmake gui程序,在下面两个框中分别输入opencv的源文件和编译目录,build-mingw为你创建的目录,可自定义命名。1、如果已经安装Qt,则Qt自带mingw编译器,从Qt安装目录找到编译器所在目录即可。1、如果已经安装Qt,则Qt自带cmake,从Qt安装目录找到cmake所在目录即可。2、若未安装Qt,则安装Mingw即可,参考我的另外一篇文章。_opencv mingw contrib
文章浏览阅读10w+次,点赞42次,收藏309次。今天给大家推荐5个好用且免费的简历模板网站,简洁美观,非常值得收藏!1、菜鸟图库https://www.sucai999.com/search/word/0_242_0.html?v=NTYxMjky网站主要以设计类素材为主,办公类素材也很多,简历模板大部个偏简约风,各种版式都有,而且经常会更新。最重要的是全部都能免费下载。2、个人简历网https://www.gerenjianli.com/moban/这是一个专门提供简历模板的网站,里面有超多模板个类,找起来非常方便,风格也很多样,无须注册就能免费下载,_hoso模板官网
文章浏览阅读142次。你听说过吗?该计划可让您以推广您的产品并在成功销售时支付佣金。它提供了新的营销渠道,使您的产品呈现在更广泛的受众面前并提高品牌知名度。此外,TikTok Shop联盟可以是一种经济高效的产品或服务营销方式。您只需在有人购买时付费,因此不存在在无效广告上浪费金钱的风险。这些诱人的好处是否足以让您想要开始您的TikTok Shop联盟活动?如果是这样,本指南适合您。_tiktok联盟