素手だけだと味気ないので、何か武器を実装させたいと思います。将来的に他のアイテムもピックアップさせたいので、いきなり武器クラスから入るのではなく、先ず、アイテムクラスを作成して、そのアイテムクラスをベースに武器クラスを作成したいと思います。
武器とオーバーラップすることで自動的にその武器を装備することができるようになっています。
キャラの手にソケットを付ける
キャラの右手にソケットを付けます。先ず、キャラのメッシュやマテリアルをインポートしたフォルダに移動して骸骨アイコンをダブルクリックします。
キャラの右手をクリックすると以下のようにスケルトンツリーにRightHandがハイライトされます。
スケルトンツリーのRightHandを右クリックしてソケットを追加を選択します。
RightHandソケットをRightHandSocketに変更して、ソケットの位置を武器を持つ位置に調整します。
Infinity Blade WeaponsをEpic Gamesのマーケットプレースからダウンロードしてきてプロジェクトに追加しておきます。プレビューアセットを適当に選びます。
ソードの位置を調整することでソケットの正しい位置を調整することができます。ソードを握っているように見えればOKです。最後に保存を押します。
この後、武器の持ち位置の微調整が必要なのでタブは閉じない方がいいかもしれません。
アニメーションを使った微調整
武器装着時の攻撃用アニメーションをMixamoからダウンロードしてきてプロジェクトにインポートします。インポートしたらソード位置を微調整します。小指がめり込んでいるので、再びスケルトンに戻って刀の位置を微調整します。
握っている感を醸し出し、かつ、指がめり込んでいないことを確認して保存を押します。
アニメーションが武器の両手持ちを含む場合、片手持ちと両手持ちの両方のアニメーションを使って調整する必要があります。
アイテムクラスの作成
C++クラス→プロジェクトフォルダに入り、そこで右クリックして新しいクラスを作成します。親クラスにActorを選びクラス名をItemにしてC++クラスを作成します。
private: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item, meta = (AllowPrivateAccess = "true")) USkeletalMeshComponent* ItemMesh; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item, meta = (AllowPrivateAccess = "true")) class USphereComponent* AreaSphere;
Item.hのpublicにItemMeshとAreaSphereのgetterを記述します。
FORCEINLINE USkeletalMeshComponent* GetItemMesh() const { return ItemMesh; } FORCEINLINE USphereComponent* GetAreaSphere() const { return AreaSphere; }
Item.hのpublicにoverlap関連の関数を宣言します。
UFUNCTION() virtual void OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult); UFUNCTION() virtual void OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
Item.cppにSphereComponent.hを追加します。
#include "Components/SphereComponent.h"
コンストラクタに以下のコードを追加します。
ItemMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("ItemMesh")); RootComponent = ItemMesh; AreaSphere = CreateDefaultSubobject<USphereComponent>(TEXT("AreaSphere")); AreaSphere->SetupAttachment(GetRootComponent());
BeginPlay()にコードを追加します。
AreaSphere->OnComponentBeginOverlap.AddDynamic(this, &AItem::OnOverlapBegin); AreaSphere->OnComponentEndOverlap.AddDynamic(this, &AItem::OnOverlapEnd);
OnOverlapBeginとOnOverlapEnd関数を定義します。
void AItem::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult) { } void AItem::OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) { }
Ctrl+F5を押してUEエディタを起動後、一旦Visual Studioを閉じます。次に、さっき作成したItemクラスを親クラスにしてWeaponクラスを新規に作成します。
コメント