視覚効果を高めるために今回は炎の剣を作成します。さらに、旋回は、キャラクターが武器とオーバーラップすることで勝手に武器を装備していましたが、今回は、キャラクターが武器とオーバーラップした時にコントローラのボタンを押すことで武器を装備するようにしました。キャラクターが武器とオーバーラップしてもボタンを押さなければ武器を装備しません。
炎の剣を作る
炎の剣を作ります。先ず、Item.hのpublicに以下のコードを記述します。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item) class UParticleSystemComponent* IdleParticlesComponent;
Item.cppに以下のヘッダーファイルを追加します。
#include "Particles/ParticleSystemComponent.h"
Item.cppのコンストラクタに以下のコードを追加します。
IdleParticlesComponent = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("IdleParticlesComponent")); IdleParticlesComponent->SetupAttachment(GetRootComponent());
Visual StudioをコンパイルしてUE4エディタを起動します。起動後、Weapon_BPを開いて、パーティクルコンポーネントを選択して使用するメッシュを決めます。
ここではメッシュを炎の剣用にp_fireにしています。
炎の位置をもう少し上に移動します。
これで炎の剣は完成しました。
ボタンを押して武器を装備する
MyCharacter.hに変数を宣言して、setterを記述します。
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Weapon) class AWeapon* EquippedWeapon; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Item) class AItem* OverlappingItem; FORCEINLINE void SetOverlappingItem(AItem* Item) { OverlappingItem = Item; }
MyCharacter.cppにヘッダーファイルを追加します。
#include "Weapon.h"
MyCharacter.hのpublicに関数を宣言します。
void Equipping(); void EquippingEnd();
Weapon.cppのonOverlapBegin関数を以下のように書き換えます。
if (OtherActor) { AMyCharacter* MyChar = Cast<AMyCharacter>(OtherActor); if (MyChar) { MyChar->SetOverlappingItem(this); } }
OnOverlapEnd関数に定義を追加します。
if (OtherActor) { AMyCharacter* MyChar = Cast<AMyCharacter>(OtherActor); if (MyChar) { MyChar->SetOverlappingItem(nullptr); } }
Weapon.hのEquip関数宣言とWeapon.cppのEquip関数定義を消して、代わりのequippingメカニズムを構築します。その前に先ず、設定→プロジェクト設定→インプットと選択してアクションマッピングを以下のように設定します。
SetupPlayerInputComponentでEquipをバインドします。
PlayerInputComponent->BindAction("Equip", IE_Pressed, this, &AMyCharacter::Equipping); PlayerInputComponent->BindAction("Equip", IE_Released, this, &AMyCharacter::EquippingEnd);
MyCharacter.hのpublicエリアにEquipWeapon関数を宣言します。
void EquipWeapon(AWeapon* WeaponToEquip);
MyCharacter.cppにEquipWeapon関数を定義します。
if (WeaponToEquip) { GetItemMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore); GetItemMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Ignore); GetItemMesh()->SetSimulatePhysics(false); const USkeletalMeshSocket* HandSocket = GetMesh()->GetSocketByName(FName("RightHandSocket")); if (HandSocket) { HandSocket->AttachActor(WeaponToEquip, GetMesh()); } EquippedWeapon = WeaponToEquip; }
MyCharacter.cppにEquipping、EquippingEnd関数を定義します。
if (OverlappingItem) { AWeapon* Weapon = Cast<AWeapon>(OverlappingItem); if (Weapon) { EquipWeapon(Weapon); SetOverlappingItem(nullptr); } } void AMyCharacter::EquippingEnd() { }
これでコントローラのXボタンを押すことで武器を装備することができるようになりました。
コメント