前面的文中,我们介绍了怎么通过动画蓝图来使我们的人物有基础的行动能力及攻击能力。其中,我们的人物是有一个挥刀斩击的动作。所以,接下来,我们将创建武器。使我们的人物在挥刀时,可以斩击。
首先,打开我们的人物的骨骼,在我们的index_01_r下右键,新增一个子socket,并命名为weapon。如下:
接着,我们在刚才新建的socket中,右键,选择预置资源,我们选择一把剑,并调整剑的位置,如下图所示:
接着我们新建一个c++类,继承自Actor,并命名为WeaponActor。在这个类中添加成员,WeaponMesh,如下代码所示:
UPROPERTY(EditAnywhere, Category = mesh)
class USkeletalMeshComponent* WeaponMesh;
添加获取该成员的函数GetWaponMesh,如下:
FORCEINLINE class USkeletalMeshComponent* GetWeaponMesh() { return WeaponMesh; }
接着在构造函数中创建WeaponMesh,如下代码所示:
AWeaponActor::AWeaponActor()
{
// 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;
WeaponMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Weapon"));
static ConstructorHelpers::FObjectFinder<USkeletalMesh> MeshAssert(TEXT("/Game/InfinityBladeWeapons/Weapons/Blade/Swords/Blade_BlackKnight/SK_Blade_BlackKnight"));
WeaponMesh->SetSkeletalMesh(MeshAssert.Object);
}
既然我们已经创建好了武器,现在,就让我们附加到我们的人物上吧,打开我们的charac类,并添加成员:
class AWeaponActor* Weapon; // 武器
接着在我们的beginplay中,生成该武器,并附加到之前我们创建的socket上,如代码所示:
void ABlogProjectCharacter::BeginPlay()
{
Super::BeginPlay(); // 记得一定先调父类的函数
//武器的添加
Weapon = GetWorld()->SpawnActor<AWeaponActor>(AWeaponActor::StaticClass());
if (Weapon != nullptr)
{
// 附加武器,保持位置
Weapon->GetWeaponMesh()->AttachToComponent(GetMesh(), FAttachmentTransformRules::KeepRelativeTransform, TEXT("weapon"));
}
}
现在编译代码,一定要记得调Super::Play,否则会发现人物无法移动。。经测试,成功,如下图所示: