Unreal Engine:装備している武器を取り外して素手に戻る

持っている武器が邪魔くさくなった時に、装備している武器をコントローラボタンを押すことで取り外して素手に戻れるようにします。武器を持って戦うよりも素手で戦いたい時にあると便利な機能です。ただ、一度取り外した武器を再装備することはできません。

スポンサーリンク

DropWeapon関数

MyCharacter.hのprotectedエリアに幾つかの関数を宣言します。

void DropWeapon();

void GPYPressed();
void GPYReleased();

MyCharacter.cppに関数を定義します。

void AMyCharacter::DropWeapon()
{
	if (EquippedWeapon)
	{
		FDetachmentTransformRules DetachmentTransformRules(EDetachmentRule::KeepWorld, true);
		EquippedWeapon->GetItemMesh()->DetachFromComponent(DetachmentTransformRules);
	}
}

void AMyCharacter::GPYPressed()
{
	DropWeapon();
}

void AMyCharacter::GPYReleased()
{

}

アクションマッピングにデタッチボタンを設定します。


MyCharacter.cppのSetupPlayerInputComponentにデタッチボタンを設定する。

PlayerInputComponent->BindAction("Detach", IE_Pressed, this, &AMyCharacter::GPYPressed);
PlayerInputComponent->BindAction("Detach", IE_Released, this, &AMyCharacter::GPYReleased);
スポンサーリンク

武器装着後特殊効果を無効にする

炎の剣は視覚的に良いのですが、剣を装着した後は炎がうざくなる時もあります。なので、好みによって装着後に炎を消せるようにします。先ず、Item.cppにIdleParticlesComponentのgetterを記述します。

FORCEINLINE UParticleSystemComponent* GetIdleParticlesComponent() const {	return IdleParticlesComponent; }

Weapon.hに関数とbool型変数の宣言を記述します。

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Weapon)
bool bWeaponParticles;

void ParticleEffects();

Weapon.cppに変数のデフォルト値を設定します。

AWeapon::AWeapon() :
	bWeaponParticles(false)

ヘッダーファイルを追加します。

#include "Particles/ParticleSystemComponent.h"

ParticleEffects関数の定義を記述します。

void AWeapon::ParticleEffects()
{
	if (!bWeaponParticles)
	{
		GetIdleParticlesComponent()->Deactivate();
	}
	else
	{
		GetIdleParticlesComponent()->Activate();
	}
}

MyCharacter.cppのEquipWeapon関数にParticleEffects関数を追加します。

void AMyCharacter::EquipWeapon(AWeapon* WeaponToEquip)
{
        GetItemMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
	GetItemMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Ignore);
	GetItemMesh()->SetSimulatePhysics(false);
	if (WeaponToEquip)
	{		
		const USkeletalMeshSocket* HandSocket = GetMesh()->GetSocketByName(FName("RightHandSocket"));
		if (HandSocket)
		{
			HandSocket->AttachActor(WeaponToEquip, GetMesh());
		}
		EquippedWeapon = WeaponToEquip;
		EquippedWeapon->ParticleEffects();
	}
}

これでWeapon Particleにチェックを入れないと、武器装着後に武器の特殊効果が無効になります。

剣を取り外しても剣が落下しないのは、剣に物理が働いていないからです。取り外した剣を落下させる場合は、新たに落下ステートを設定する必要があります。

スポンサーリンク
スポンサーリンク

コメント

タイトルとURLをコピーしました