人之在道,若鱼之在水,得水而生,失水而死
带着问题学习。而不是越学问题越多。注意知识点之间的连贯性。
因此这一部分看看UE4的C++工程模板
01)、FPS
HUD用于绘制准心
GameMode指定了Pawn和HUDClass
另外比较重要的两个类
Character:
模型:
Mesh1P,FP_Gun指定人物骨骼和枪支骨骼
FirstPersonCameraComponent 相机
TSubclassOf<class ATemplate_FPSProjectile> ProjectileClass 获取子弹类用于spawn
位置:
GunOffset指定枪的位置
FP_MuzzleLocation指定开火位置
动画和声音
class USoundBase* FireSound;
class UAnimMontage* FireAnimation;
资源的使用:
开火:
void OnFire();
World->SpawnActor<ATemplate_FPSProjectile>(ProjectileClass, SpawnLocation, SpawnRotation);
UGameplayStatics::PlaySoundAtLocation(this, FireSound, GetActorLocation());
UAnimInstance* AnimInstance = Mesh1P->GetAnimInstance();
AnimInstance->Montage_Play(FireAnimation, 1.f);
移动人物:
void MoveForward(float Val);
AddMovementInput(GetActorForwardVector(), Value);
void MoveRight(float Val);
AddMovementInput(GetActorRightVector(), Value);
移动相机:
void TurnAtRate(float Rate);
AddControllerYawInput(Rate * BaseTurnRate * GetWorld()->GetDeltaSeconds());
void LookUpAtRate(float Rate);
AddControllerPitchInput(Rate * BaseLookUpRate * GetWorld()->GetDeltaSeconds());
输入绑定:
SetupPlayerInputComponent(UInputComponent* InputComponent)
另外还用内联函数获取相机组件和人物组件FORCEINLINE...GetMesh1P()
FORCEINLINE ...GetFirstPersonCameraComponent()
子弹类:
资源:
class USphereComponent* CollisionComp; 指定子弹的形状和碰撞体
class UProjectileMovementComponent* ProjectileMovement; 指定子弹移动组件
定义OnHit事件
OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);
这里的移动控制和相机移动控制以及骨骼模型的绑定关系都可以作为参考。
02)、第三人称模板
主要也是Character类,大致和fps的角色相同
相机和springArm
class USpringArmComponent* CameraBoom;
class UCameraComponent* FollowCamera;
控制视角旋转
float BaseTurnRate;
float BaseLookUpRate;
移动的控制:
void MoveForward(float Value);
void MoveRight(float Value);
void TurnAtRate(float Rate);
void LookUpAtRate(float Rate);
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
是继承自Character的,有很多地方并没有完全展现出来。
接下来实现自己的角色代码,以及接下来搞一搞自己的人物动作,学习一个完成的argp动作系统的建立。在学习的过程中产生问题,再带着问题回过头找解决。
ps:尝试学习了下国内的Ue4,电脑就死机了。。。
学习教程:Packt Publishing - Scripting Unreal Game Characters
1、理解Pawn和Character
Pawn是最基础的Character,继承自AActor,可以获取用户输入
Charater是一种具有mesh,collision和内置移动逻辑的Pawn
2、设置input,在默认的映射基础上添加其他按键映射
在按键绑定上的几点说明:
1)、JUMP绑定到了Character类自带的Jump函数上,另外有StopJumping
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
2)、摄像机也是用UE提供好的
PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
3)、如果想要自定义,例如
PlayerInputComponent->BindAction("Sprint",IE_Pressed,this,&AMyCharacter::BeginSprint);
PlayerInputComponent->BindAction("Sprint", IE_Released, this, &AMyCharacter::EndSprint);
PlayerInputComponent->BindAction("Reload", IE_Pressed, this, &AMyCharacter::Reload);
void AMyCharacter::BeginSprint() {
GLog->Log("Begin Sprint");//这句打印是骚操作
}
void AMyCharacter::EndSprint() {
GLog->Log("End Sprint");
}
void AMyCharacter::Reload() {
if (ReloadAnimation != nullptr) {
PlayAnimMontage(ReloadAnimation);//用于播放蒙太奇动画
}}
这里的摄像机还有几点要设置:
MySpringArm->bUsePawnControlRotation = true; //follow rotation
MyCamera->bUsePawnControlRotation = false;
人物蓝图中:
Mycharacter_BP的
use Controller ROtation Yaw设为false
CharaterMovement的:
Orient Rotation to Movement 设置为true,这样在人物跑动的动画时会跟着镜头的方向跑动
3、设置animation logic
Unreal中的动画处理是通过蓝图来做的,
在蓝图中添加添加动画状态机,
状态机的切换通过状态变量来设置<IsInAir,动画的剩余播放时间>等
发现一个坑:
蓝图里面的小于号:< ,会一直抖动,一开始我还以为是时间长度的问题,至少在上面浪费了一个小时。
写于06后:这里的问题是时间间隔,需要仔细调整调整规律,以双脚在地面上刚离开的一刻时间为主
4、设置GameMode,
自定义的Character有两种方式可以在游戏中使能控制:
1、Character蓝图中pawn->player0,这会自动的使能一个输入:player 0
2、在GameMode中设置,super easy
创建MyGameModeBase,基于此创建蓝图类,MyGameMode_BP,在里面设置Pawn为自定义Character
3、PlayerStart决定了玩家出生的位置
5、使用的assets
animation starter pack
最终效果图:
遗留问题,这里设置的reload动画使用动画蒙太奇是有问题的,如果在播放该动画时再按下移动键,这个时候就不会播放走动的动画,先看看吃鸡里相应的装弹动作应该会有感觉