teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

UE4

UE4はUnreal Engine(アンリアルエンジン)の第4世代です。 UEは、Epic Gamesより開発されたゲームエンジンです。

Q&A

解決済

3回答

4964閲覧

includeしても変数や関数が使えない

Montake963

総合スコア1

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

UE4

UE4はUnreal Engine(アンリアルエンジン)の第4世代です。 UEは、Epic Gamesより開発されたゲームエンジンです。

0グッド

0クリップ

投稿2021/08/26 19:32

編集2021/08/27 19:42

0

0

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/08/28 03:27

別の内容になるのならこちらはクローズして新しい質問を立ててはいかがでしょう。 変更後の問題はUEに特化した話に思えます。
guest

回答3

0

解決してますが情報を残す目的で回答を記入しておきます

UObjectを継承したクラスは普通のC++のようにインスタンス化できません。
必ずUE4独自の生成方法を通してやる必要があります。
また生成方法もクラスによって異なります

UGameplayはUUserWidget型を継承しているため、
CreateWidget<T>(APlayerController, UClass) を使用してオブジェクトを生成してやる必要があります。

よって必要な対応は下記のとおりです

  1. UGamePlay Kansuu; を削除して UGamePlay* Kansuu; に変更する
  2. UGamePlay はUObjectなのでGCに回収されるのを防ぐために UPROPERTY(Transient) をつける
  3. UTestInitialize() のオーバーライドを追加し Kansuu = CreateWidget<UGamePlay>(this) をしてウィジェットを生成する
  4. ウィジェットなので Kansuu->AddToPlayerScreen() で画面に出るようにする
  5. NativeTickで Kansuu->Add1(0.5f); を呼び出す

これで動作はするようになるはずですが、UTestからWidgetを作成すること自体が想定外かもしれませんので
既に別の場所でWidgetを作っているのであれば UWidgetBlueprintLibrary::GetAllWidgetsOfClass を使用してUGameplayを取得するのが良いかもしれません。

投稿2021/09/03 11:46

MMashiro

総合スコア2380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MMashiro

2021/09/03 11:51

他に気になった点 > ProgBar1 = Cast<UProgressBar>(GetWidgetFromName("My_HP")); NativeTick内でのウィジェットの取得は処理負荷の観点から原則やめましょう WidgetとのバインドはUE4が標準で用意してくれるものがあるのでそれを使うのがセオリーです 具体的にはProgBar1にUPROPERTY(meta = (BindWidget)) をつけるだけで自動でバインドしてくれます
guest

0

ベストアンサー

1.GamePlay.hでAdd1(float Aという関数を宣言。

GamePlay.hでvoid UGamePlay::Add1(float A);という関数を宣言

4.Test.cppでAdd1(0.5f)の関数を実行。

::Add1(float)あるいはUTest::Add1(float)という関数を呼ぼうとしているが宣言された関数はないのでエラー

ということではないでしょうか。

投稿2021/08/27 06:25

thkana

総合スコア7735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Montake963

2021/08/27 20:00

UTestクラスにAdd1関数を宣言していないのは理解しています。しかし、UTestクラスはGamePlay.hをインクルードしています。インクルードとはそのファイルを丸々コピペしたものだとサイトには書かれていました。GamePlay.hではAdd1関数を宣言しているのでそれをインクルードしたUTestクラスはAdd1関数が宣言された関数であることを知っていると思っているのですが、間違っているでしょうか。 また、UTestクラスでUGamePlayクラスのAdd1関数を使用するにはどのように書き換えればよいでしょうか。
thkana

2021/08/28 03:54

回答の内容が全く理解できなかった、ということですか。 クラスは「型」です。「型」でしかありません。「型」といえばintも「型」です。intってどう使いますか? int a; などとその「型」の変数を生成しなければ、int「型」だけではなにもできません。クラスという「型」においても事情は一緒です。 確かにUGamePlayクラスはAdd1関数を含んでいます。しかしそれは「型」でしかありません。方法はいくつもありますが、例えばUGamePlay kansuu;などとしてそれを実体化しなければ(インスタンスを生成、とも言ったりしますが)UGamePlayクラスで宣言した「モノ」は使えません。(static属性:クラス関数やクラス変数というものもありますがそれはさておき) C++の基本的な事項ですので、そのへんはしっかり押さえてください。 もちろん、これは「メンバ関数を呼び出せるかどうか」だけの話ですから、関数内でなにが起こるかはちゃんとプログラマ=あなたが把握してください。 UGamePlayにはコンストラクタが宣言されていませんからデフォルトコンストラクタが呼ばれ、つまり実体化の際はメンバ変数の領域を確保したりするだけ。メンバ変数は動的な変数ですからその内容は「不定」です。つまりProgBar1は不定なポインタ。 それに対し void UGamePlay::Add1(float A) { ProgBar1->SetPercent(A); } なんてした日には...まともに動くわけがありません。 (関数の内容からUGamePlay::NativeTick()が実は本来コンストラクタであるべきもののような気もしなくはないですが) その他、クラスの生成についてUnreal Engineの制約があるのならそれに従わないければいけません。そっちは私は知りません。
guest

0

C++

1void UTest::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) 2{ 3 Super::NativeConstruct(); 4 5 Add1(0.5f); //エラー 6}

Add1() は (class UGamePlay にはあるけど) class UTest にはないからエラー。

投稿2021/08/27 04:37

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Montake963

2021/08/27 19:52

UTestにAdd1を宣言していないことは理解しています。 しかし、Test.hファイルに#include "GamePlay.h"を付けています。 ネットではincludeとはそのファイルをそのままコピペしたようなものだと書かれていました。 UGamePlayではAdd1を定義しているのでUTestクラスはAdd1がどのようなものか知っているはずではないんでしょうか。 main.cppの頭にFuncAの宣言を書くの欄を参考にしました。 https://qiita.com/sksmnagisa/items/16d6782ff4e61fe9218c
episteme

2021/08/27 23:59

GamePlay.h に定義されているのは 「class UGamePlay が Add1() を持っている」です。 UTest は UGamePlay ではないので、Add1() を呼び出せません。 > UTestクラスはAdd1がどのようなものか知っているはずではないんでしょうか。 知っています。が、それはヨソ様(UGamePlay)のもの。私(UTest)のものではありません。
Montake963

2021/08/28 02:56

何度も質問をしてしまい申し訳ございません。 少し調べたのですが、度々他のファイルにある関数を実行しているサイトを見かけます。 https://dixq.net/g/d_02.html このサイトではPlayerクラスにあるPlayer_testという関数をmain.cppで実行できています。私が最初に質問しているのと同じ方法です。サイトと私どちらも同じやり方に見えるのですが、なぜ私のはエラーが出るのでしょうか。
episteme

2021/08/28 03:52

> なぜ私のはエラーが出るのでしょうか。 繰り返す。 GamePlay.h に定義されているのは 「"class UGamePlay が" Add1() を持っている」 だから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問