热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【UE4】【C++】WASD添加力到组件上让整个物体移动(油门Throttle),OnHit移动事件绑定

WASD添加力到组件上让整个物体移动(油门Throttle):通过WASD传入一个值作为油门的大小,通过函数(DriveTrack)来设置力先在项目设置中AxisMapping

WASD添加力到组件上让整个物体移动(油门Throttle):

通过WASD传入一个值作为油门的大小,通过函数(DriveTrack)来设置力


先在项目设置中Axis Mappings(想达到按的大小轻重不同,前进后退的速度不同)加


创对应的组件(TankTrack履带)C++项目(StaticMeshComponent)

UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))    //暴露给蓝图用于加到对应的物体上
UFUNCTION(BlueprintCallable,Category="Input")
void SetThrottle(float Throttle);    //设置油门大小的函数

void DriveTrack();                    //赋予力到组件(物体)的函数
	
UPROPERTY(EditAnywhere,Category="Setup")
float TankMaxDrivingForce=40000000.0f;    //受到的力的默认值
	
float ThrottleToDrive = 0;
void UTankTrack::SetThrottle(float Throttle) {
	ThrottleToDrive = FMath::Clamp(ThrottleToDrive + Throttle, -1, 1);
}

void UTankTrack::DriveTrack() {	//按键的时候是设置油门
	auto ForceApplied = TankMaxDrivingForce * ThrottleToDrive * GetForwardVector();    //auto是系统自己判断是什么类型
	auto ForceLocation = GetComponentLocation();
	auto RootCompOnent= Cast(GetOwner()->GetRootComponent()); //   
	RootComponent->AddForceAtLocation(ForceApplied, ForceLocation);
}
因为是让整个TankBody移动,所以GetOwner()后得到对应的Track在GetRootComponent得到TankBody,此时返回的值是USceneComponent类型(只拥有位置信息Transform,层级信息Attachment,没有显示mesh的功能和碰撞的功能),所以要转换成UprimitiveComponent(就拥有物理的属性了,才有AddForceAtLocation这个方法)


接下来再创用于移动的组件(TankMoveComponent)(MovementCompont)

                                        (如果要AI自动寻路要NavMovementComponent)

UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))

private:
	UFUNCTION(BlueprintCallable, Category = "Setup")
	void Initialise(UTankTrack* LeftTrackToSet, UTankTrack* RightTrackToSet);    //在蓝图中赋值给对应的组件LeftTrack/RightTrack

	UFUNCTION(BlueprintCallable, Category = "Input")
	void MoveForward(float Throttle);

	UFUNCTION(BlueprintCallable, Category = "Input")
	void MoveRight(float Throttle);

	UTankTrack * LeftTrack = nullptr;
	UTankTrack * RightTrack = nullptr;
void UTankMovementComponent::Initialise(UTankTrack* LeftTrackToSet, UTankTrack* RightTrackToSet) {
	if (LeftTrackToSet == nullptr || RightTrackToSet == nullptr)return;
	LeftTrack = LeftTrackToSet;
	RightTrack = RightTrackToSet;
}

void UTankMovementComponent::MoveForward(float Throttle) {
	LeftTrack->SetThrottle(Throttle);
	RightTrack->SetThrottle(Throttle);		//前后移动只需左右履带同时前进即可
}

void UTankMovementComponent::MoveRight(float Throttle) {
	LeftTrack->SetThrottle(Throttle);
	RightTrack->SetThrottle(-Throttle);
}

编译后在蓝图中加入对应的组件(上述写的两个)

OnHit移动事件绑定:

蓝图中:

C++:

h:

  virtual void BeginPlay() override;    //
UFUNCTION()
void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);

cpp:

void UTankTrack::BeginPlay() {
	Super::BeginPlay();
	OnComponentHit.AddDynamic(this,&UTankTrack::OnHit);    //添加碰撞事件,加函数要加&(参数)
}
void UTankTrack::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) {
	DriveTrack();	
	ThrottleToDrive = 0;
}//当碰到东西的时候才会执行DriveTrack(开车)




推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
WO
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有