前提・実現したいこと
C++で関数を他のファイルから実行すること。
ue4でプログレスバーを他のファイルから実行できるようすること。
以下のファイルでは、
1.GamePlay.hでAdd1(float Aという関数を宣言。
2.GamePlay.cppでAdd1(float A)という関数を定義。
3.Test.hでGamePlay.hをinclude。
4.Test.cppでAdd1(0.5f)の関数を実行。
発生している問題・エラーメッセージ
'Add1'識別子が見つかりませんでした //Test.cpp "WaitMutex -FromMsBuild" はコード 6 で終了しました。 //Microsoft.MakeFile.Targets
c++
1//GamePlay.h 2 3#pragma once 4 5#include "CoreMinimal.h" 6#include "Blueprint/UserWidget.h" 7#include "Components/ProgressBar.h" 8#include "GamePlay.generated.h" 9 10UCLASS() 11class MYPROJECT3_API UGamePlay : public UUserWidget 12{ 13 GENERATED_BODY() 14 15public: 16 17 virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; 18 void Add1(float A); //別のファイルでも使用したい変数 19 void Add2(float B); 20 float Rate; 21 UProgressBar* ProgBar1; 22 UProgressBar* ProgBar2; 23 24};
c++
1//GamePlay.cpp 2 3#include "GamePlay.h" 4 5void UGamePlay::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) 6{ 7 Super::NativeConstruct(); 8 9 ProgBar1 = Cast<UProgressBar>(GetWidgetFromName("My_HP")); 10 ProgBar2 = Cast<UProgressBar>(GetWidgetFromName("2P_HP")); 11 Rate += 0.0005f; 12 13 Add1(Rate); 14 Add2(1 - Rate); 15 16 if (Rate >= 1) 17 { 18 Rate = 0.0f; 19 } 20 21} 22 23void UGamePlay::Add1(float A) 24{ 25 ProgBar1->SetPercent(A); 26} 27 28void UGamePlay::Add2(float B) 29{ 30 ProgBar2->SetPercent(B); 31}
c++
1//Test.h 2 3#pragma once 4 5#include "GamePlay.h" 6#include "Test.generated.h" 7 8UCLASS() 9class MYPROJECT3_API UTest : public UUserWidget 10{ 11 GENERATED_BODY() 12 13public: 14 virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; 15 UGamePlay Kansuu; //追加 16};
c++
1//Test.cpp 2 3#include "Test.h" 4 5void UTest::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) 6{ 7 Super::NativeConstruct(); 8 9 Add1(0.5f); //エラー 10 Kansuu.Add1(0.5f); //追加 11}
試したこと
エラーを見る限りAdd1は定義がされてないと書かれているが、GamePlay.hをインクルードしているのでAdd1という関数は知ってるはず?
GamePlay.cppをインクルードしても効果なし。
いろんなサイトを調べたが効果なし。
2つ目のエラーは調べてもよくわからす、、、
Add1(0.5f)を消せばコンパイルは正常終了する。
###追記
頂いた意見やURLを元にクラスオブジェクト?なるものを追加しました。
C++
1//Test.h 2UGamePlay Kansuu; //オブジェクトを生成(一番下の行に追加)
c++
1//Test.cpp 2Add1(0.5f); //削除 3Kansuu.Add1(0.5f); //関数の実行(同じところに追加)
###結果
ビルドは成功し、エラーも出ませんでしたが、ビルドが終了した瞬間 Unreal Engine がクラッシュし、プロジェクトは起動しなくなりました。
以降別のプロジェクトで試した結果、他ファイル(今回はTest.h)でオブジェクトを生成するとクラッシュすることが分かりました。
頂いたURLの情報では同じファイル内でやっていたことを2つのファイルで行ったのが悪かったのでしょうか。
ファイルから別のファイルにある関数を実行できるコードの例などを頂けると幸いです。
######クラッシュレポートの内容
致命的なエラー:[ファイル:D:/ build / ++ UE5 / Sync / Engine / Source / Runtime / CoreUObject / Private / UObject / UObjectGlobals.cpp] [行:2612] UObject(const FObjectInitializer&)コンストラクターが呼び出されましたが、オブジェクトではありません これは現在、NewObjectで構築されています。 たぶんあなたはそれをスタック上に構築しようとしていますが、それはサポートされていません。
補足情報
Microsoft Visual Studio C++ 2019
Unreal Engine 5
回答3件
あなたの回答
tips
プレビュー