UE4 プラグイン - キャラクターの前に立方体が生成されます

  1. PushCube という名前の新しい空のプラグインを作成します。
    ここに画像の説明を挿入
  2. プラグイン PushCube で新しい ActorComponent を作成し、PushCubeComponent という名前を付けて
    ここに画像の説明を挿入
    、プラグイン
    ここに画像の説明を挿入
    PushCubeComponent.hを必ず選択してください。
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "PushCubeComponent.generated.h"

/**
* 向外发送立方体的组件
*/

UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))
class PUSHCUBE_API UPushCubeComponent : public UActorComponent {
    
    
	GENERATED_BODY()

public:
	// Sets default values for this component's properties
	UPushCubeComponent();

protected:
	// Called when the game starts
	virtual void BeginPlay() override;

public:
	// Called every frame
	virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

	//必须添加标识符 Category ,否则无法作把这个插件打包
	/**
	 * 开始往外推立方体 
	 * bSpawnCube: true - 产生立方体,并且退出去 false - 不产生立方体 
	 */
	UFUNCTION(BlueprintCallable, Category = "PushCube")
	void startPushing(bool bSpawnCube);

	//施加的力的大小
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PushCube")
	float force = 500.0;

	//生产的Actor
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PushCube")
	TSubclassOf<class AActor> spawnedCube;
};

PushCubeComponent.cpp

// Fill out your copyright notice in the Description page of Project Settings.

/**
* 若在项目中使用这个功能,则不需要包含常用的头文件
* 如果要打包成插件的,则需要把所有引用的详细的头文件添加上,
* 那怕是常用的Actor,也需要包含相应的头文件
*/
#include "PushCubeComponent.h"
#include "DrawDebugHelpers.h"

//下面的头文件需要包含上
#include "GameFramework/Actor.h"
#include "Engine/World.h"
#include "Components/StaticMeshComponent.h"

// Sets default values for this component's properties
UPushCubeComponent::UPushCubeComponent() {
    
    
	// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
	// off to improve performance if you don't need them.
	PrimaryComponentTick.bCanEverTick = /*true*/false;

}


// Called when the game starts
void UPushCubeComponent::BeginPlay() {
    
    
	Super::BeginPlay();


}


// Called every frame
void UPushCubeComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) {
    
    
	Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

}

void UPushCubeComponent::startPushing(bool bSpawnCube) {
    
    
	if (GetOwner()) {
    
    //宿主是否有效
		FVector startLocation = GetOwner()->GetActorLocation();
		FVector endLocation = startLocation + (GetOwner()->GetActorForwardVector() * 300.0);


		if (bSpawnCube && spawnedCube) {
    
    //是否生产方块,并且是否指定生成的Cube
			//生产方块
			GetWorld()->SpawnActor<AActor>(spawnedCube, endLocation, FRotator(0.0, 0.0, 0.0));
		}

		//发出射线,加测前方是否有静态网格体
		FHitResult hitResult;
		FCollisionQueryParams queryParams;
		bool bHit = GetWorld()->LineTraceSingleByChannel(hitResult, startLocation, endLocation, ECC_Visibility, queryParams);
		if (bHit){
    
    //击中静态网格体
			//获取根节点的静态网格体
			UStaticMeshComponent* staticMeshComp = Cast<UStaticMeshComponent>(hitResult.GetActor()->GetRootComponent());

			//获取静态网格体是否是移动的
			bool bCubeMoveable = hitResult.GetActor()->IsRootComponentMovable();
			if (staticMeshComp && bCubeMoveable){
    
    

				//绘制测试线
				DrawDebugLine(GetWorld(), startLocation, endLocation, FColor::Blue, false, 2.0);

				//施加一个力,冲击力
				/**
				* 第一个参数:冲击力的方向和大小
				* 第二个参数:骨骼名称
				* 第三个参数:是否要瞬间改变速度
				*/
				staticMeshComp->AddImpulse(GetOwner()->GetActorForwardVector() * staticMeshComp->GetMass()/*获取静态网格体质量*/ * force);
			}
		}
	}
}

  1. BP_TestCube という名前の新しいプッシュ キューブを作成します。
    ここに画像の説明を挿入

ここに画像の説明を挿入

  1. このプラグインをゲーム キャラクターに配置し、
    小さな白人男性のゲーム キャラクターの設計図をダブルクリックして
    ここに画像の説明を挿入
    、PushCube コンポーネントを追加します。
    ここに画像の説明を挿入

アトリビュート スポーンされたキューブを選択します

ここに画像の説明を挿入
設計図機能を追加します。1
を押すと推力が生成されます。2 を押すとキューブ
ここに画像の説明を挿入
ランが生成されます。
ここに画像の説明を挿入

ああ

おすすめ

転載: blog.csdn.net/wb175208/article/details/127890258