LoginSignup
2
0

More than 1 year has passed since last update.

UE4のC++でWidgetを弄ってガバガバ電卓を作る

Last updated at Posted at 2021-12-17

はじめに

これは鈴鹿高専Advent Calendar2021の18日目の記事です。

作成経緯

学校課題にてマクローリン展開を用いた近似計算をC++で実装し、sin,cos,tan等…の計算が可能な電卓を作ろうというものが出た。
そしてUnrealEngine4はC++で実装できるためどうせならそれで作ろうと思い至った。

概要

使用Version:4.26.2-15973114

UE4のBlueprintをなるべく使わず、WidgetをC++で実装して電卓を作成した
Githubにてこの電卓のソースコードを挙げておくので気になる人は見てください
可読性は低いです
https://github.com/nakimikan/UE4_calc

今回の記事作成に対して特に参考にさせてもらった記事

http://mklearning.blogspot.com/2014/12/umg.html
http://kagring.blog.fc2.com/blog-entry-122.html
https://kinnaji.com/2019/03/27/calculator/
https://dokuro.moe/ue4-cpp-translation-of-child-widget-without-blueprint/
https://qiita.com/unknown_ds/items/4189b6c31322f46afdb3
そしてUE4の各リファレンス

作り方

Level作成

電卓を使う基本のlevelを作ります
といっても中身にはなにも置く必要がないので真っ暗なlevelでもなんでもいいので置きます。
image.png
レベルブループリントを開き画像の通りにノードを伸ばしてコンパイルします
image.png
これの役割はlevelを開いたらwidgetを開くことと、マウスカーソルを表示するためです

WidgetBluePrintの作成

次に基となるWidgetを作ります
右クリックで選択し、適当な名前を付けます
image.png
できたらこのWidgetを編集していきます
まずCanvasPanelがデフォルトで配置されているのでこれを消し、GridPanelを配置します
image.png
配置したらGridPanelをクリックし詳細ビューからフィルルールを変えていきます。
使うボタンの数やレイアウトのこだわりによってこれは変わってきます。
私の配置はこんな感じです。
image.png
編集できたらボタンとテキストボックスを置いていきます。
ボタンをパレットから検索してそれをGridPanelにドラッグアンドドロップすると無事配置できるはずです
image.png
テキストブロックもButtonにドラッグアンドドロップをして配置していきます
image.png
これをひたすら繰り返し、いい感じのボタン配置を作ります
そして計算結果を表示するためのテキストボックスも配置します
見やすいよう文字の大きさなども詳細ビューから変えておきます
最終的にはこうなりました
image.png
後で、C++で活用するために名前は自分のわかりやすいものをつけておきましょう
これで一旦、Widgetの編集は終わりです

C++でのWidgetクラスの作成

次に、C++でWidgetのクラスを作成していきます
C++クラスのフォルダ内で右クリックして新規C++クラスを作成します。
UserWidgetを親クラスとして適当な名前をつけて作成します
image.png
作成したクラスをVisualStudioで編集していきます
全てを解説するのはしんどいので重要そうな部分を特筆していきます。

UPROPERTY(EditAnywhere, meta = (BindWidget))
		class UButton* button_plus = nullptr;

作成した名前のボタンやテキストボックスをC++で使用するためにこれをヘッダーファイルで定義します。
これでボタンやテキストボックスの関数等を呼び出せます。

virtual void NativeConstruct() override;
virtual void NativeTick(const FGeometry&, float) override;

NativeConstructは要はコンストラクタです。
NativeTickは毎フレーム呼び出される関数...だと思ってます。もしかしたら違うかもしれません...
あとは公式リファレンスとにらめっこの時間です。頑張りましょう

UButtonの公式リファレンス
FTextの公式リファレンス
FStringの公式リファレンス

コードが書けたらC++クラスをコンパイルします。
そしてwidgetにこれを親として継承させます。
実行してみましょう
これで満足いくものができていたら妥協完成です

使い方

基本は普通の電卓と同じ
ここからクソ仕様
同じ数字を連続で入力ができず、入力する場合は→のボタンを押す仕様になっています。
sin,cos,tanなどの入力の際は近似回数を入れる必要がある
使用してる様子

やりたかったけどできなかったこと

誰か教えてください……

  • C++の関数やクラスをBluePrintで使用する方法   
     できたら圧倒的に便利
     近似式の計算式の実装をBlueprintでやるのは正気じゃない
  • UButtonのOnClickedを使用する方法

同じ数字を連続で入力ができず、入力する場合は→のボタンを押す仕様になっています。

 この仕様が存在する理由。OnClickedでなくIsPressed()を使用しているから
 IsPressed()を使っててもちゃんと考えればこの仕様をなくすことはできるとは思ったけど頭が当時回らなかった

  • 少数第8位以降の表示方法
    そもそもC++で桁数指定しての表示方法をiomanipしか知らない
    標準ライブラリのStringとかでそれができればいけるとは思う
      

  • フルスクリーンでなくWindowモードで起動する方法
     iniファイルをいじる方法をためしたけどなぜかできなかった
     BluePrintをいじる方法は試してない早くやれ

  • 試行錯誤してたときにつくったc++クラスやActorを消す方法
     どうして消せないのかわからない...
     これができないといつかファイル管理できなくて死にそうな未来が確定してる
     ただでさえファイルやらの命名センスがないのに...

  • プロジェクトの公開方法できた
     他の人はgoogledriveでやってた

まとめ

自分の無知を晒した記事となりました
ボタンとかテキストとかを簡単に配置できて実行ファイルも簡単につくれるのはいいですね
今度は普通にゲームつくりたいです
もっとUE4のC++の記事増えてほしい……

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0