UEC++学习笔记(二)运动和物理碰撞(子弹)

这篇具有很好参考价值的文章主要介绍了UEC++学习笔记(二)运动和物理碰撞(子弹)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

改进运动

控制旋转

第三人称游戏中的旋转,控制器的旋转并不等同于人物的旋转。

UEC++学习笔记(二)运动和物理碰撞(子弹)

在角色bp中勾选了Use Contrtoller Rotation Yaw就会将控制器的旋转添加到角色的身上

我们应该把控制器的旋转添加到摄像头上才更加符合第三人称游戏的操作,所以取消勾选的同时在摄像头的机械臂中勾选Use Pawn Control Rotation将控制器的旋转添加到机械臂上

UEC++学习笔记(二)运动和物理碰撞(子弹)

这些操作也可以在c++中完成

SpringArmComp->bUsePawnControlRotation = true;
bUseControllerRotationYaw = false;

但是我们想要rpg风格的角色操作需要角色转向我们要移动的方向之后再去移动

GetCharacterMovement()->bOrientRotationToMovement = true;

也可以在蓝图中勾选

但是需要更改原本的运动的设置

原本的运动设置是朝着角色的方向移动

AddMovementInput(GetActorForwardVector(),value);
AddMovementInput(GetActorFightVector(),value);

但是当bOrientRotationToMovement设置为true后,角色是会转向到所指定的位置之后再向着那个地方往前移动,所以当角色旋转到一开始所指定的位置之后角色的方向改变了,就会继续旋转,无法获得一个rpg的操作手感

所以我们需要把它更改为朝着摄像机的方向移动(前面的设置之后摄像机不会一直跟着角色转向)。比如说我们朝左看再向前移动角色就会朝着那个地方移动,更加符合rpg的操作手感

void APlayerCharacter::MoveRight(float value)
{
   FRotator ControlRot = GetControlRotation();
   //因为这一移动是水平方向的所以不需要pitch和yaw,为了防止向下旋转的诡异现象所以设为0
   ControlRot.Pitch = 0.0f;
   ControlRot.Roll = 0.0f;
   AddMovementInput(UKismetMathLibrary::GetRightVector(ControlRot),value);
}

Tips:右转的时候是将获得的摄像机方向的九十度,需要做数学运算。但是ue其实已经写好了这个函数所以我们不需要自己去再写一遍。

快捷键Shift + Alt + S(如果是拥有Visual Assist或者使用Rider)找到所需要的函数

UEC++学习笔记(二)运动和物理碰撞(子弹)

可以看头文件判别

比如说在头文件Actor内的大概率是关于Actor的右向量。在这里我们需要做到是数学运算,所以找到KismetMathLibrary(Kismet是蓝图)下的GetRightVector函数调用并传入参数

物理碰撞(子弹)

创建子弹

创建c++类MagicProjectile(继承自Actor)

//MagicProjectile.h

#pragma once

#include "CoreMinimal.h"
#include "Components/SphereComponent.h"
#include "GameFramework/Actor.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "MagicProjectile.generated.h"

UCLASS()
class ACTIONROUGELIKE_API AMagicProjectile : public AActor
{
   GENERATED_BODY()
   
public:    
   // Sets default values for this actor's properties
   AMagicProjectile();

protected:
   //作为最基本的碰撞组件
   UPROPERTY(VisibleAnywhere)
   USphereComponent* SphereComp;
   //这个组件给予物体一个速度,进入直线
   UPROPERTY(VisibleAnywhere)
   UProjectileMovementComponent* MovementComp;
   //粒子系统组件,展示子弹
   UPROPERTY(VisibleAnywhere)
   UParticleSystemComponent* EffectComp;
   
   // Called when the game starts or when spawned
   virtual void BeginPlay() override;
   

public:    
   // Called every frame
   virtual void Tick(float DeltaTime) override;

};

//MagicProjectile.cpp
#include "MagicProjectile.h"

#include "Particles/ParticleSystem.h"
#include "Particles/ParticleSystemComponent.h"

// Sets default values
AMagicProjectile::AMagicProjectile()
{
   // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
   PrimaryActorTick.bCanEverTick = true;

   SphereComp = CreateDefaultSubobject<USphereComponent>("SphereComp");
   RootComponent = SphereComp;

   EffectComp = CreateDefaultSubobject<UParticleSystemComponent>("EffectComp");
   EffectComp->SetupAttachment(SphereComp);

   MovementComp = CreateDefaultSubobject<UProjectileMovementComponent>("MovementComp");
   MovementComp->InitialSpeed = 1000.0f;
   //为真时,子弹会随着旋转匹配速度的方向
   MovementComp->bRotationFollowsVelocity = true;
   MovementComp->bInitialVelocityInLocalSpace = true;
   
      
}

// Called when the game starts or when spawned
void AMagicProjectile::BeginPlay()
{
   Super::BeginPlay();
   
}

// Called every frame
void AMagicProjectile::Tick(float DeltaTime)
{
   Super::Tick(DeltaTime);

}

然后在ue编辑器中创建对应的蓝图,在EffecComp中的template中选择准备好的例粒子

UEC++学习笔记(二)运动和物理碰撞(子弹)

然后将它放到关卡中运行会发现子弹会往前飞但是不断下坠然后穿过地板掉下去。为了实现子弹的效果和基本功能接下来需要对碰撞需要改进。

生成子弹

生成子弹就是开火,需要按下鼠标左键或者其他操作去触发。所以需要在角色中绑定输入。

因为开火射击是一个动作和轴上的运动关系不大,所以这次用的是BindAction

//第一个参数是绑定的动作的名称,第二个参数是触发的条件(按下或松开或其他)
//第三个参数是使用这个动作的角色,第四个参数是触发的函数
PlayerInputComponent->BindAction("PrimaryAttack",IE_Pressed,this,&APlayerCharacter::PrimaryAttack);
 void APlayerCharacter::PrimaryAttack()
{
   //我们需要获得生成子弹的rotation和location
   //从角色生成子弹发射向我们看向的地方
   FTransform SpawnTM = FTransform(GetControlRotation(), GetActorLocation());

   
   FActorSpawnParameters SpawnParams;
   //指定子弹的生成规则
   //比如默认生成的规则是生成子弹的时候会检查生成的地点是否由物体重叠,
   //如果是就会向其它地方移动一点点去生成
   //但是我们需要在角色中生成子弹发射出去所以需要改变这一个规则
   SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
   
   
   //在这个函数中我们需要生成我们的子弹,所以我们需要先获取我们所在的世界(关卡)
   //这里用的是模板编程,<>内指定我们需要生成Actor的类型
   //第一个参数为传递我们想要生成的类
   //第二个参数是一个结构体,按照比例进行位置和方向的转换
   //第三个参数是FActorSpawnParameters,里面包含了很多可选参数,包括生成的发起者是谁等等
   GetWorld()->SpawnActor<AActor>(ProjectileClass, SpawnTM, SpawnParams);
}
//PlayerCharacter.h
protected:
   //指定我们生成的物体,小兵或者子弹等等
   //UPROPERTY将它暴露给蓝图去编辑指定生成的Actor类
   UPROPERTY(EditAnywhere)
   TSubclassOf<AActor> ProjectileClass;

然后绑定输入键

UEC++学习笔记(二)运动和物理碰撞(子弹)

并且在蓝图中绑定生成的Actor

UEC++学习笔记(二)运动和物理碰撞(子弹)

但是我们还需要子弹在角色的手部生成而不是角色的中心

打开角色的骨架并且选定生成地方的骨架,复制名称

 
//获取角色的骨架指定具体的生成位置
FVector HandLocation = GetMesh()->GetSocketLocation("Muzzle_01");

FTransform SpawnTM = FTransform(GetControlRotation(), HandLocation);

然后运行就可以成功生成子弹了,但是还有碰撞需要处理

碰撞

首先子弹需要设置的是将它的重力设置为0,不让它下坠

UEC++学习笔记(二)运动和物理碰撞(子弹)

子弹可以在直线上一直飞行,但是还是会穿墙或者穿过地板

打开子弹的SphereComp组件在细节面板中可以看到与碰撞相关的设置

UEC++学习笔记(二)运动和物理碰撞(子弹)

可以看到在默认情况下Collision Presets被设置成OverlapAllDynamic,即穿过所有通道

所以下面的所有channel(通道)都被设置成Overlap

比如穿过的墙和地板就属于WorldStatic的通道

UEC++学习笔记(二)运动和物理碰撞(子弹)

虽然在墙体中我们将它设置成BlockAll,即阻挡所有的物体,但是子弹还是会穿过墙体。因为在碰撞的过程中,永远都会选择反应最小的那个(ignore<overlap<block)。所以子弹会穿过墙体。

首先设置子弹的碰撞类型,子弹是什么类型与其他物体碰撞时就会依据选项产生不同的反应

SphereComp->SetCollisionObjectType(ECC_WorldDynamic);

因为子弹运动时的所以将它设置为动态

也可以通过设置子弹的碰撞预设

UEC++学习笔记(二)运动和物理碰撞(子弹)

第一个设置预设的名称

第二个是碰撞的反应,有四种No Collision,Query Only(No Physics Collision),Physics Only(No Query Collision),Collision Enable(Query and Physics)

Physics是字面上的意思,Query是对角色的运动进行查询,比如是否还能继续前进或者是否被什么东西挡住,不是实际上物理的力而只是查询

这里并没有用到力,所以选择QueryOnly

我们不希望它对摄像机做出反应,所以设置为ignore,但是希望会被墙阻挡,所以block

UEC++学习笔记(二)运动和物理碰撞(子弹)

最后在c++中设置

SphereComp->SetCollisionProfileName("MagicProjectile");

以下是关于碰撞过滤的教程链接

https://www.unrealengine.com/en-US/blog/collision-filtering文章来源地址https://www.toymoban.com/news/detail-450326.html

到了这里,关于UEC++学习笔记(二)运动和物理碰撞(子弹)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity入门7——物理系统之碰撞检测

    一、刚体 Rigid Body ​ 刚体利用体积(碰撞器 Collider)进行碰撞计算,模拟真实的碰撞效果,产生力的作用 ​ 碰撞产生的必要条件: 两个物体都有碰撞器 Collider 至少一个物体有刚体 Mass:质量 默认为千克,质量越大惯性越大 Drag:空气阻力 根据力移动对象时影响空气阻力大

    2024年02月09日
    浏览(37)
  • DOTS Unity.Physics物理引擎碰撞事件处理

    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞事件处理以及核心相关概念。 Unity.Physics 物理引擎的主要流程与P ipeline   Unity.Physics物理引擎做仿真迭代计算的时候主要通过以下步骤来执行:   

    2024年01月18日
    浏览(39)
  • Unity --- 物理引擎 --- 触发器 与 碰撞器详解

    对第一个条件进行补充 --- 不仅要两者都具有碰撞组件,同时还需要两者的碰撞组件中都没有勾选 Is Trigger属性  1.上一篇文章中说了那么多,其实也可以总结为两个碰撞条件 --- a.两个游戏物体都具有碰撞器组件 ,如果没有的话,连碰撞检测都不会发生,也就没有所谓的碰不

    2024年02月07日
    浏览(34)
  • DOTS Unity.Physics物理引擎碰撞查询核心分析

      最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞查询以及核心相关概念。 Unity.Physics碰撞查询概述   碰撞查询(Collison Qurey)是Unity.Physics物理引擎中的一个很重要的功能。很多游戏逻辑都需

    2024年04月25日
    浏览(38)
  • Unity --- 物理引擎 ---- 刚体RigidBody 与 碰撞器 collider

      1.RigidBody(刚体)的作用是让物体具有物理特性(比如说重力,摩檫力等等) 2.如果想让物体能够与其它物体发生碰撞的话,我们还需要一个组件 --- Colider碰撞器组件 1.上图就是Unity中提供的已经准备好的各种形状的碰撞器组件 2.形成不同形状的碰撞器所需的面数不同,面数

    2024年02月16日
    浏览(29)
  • 2022-04-20 Unity入门7——物理系统之碰撞检测

    一、刚体 Rigid Body ​ 刚体利用体积(碰撞器 Collider)进行碰撞计算,模拟真实的碰撞效果,产生力的作用 ​ 碰撞产生的必要条件: 两个物体都有碰撞器 Collider 至少一个物体有刚体 Mass:质量 默认为千克,质量越大惯性越大 Drag:空气阻力 根据力移动对象时影响空气阻力大

    2023年04月09日
    浏览(26)
  • 【unity学习笔记-如何给动态的人物添加碰撞体】

    前景提要 如题,项目中想实现和人物进行简单的互动,比如点击他的手臂的时候他会播放手臂的动作,点击脚的时候播放预设的和脚有关的动画 之前我的实现方式是十分暴力的在人物模型中对应的部位添加一个子物体,给子物体添加正方体/圆体这种规则的碰撞体,然后因为他是在

    2023年04月08日
    浏览(69)
  • 信息物理系统技术-学习笔记

    一.信息物理系统的概念 信息物理系统(cyber-physical system,CPS)这一术语,最早由美国国家航空航天局于1992年提出。信息物理系统是控制系统,嵌入式系统的扩展与延伸,其涉及的相关底层理论技术源于对嵌入式技术的应用与提升。然而,随着信息化和工业化的 深度融合发展

    2024年02月11日
    浏览(31)
  • 深入分析物理引擎后,他写了一个轻量的 Cocos 3D 碰撞检测优化方案

    引言: 碰撞检测是游戏开发中一个非常重要的技术点,优化碰撞检测性能,是提升游戏体验不可或缺的一环。开发者「我叫98K」写了一个轻量碰撞系统,用以改善 3D 游戏在不同平台遇到的碰撞性能问题和包体问题。下载和在线体验地址见文末。 98K物理-轻量碰撞系统是一个高

    2024年02月03日
    浏览(30)
  • ue4 无效模拟选项:形体被设置为模拟物理,但启用碰撞不兼容

    可能是由于勾选模拟物理后,但是碰撞未启用: 碰撞预设可选第一个选项,碰撞已启用勾选已启用碰撞

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包