妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

妹、関数はわかっている

妹「関数はまあわかるんだけど、呼び方がわからないというか」

「呼び方ですか」

妹「最初にJavaの勉強してたんだけど、そこではメソッドって書いてあったんだけど、でもC++では関数とかファンクションとかなってるみたいなんだけど、これ一緒なのかなあ? と思って、心の中ではメソッドと呼んでたんだけど、これ別の物なのかなあ?」

「だいたい一緒だと思うけど、違うといえば違うかなあ」

妹「違うのか」

C++ではクラスの中にある関数をメンバー関数というんだけど、それをJavaではメソッドと呼んでる。ブループリントで言うと、レベルブループリントにある関数がトップレベル関数で、それ以外のブループリントにあるのがメンバー関数」

妹「トップレベル関数をJavaで言うと?」

Javaにはトップレベル関数みたいなのがないんだよ。どんなプログラムも全部どこかのクラスの中に書く」

妹「そんなだった気もする。でもそうかあ、違うのかあ。心の中では関数のことメソッドって呼んでたんだけどなあ。オシャレな感じあるし」

「心の中で呼ぶ分には別にいいというか、人に言う時でもそのへんは結構テキトーだよ。そのメソッドとか関数とか言う言葉にしても、プログラミング言語を作った人がそう言ってるだから」

妹「ああまたしてもテキトーな話だよ」

「だってそんなもんだもん。自分の作った言語では関数をメソッドと呼ぶって決めれば、それはそうなるんだよ。覚えやすさの問題があるから、他で使われてる言葉とかは使われやすいだけで」

妹「じゃあメソッドでいいかあ」

「じゃあ関数についてわかってるみたいだから、さらっと流す感じで」

妹「お願いします」

「プログラム、特にC++で言う関数というのは、適度に切り分けたプログラムのことで、用途毎に名前を付けておくと全体の流れがわかりやすくなる」

妹「知ってる」

「ブループリントで言うと、fの字を崩したようなアイコンが名前の左側についてるノードが関数」

妹「見たことある」

「全く同じじゃなく、ちょっとだけ違う事をやりたいという場合のために、パラメータを付ける機能がある。これが引数(ひきすう)。ブループリントでは"入力"と書いてある。ノードの左側に付いてる丸いピンのこと」

妹「つないだことがある」

「関数で計算した結果を受け取るパラメータが欲しい時もあるんで、そういう時は戻り値(もどりち)を設定する。返り値(かえりち)とも言う。ブループリントでは出力値(しゅつりょくち)となっている。ノード右側にある丸いピン」

妹「それも見たことある」

「ブループリントで関数を作るというのは、左側と右側に必要なピンのある、新しいノードを作る、という意味になる」

妹「どういう時に作ればいいんだ?」

「同じノードの同じ組み合わせを何回も作ったり、コピペしたりするようになったら、これ関数に出来るんじゃないか? というのを考える。あとはブループリントの画面が混雑してきた時」

妹「いっぱい作った方がいいのか?」

「そのへんはプログラムの規模と好みによるよ。分けることでどこに何があるかわからなくなるより、1画面に詰め込んである状態の方が落ち着く人もいる。1人で作るなら自分が作りやすい方法でいい」

妹「分けても落ち着くようにして欲しいんですが…」

「それには関数名の付け方とそれを補うコメントが大事かなあ」

「あともう1個説明しておいた方がいいようなことが…関数作るとpureっていうオプションがあるんだけど……」

妹「それはなんか難しそうだからパスしたやつだ」

「pure、つまり純粋ってことだけど、一般的に言う純粋関数とは違う。C++でいうconst指定付きの関数に相当するというけど、そっちはよく知らない。設定するとノードが緑色になって、白いexecの矢印がなくなる」

妹「いまいちピンとこないんだけど」

「例えばアクターの腕力と装備武器を元に攻撃力を返す関数……といったものはpureに分類出来るし、した方が計算のノードのつながりに混ぜやすい。でも装備の変更とか腕力の増加とかは、パラメータの書き変えだからpureにしちゃ駄目」

妹「全部不純で良くない?」

「そんな気もする。別に純粋なものを不純と言っても問題ないし。ただパラメータの計算する時に、exec付きのノードが混ざってると見た目に違和感があるかも」

妹「あとマクロは関数と違うのか?」

「使い道は似てる。でもなんというか、関数の場合1つのノードを使いまわすけど、マクロはその都度そこにノードを全部コピーしちゃうんだよ。ノードの参照と実体みたいな違いがある」

妹「どっちがいいんだ?」

「マクロの方が速いけど容量多め。だけどそれは多分気にするほどじゃなくて、どっちかというとマクロはexecピンが複数持てる事の方が重要かもしれない」

妹「複数?」

「Branchみたいなやつね。ああいうのを自分で作る時はマクロにするしかない。関数だと出口のexecピンが1個しかないから作れない」

妹「ところで一般的な意味では純粋な関数っていうのはどういうのを言うんだ?」

「引数が同じなら必ず返り値が同じで、返り値以外ほかに影響を与えない関数……この話は難しいからやめよう」