UE5でFPSゲーム制作 Part15-武器を拾う①
最終的には今持っている武器を捨てて、落ちてる武器を拾い上げるようにしたいと思います。
武器を拾う
まずは落ちてるアイテムを認識できるようにします。
WeaponBase.h
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Weapon", meta = (AllowPrivateAccess = "true"))
class UBoxComponent* TraceBox;
FORCEINLINE class UBoxComponent* GetBox() const { return TraceBox; }
WeaponBase.cpp
TraceBox = CreateDefaultSubobject<UBoxComponent>(TEXT("HitBox"));
TraceBox->SetupAttachment(Mesh);
を追加し、銃にBoxCollisionを追加します。
プロジェクト設定→コリジョンからTrace Channelsを追加します。TraceItemと名付け、デフォルト応答をIgnoreにします。
BPI_Weaponに新しい関数を4つ作ります。
PickupWeaponとPickupInventoryという関数を作り、インプットにPlayer Characterを追加します。Drop WeaponとTraceHitItem関数は何も追加しません。
BP_PlayerCharacter
新しくカスタムイベントを追加し、UpdateShowItemInfoと名付けます。自分のカメラからLine Trace By Channelを取得します。Trace ChannelはTraceItemにします。
Actor型のHitItemという変数を作成します。自分の視点先にTraceItemのトレース応答がある場合、そのActorをHIt Itemとして取得します。
BP_WeaponBase
銃のメッシュとボックスコリジョンのコリジョンを変更しておきます。
重力で落下させたいのでMeshはSimulate PhysicsをTrueにし、CollisionEnabledはQuery and Physicsにします。
(逆にSimulate PhysicsがFalseでCollisionEnabledがQuery Onlyなら重力の影響を受けないので、壁に飾ってあったり、立てかけてあったりといった配置ができます。)
BoxコリジョンはBP_PlayerCharacterのLine Trace By Channelにのみ反応するようにします。また、CollisionEnabledはQuery Onlyにします。ここがNo Collisionになっているとトレース応答をブロックにしても反応しません。(ここで10分くらい迷った)
Pickup WeaponイベントとPickup Inventoryイベントは銃を拾う際に発生するイベントになります。要は拾った銃は物理演算や当たり判定を削除してキャラの手にアタッチするだけです。
別の銃を拾って、今の銃を捨てる際には、Drop Weaponイベントを呼び、再度物理演算や当たり判定を再開します。
次にBP_PlayerCharacterのBegin Playを編集します。
BP_PlayerCharacter
Set Timer by EventではUpdateShowItemInfoを一定時間ごとに呼び出しています。
また、最初に生成していた2本の銃はそれぞれ手持ちをPickup Weapon、もう一本はPickup Inventoryを呼び出します。
ここまででとりあえずマップに落ちている武器を認識することができました。