エディタでのデバッグや、スタンドアローンでは正常に表示されるオブジェクトが、シッピングでパッケージ化した際に消えてしまいます。(win10)
どの様な情報を書けばいいのかわからないので、情報が不足している場合は教えてください。
消えるオブジェクトはプログラム内でスポーンしているもので、(見た目は完全に消えているが)BeginPlay関数は確実に実行されています。
理由はBeginPlay関数内で行っているファイルへのログ出力が実行されているからです。またマテリアルやメッシュの読み込みに失敗しているわけでもありませんでした。
原因が推測できる方がいらっしゃいましたら教えていただけると嬉しいです。
C++
1// Fill out your copyright notice in the Description page of Project Settings. 2 3#pragma once 4 5#include "CoreMinimal.h" 6#include "GameFramework/Actor.h" 7#include "Crystal.generated.h" 8 9class UDestructibleComponent; 10 11UCLASS() 12class ACTIONCPP_API ACrystal : public AActor 13{ 14 GENERATED_BODY() 15 16 UDestructibleComponent* dest_mesh = nullptr; 17 bool break_flag = false; 18 USkeletalMesh* mesh = nullptr; 19 UMaterialInstance* material = nullptr; 20 21public: 22 // Sets default values for this actor's properties 23 ACrystal(); 24 25 // Called every frame 26 virtual void Tick(float DeltaTime) override; 27 28protected: 29 // Called when the game starts or when spawned 30 virtual void BeginPlay() override; 31 32 // 何かにぶつかると呼び出される関数 33 UFUNCTION(BlueprintCallable) 34 void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit); 35 36 // ダメージが与えられた時の処理 37 float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, class AActor* DamageCauser) override; 38 39public: 40 // オブジェクトが破壊されているかどうかを取得する 41 bool GetDamaged() const; 42}; 43
C++
1// Fill out your copyright notice in the Description page of Project Settings. 2 3 4#include "Crystal.h" 5#include "GameLib.h" 6#include "DestructibleComponent.h" 7 8// Sets default values 9ACrystal::ACrystal() 10{ 11 PrimaryActorTick.bCanEverTick = false; 12 13 dest_mesh = CreateDefaultSubobject<UDestructibleComponent>(TEXT("DestructibleMesh")); 14 dest_mesh->BodyInstance.SetCollisionProfileName("Crystal"); 15 dest_mesh->OnComponentHit.AddDynamic(this, &ACrystal::OnHit); 16 17 // アセットをContentから取得 18 static ConstructorHelpers::FObjectFinder<USkeletalMesh> mesh_asset(TEXT("/Game/Data/Meshes/Cone4_StaticMesh_DM.Cone4_StaticMesh_DM")); 19 // アセットに適用する自作マテリアルをContentから取得 20 static ConstructorHelpers::FObjectFinder<UMaterialInstance> material_asset(TEXT("/Game/Data/Materials/M_Glass_Green.M_Glass_Green")); 21 22 if (mesh_asset.Succeeded()) mesh = mesh_asset.Object; 23 else GameLib::PrintErrorLog(TEXT("Failed to load mesh asset.")); // メッシュアセットの読み込みに失敗しました 24 if (material_asset.Succeeded()) material = material_asset.Object; 25 else GameLib::PrintErrorLog(TEXT("Failed to load material asset.")); // マテリアルアセットの読み込みに失敗しました 26 27 RootComponent = dest_mesh; 28} 29 30// Called when the game starts or when spawned 31void ACrystal::BeginPlay() 32{ 33 Super::BeginPlay(); 34 35 dest_mesh->SetSkeletalMesh(mesh); 36 dest_mesh->SetMaterial(0, material); 37 dest_mesh->SetNotifyRigidBodyCollision(true); 38 dest_mesh->SetGenerateOverlapEvents(true); 39 GameLib::PrintErrorLog(_T("crystal spawn %d"), 10); 40 41 SetActorLocation(GetActorLocation() + FVector(0.f, 0.f, 55.f)); 42} 43 44// Called every frame 45void ACrystal::Tick(float DeltaTime) 46{ 47 Super::Tick(DeltaTime); 48 49 //if (GameLib::GetKey(GetWorld(), EKeys::Q)) 50 //{ 51 // TakeDamage(100.f, FDamageEvent(), nullptr, this); 52 //} 53 54 //SetActorLocation(GetActorLocation() + FVector(-10.f, 0.f, 0.f)); 55} 56 57// 何かにぶつかると呼び出される関数 58void ACrystal::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit) 59{ 60 if (OtherActor != this/* && OtherComponent->IsSimulatingPhysics()*/) 61 { 62 if (!break_flag) 63 { 64 dest_mesh->SetSimulatePhysics(true); 65 break_flag = true; 66 } 67 } 68} 69 70// ダメージが与えられた時の処理 71float ACrystal::TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, class AActor* DamageCauser) 72{ 73 return Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser); 74} 75 76// オブジェクトが破壊されているかどうかを取得する 77bool ACrystal::GetDamaged() const 78{ 79 return break_flag; 80} 81
C++
1//スポーン処理 2 FVector c_pos(size * box_num_add_x, 0.f, 100.f + crystal_add_z); 3 crystal_actors.Push(Cast<ACrystal>(GetWorld()->SpawnActor(ACrystal::StaticClass(), &c_pos))); 4
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。