Skip to main content
ARShow
ARShow
 首页 » 资源教程 » UE4教程

UE4学习笔记-人物旋转控制(c++实现)

2016年09月01日 10:13:1327890

实现目标:

点击鼠标时,人物面向鼠标点击方向。松开鼠标时,人物面向跑动方向。

基本思路:

设置一个布尔值bIsChangeRotation。按下鼠标时为真,松开鼠标时为假。每一帧检测bIsChangeRotation,如果为真,那么获得鼠标点击位置,鼠标位置与人物位置相减,获得一个向量。设置人物朝向。

代码实现:

.h文件:

  1. #include "Test1026PlayerController.h"  
  2. #include "TheTest1026PlayerController.generated.h"  
  3.   
  4. /** 
  5.  *  
  6.  */  
  7. UCLASS()  
  8. class TEST1026_API ATheTest1026PlayerController : public ATest1026PlayerController  
  9. {  
  10.     GENERATED_BODY()  
  11.       
  12. public:  
  13.     bool bIsChangeRotation;  
  14.     void ChangePlayerRotation();  
  15.     void StopChangeRotation();  
  16.     virtual void SetupInputComponent() override;  
  17.     virtual void Tick(float deltatime) override;  
  18.       
  19. };  

.cpp文件:

  1. // Fill out your copyright notice in the Description page of Project Settings.  
  2.   
  3. #include "Test1026.h"  
  4. #include "TheTest1026PlayerController.h"  
  5.   
  6. void ATheTest1026PlayerController::ChangePlayerRotation(){  
  7.     bIsChangeRotation = true;  
  8. }  
  9. void ATheTest1026PlayerController::StopChangeRotation(){  
  10.     bIsChangeRotation = false;  
  11. }  
  12.   
  13. void ATheTest1026PlayerController::SetupInputComponent(){  
  14.     Super::SetupInputComponent();  
  15.     InputComponent->BindAction("ChangeRotation", EInputEvent::IE_Pressed , this, &ATheTest1026PlayerController::ChangePlayerRotation);  
  16.     InputComponent->BindAction("ChangeRotation", EInputEvent::IE_Released, this,&ATheTest1026PlayerController::StopChangeRotation);  
  17.   
  18. }  
  19.   
  20. void ATheTest1026PlayerController::Tick(float deltatime){  
  21.     Super::Tick(deltatime);  
  22.       
  23.     if (bIsChangeRotation){  
  24.         FHitResult hit = FHitResult();  
  25.         FVector location = GetPawn()->GetActorLocation();  
  26.         GetHitResultUnderCursor(ECollisionChannel::ECC_WorldStatic, false, hit);  
  27.         FVector Direction = hit.Location - location;  
  28.         Direction.Z = 0;  
  29.         GetPawn()->SetActorRotation(Direction.Rotation());  
  30.     }  
  31. }  

部分解释:

TIck(float deltatime); 这与Unity里的Update相似,每帧调用。

  1. BindAction(   
  2.       const FName ActionName,  
  3.       const EInputEvent KeyEvent,  
  4.       UserClass* Object,  
  5.       typename FInputActionHandlerSignature::TUObjectMethodDelegate< UserClass >::FMethodPtr Func   
  6. );    
 这个函数较为复杂,我谈谈我的大致理解。如有错误请指正。这个函数的主要作用是在触发绑定事件时,调用相应函数。ActionName要与引擎项目设置里输入名称一样。(不区分大小写)
EInputEvent为输入事件,熟悉的话可以直接写出,不熟悉的话可以如上面代码,利用枚举写出。此外,几乎所有E开头的类型都是枚举的,也就是说可以利用代码提示写出来。UserClass为要绑定的类。如我这个需要使用这个类本身的两个函数,所以我填写的是this。最后一个参数就是一个指向函数的指针,也就是将要调用的函数。这一点与unity中的代理有相似之处。
评论列表暂无评论
发表评论