虚幻4C++学习文档翻译4_第1页
虚幻4C++学习文档翻译4_第2页
虚幻4C++学习文档翻译4_第3页
虚幻4C++学习文档翻译4_第4页
虚幻4C++学习文档翻译4_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Chapter8-3创建一个继承自GameMode父类,其名称为GameModeGameModeMyUse在蓝图中创建继承自GameModeMyUse的蓝图类GameModeMyUse同时在默认的Pawn中选择 BP_Avatar这个角色,也就是我们之前所新建的角色最后打开世界设置,在默认的游戏模式GameMode中选取我们自己创建的蓝图类GameModeMyUse,那么再次运行游戏时效果如下:与此同时,我们也发现我们无法操控人物行动,那是因为我们没有绑定人物的控制按键打开项目设置,选择input选项最终达到这样效果,从这些按键绑定中可以看到由于有初学者的案例加入进来,所有绑定的按键很多。那我

2、们先不用管其他已经有的按键绑定,我们先添加自己的按键MyMoveForward和MyMoveRight用W和D的按键来操作人物前和右方向行走。但是仅仅按键绑定人物还并不能移动。我们需要添加C+代码来操控使得人物可以行走打开VS的编译器,在我们初始创建过的Avatar.h的头文件中我们修改如下/ 绑定用户输入操作virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;/向右移动void MoveRight(float amount);/向前移动void MoveForward(f

3、loat amount);截图如下头文件定义好之后,我们需要在源文件中将功能具体实现/ 绑定用户按键输入操作void AAvatar:SetupPlayerInputComponent(class UInputComponent* InputComponent)Super:SetupPlayerInputComponent(InputComponent);/绑定项目设置中按键与头文件中函数功能InputComponent->BindAxis("MyMoveForward", this, &AAvatar:MoveForward);InputComponent-

4、>BindAxis("MyMoveRight", this, &AAvatar:MoveRight);从这一段绑定用户按键输入操作我们可以看出来,我们将项目设置中的按键名称与我们的函数功能名称进行再一次的绑定void AAvatar:MoveRight(float amount)/若控制器和移动的数值都存在if (Controller && amount)/获取右转三维向量FVector right = GetActorRightVector();/将移动输入的大小添加到玩家前进向量之中AddMovementInput(right, amoun

5、t);这两段我们通过调用虚幻内置的API使得玩家可以操控前进和右转。那么对于左转和后退来说,我们可以在项目设置中重新以上面的方式再次绑定两个按键操作,或者添加两个其他按键并将scale设置为-1当然我们不能仅仅只控制前后左右的移动,我们还需要设置鼠标的旋转和倾斜我们在项目设置中新添加MyYaw 和 MyPitch 两个输入按键操作绑定用户操作内容更新如下void AAvatar:Yaw(float amount)AddControllerYawInput(200.f*amount*GetWorld()->GetDeltaSeconds();void AAvatar:Pitch(float

6、 amount)AddControllerPitchInput(200.f*amount*GetWorld()->GetDeltaSeconds();这是新添加的对旋转效果的功能添加,本质上还是调用API,比较方便功能的实现以上基本实现了玩家简单控制人物的效果,当然现在测试起来人行动的并不自然这和我们自带的第三人称效果还有一定的差距创建非玩家实体 Create None-player character entity NPC这个创建方式和创建我们自身控制的角色类型相同,同样也是从添加C+代码到项目中选择Character 作为父类进行继承我们希望这个NPC可以告诉玩家一些信息,那么我们将

7、会使用到FString,FString 是用来代替C+的STL函数库中string的,他有良好的跨平台的特性,所以在UE4中使用C+进行编程我们需要使用字符串类型的话就用FString好了。/作为NPC的实体碰撞器UPROPERTY(VisibleAnywhere,BlueprintReadOnly, Category = "Collision")TSubobjectPtr<class USphereComponent>ProxSphere;/NPC所需要传递的话UPROPERTY(EditAnywhere, BlueprintReadWrite, Catego

8、ry = "NPCMessage")FString NPCMessage;添加在NPC的头文件中在这之后在UE4编辑器中添加继承自该类的蓝图类。注:本人在测试此部分时,如果在头文件中加入实体碰撞器会出现Crash的情况,报错说需要初始化,有可能是我使用的是4.7版本更新,而教材书籍仅仅是老版本,所以我最后将创建碰撞器这句话去掉,在创建出蓝图实体后是依然会有碰撞体的,最后我们加上mesh,给NPC的message附上信息,放入场景之中。创建和NPC的对话窗体我们需要创建一个继承自HUD的类UCLASS()class CPLUSLEARN_API AMyHUDMessage :

9、 public AHUDGENERATED_BODY()public :UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HUDFont)UFont *hudFont;virtual void DrawHUD() override;void AMyHUDMessage:DrawHUD()Super:DrawHUD();DrawLine(200, 300, 400, 500, FLinearColor:Blue);DrawText("欢迎来到虚幻的世界!", FVector2D(0, 0), hudFont, FVe

10、ctor2D(1, 1), FColor:White);我们在自己的HUD的类中定义了一个字体,并且在界面上绘出一个线框和文字重新编译项目,我们进入UE4中,创建一个继承自MyHUD的蓝图类,同时设置我们自己的字体信息。最后在我们的游戏模式中将默认的HUD改成我们自己创建的HUD下面我们要用一个一个列表来存放这些对话的信息,我们打开自己创建的C+的HUD类void AMyHUDMessage:DrawHUD()Super:DrawHUD();/DrawLine(200, 300, 400, 500, FLinearColor:Blue);/DrawText("hello",

11、 FVector2D(0, 0), hudFont, FVector2D(1, 1), FColor:White);for (int c = messages.Num() - 1; c >= 0; c-)float outputWidth, outputHeight, pad = 10.f;/定义输出的宽度高度和间隔/获取出信息内容大小GetTextSize(messagesc.message, outputWidth, outputHeight, hudFont, 1.f);float messageH = outputHeight + 2.f*pad;/信息的高度就是输出高度+2倍的

12、间隔float x = 0.f, y = c*messageH;/绘制出背景DrawRect(FLinearColor:Black, x, y, Canvas->SizeX, messageH);/使用字体绘制出我们的信息(信息,颜色,宽度+边距,高度+边距,字体)DrawText(messagesc.message, messagesc.color, x + pad, y + pad, hudFont);/时间逐步缩减messagesc.time -=GetWorld()->GetDeltaSeconds();/当该条消息的时间小于0的时候将该条信息移除if (messagesc

13、.time < 0)messages.RemoveAt(c);void AMyHUDMessage:addMessage(Message msg)messages.Add(msg);下面我们必须要完成我们的NPC实体UCLASS()class CPLUSLEARN_API ANonePlayerEntity : public ACharacterGENERATED_UCLASS_BODY()public:/ Sets default values for this character's propertiesANonePlayerEntity();/ Called when th

14、e game starts or when spawnedvirtual void BeginPlay() override;/ Called every framevirtual void Tick( float DeltaSeconds ) override;/ Called to bind functionality to inputvirtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;/NPC所需要传递的话UPROPERTY(EditAnywhere, Bluepri

15、ntReadWrite, Category = NPCMessage)FString NPCMessage;/碰撞器触发器UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Collision)TSubobjectPtr<class USphereComponent> ProxSphere;/碰撞事件UFUNCTION(BlueprintNativeEvent, Category = "Collision")void Prox(AActor* otherActor, UPrimitiveCompone

16、nt* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);这个是我们自己的NPC类的头文件,我们新添加了碰撞检测事件,里面的参数都是固定的API的参数,指定是Collision类别的碰撞器才会触发这个碰撞事件ANonePlayerEntity:ANonePlayerEntity(const class FPostConstructInitializeProperties &PCIP) :Super(PCIP) / Set this character to call

17、 Tick() every frame. You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;ProxSphere = PCIP.CreateDefaultSubobject<USphereComponent>(this, TEXT("Proximity Sphere");/放置在根节点下面ProxSphere->AttachTo(RootComponent);/设置碰撞半径ProxSphere-

18、>SetSphereRadius(32.f);/当有人进去碰撞区域ProxSphere->OnComponentBeginOverlap.AddDynamic(this, &ANonePlayerEntity:Prox);NPCMessage = "Hi , i am Owner"/设置默认的NOC对话/ Called when the game starts or when spawnedvoid ANonePlayerEntity:BeginPlay()Super:BeginPlay();/ Called every framevoid ANoneP

19、layerEntity:Tick( float DeltaTime )Super:Tick( DeltaTime );/ Called to bind functionality to inputvoid ANonePlayerEntity:SetupPlayerInputComponent(class UInputComponent* InputComponent)Super:SetupPlayerInputComponent(InputComponent);void ANonePlayerEntity:Prox_Implementation(AActor * otherActor, UPr

20、imitiveComponent* othrComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)/碰撞发生事情,当有交互时/将其他玩家进入该区域转化为avatar,如果是空物体的,那么直接返回if (Cast<AAvatar>(otherActor) = nullptr)return;/获取当前控制者APlayerController* PController = GetWorld()->GetFirstPlayerController();/如果控制者存在if (PC

21、ontroller)/将当前控制者的HUD转化为我们自己定义的HUD类AMyHUDMessage *hud = Cast<AMyHUDMessage>(PController->GetHUD();/添加NPC信息进入当前控制者的HUD对象中hud->addMessage(Message(NPCMessage, 5.f, FColor:White);对于源文件中的功能我上面已经写有非常详细的注释了。最后效果是每当我们的人物碰撞时都会有默认的一个消息显示在我们的屏幕上方,过我们默认的时间后会自动销毁。那么最后我们来完善一下我们的整个消息/创建一个完整信息的结构体struct

22、 Message FString message;float time;FColor color;UTexture2D *tex;Message()time = 5.f;color = FColor:White;Message(FString iMessage, float iTime, FColor iColor, UTexture2D* iTex)message = iMessage;time = iTime;color = iColor;tex = iTex;修改消息结构体,我们需要给每个对话的人一个头像。源文件中添加这句/绘制出背景DrawRect(FLinearColor:Black

23、, x, y, Canvas->SizeX, messageH);在NPC的头文件中添加/NPC的名称UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = NPCMessage)FString name;/NPC图片UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = NPCMessage)UTexture2D* Face;NPC的源文件中修改void ANonePlayerEntity:Prox_Implementation(AActor * otherActor, UPri

24、mitiveComponent* othrComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)/碰撞发生事情,当有交互时/将其他玩家进入该区域转化为avatar,如果是空物体的,那么直接返回if (Cast<AAvatar>(otherActor) = nullptr)return;/获取当前控制者APlayerController* PController = GetWorld()->GetFirstPlayerController();/如果控制者存在if (PCo

25、ntroller)/将当前控制者的HUD转化为我们自己定义的HUD类AMyHUDMessage *hud = Cast<AMyHUDMessage>(PController->GetHUD();/添加NPC信息进入当前控制者的HUD对象中hud->addMessage(Message(name+FString(": ")+NPCMessage, 5.f, FColor:White,Face);最后的效果如下图所示:那么NPC的简单对话之所就基本完成了最后我们希望添加给用户一个生命值的效果首先我们需要在avatar中定义生命当前数值和最大数值UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HPInformation)float HP;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HPInformation)float MA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论