<前文>
Minimal Pairのアプリ開発についてですが、段々腹が座って来ました。有料で公開する事にします。
まず私はアメリカに10年程暮らしていましたが全く言語学を勉強した事がない素人ですので、本来ならば口出しする分野ではありません。しかしMinimal Pairを使用して音素の区別のトレーニングをやってみると、現状存在しているアプリやサイトではあんまり実用的ではありません。
以下にその理由を述べます。
- YouTubeにあるMinimal Pairではいつも答えが同じなため、答えを覚えてしまいます。音の区別がついたのかそれとも答えを覚えてしまったのか分からないです。
- 練習のためには最低でも5人くらいのNative Speakerに発音してもらう必要があります。一人ではその人の癖を先に覚えてしまいます。
- イギリス英語とアメリカ英語の区別がない。特にʌの音。
- 聞き取りのテストに使用するのか、音素が区別出来るように訓練するために使用しているのかが曖昧。
それで自分でソフトを作成する事にしました。
Minimal Pairは効果のあるトレーニングです。しかし自分で作成したソフトで遊んでみると意外と完璧でない事も分かって来ました。例えばLとRの音です。しかしこれは練習していくうちにLの音がdark LやLight L以外にもあるような気もしていてそのせいかもしれません。現状は良く分かっていません。
ただしほとんどの音に対してはかなりの効果があります。SとThについては練習すればすぐ区別がつきます。
ので公開して世間一般の評価を仰ごうと思いました。
ただし一般に公開するとなると、録音した発音に著作権が発生する可能性があります。日本における著作権の定義は、作者の思想や感情が表現された文芸・学術・美術・音楽などの表現方法に対する権利ですので、作者の思想や感情が表現するのが不可能な単なる単語の発音に著作権が存在するのかは正直疑問です。しかしアメリカでは単なる単語を書いた文字には著作権は発生しないという判決がある一方で、コンサートで録音した僅か1秒間のクラクションの音を他のMusician が無断で使用したら著作権違反で訴えられたりしています。
そういう訳で念のためにこのソフトのMinimal Pairに使用する音を、私自身でお金を払ってNative Speakerに発音してもらう必要があります。それにはお金がかかります。
最低でも5人くらいのNative Speakerに発音してもらう必要があります。ので有料にならざる得ません。
それで妥協案を考えました。Minimal Pairによる音素の区別がついているかの聞き取りのテストが出来るアプリも同時に開発してそちらは無料で公開する事にします。
例えば、
Fun、Fan
と二つの単語が表示されて音声が一回だけ流れます。その音を聞いてどちらの発音かを判断します。偶然でも50%の確率で当たるため、同じ音で5回程度連続でテストします。
Bug、Bag
Cup、Cap
Hut、Hat
Mud、Mad
のようにです。これで偶然で正解する確率は3%になります。
これで行く事にします。
トレーニング用のMinimal Pairですが、現状は
ʌとæのMinimal Pair
???
Fun、Fan
となっていで、???を押すとFunかFanのどちらかの音が出ます。Funを押すとFunの発音が聞けます。Fanを押すとFanの音が聞けます。何度でもです。何度も音を聞いて???の音がどちらか分かったら答えを押します。正解なら次に進みます。不正解の場合は、もう一度練習しますか?と聞かれYesなら同じ問題が、Noなら先へ進みます。
3問ぐらいやります。例えば
Bug、Bag
Cup、Cap
です。読む人は必ず別人にします。
3問終わったら今度はテストです。
Fun、Fanのどちらが読まれます。そして正解だと思う単語を選びます。
Bug、Bagのどちらが読まれます。そして正解だと思う単語を選びます。
Cup、Capのどちらが読まれます。そして正解だと思う単語を選びます。
最後にテストの結果が表示されます。
これを一組として色々な音素のMinimal Pairを何組も作成していきます。
現状はこんな風に考えていますが、Minimal Pairを使用したもっと効果的なトレーニング方法があるならVer2.0ではそちらを採用します。この継続して作成するためにも有料にするのは必要だと判断しました。
それでは今週の勉強を始めます。
<本文>
1.今週の予定
今週は以下の事を行います。
- Niagaraの勉強
- Smokeの実装
- Cascadeの勉強
- Sub UVの勉強
- RPG、戦闘後のアイテム入手
- 「20%の確率で元の世界に戻らないようにする仕組み」の実装
- 「石像との会話」の実装
- Warp Passの検証
- Good Sky をLandscapeに追加するための検証
- Dreamscape Nature : Meadows - Stylized Open World Environmentを見る
最後のDreamscape Nature : Meadows - Stylized Open World Environmentは今月、無料で配布されたアセットです。私の作成しているRPGの雰囲気に合いそうなので急遽、検証する事にしました。
2.Niagaraの勉強-Smokeの実装
公式documentのNiagara Visual Effects [1]に以下に示したようなGuideがあります。
今週はこの中のRecreate the Starter Content Smoke Effect in Niagara [2]をやっていきます。
2.1 Recreate the Starter Content Smoke Effect in Niagara [2]の勉強
まず勘違いしていたんですが、このDocumentはStarter ContentにあるCascadeのSmoke EffectのサンプルをNiagaraに作り変えるTutorialでした。
それはそれでかなり重要です。というかもっと面白さが増してきました。
更にM_smoke_subUV Materialと
Create a Sprite Particle Effect in Niagara [3]で作成したFX_Smoke Emitterを使用するそうです。
Create a Sprite Particle Effect in Niagara [3]って既に勉強している?
調べたら、2021-05-10のブログで
と簡単に説明しただけでした。後、2021-05-24のブログで
ちょっとだけ引用していました。Spriteの仕組みとはParticleにカメラに対して常に正面を向く面を貼り付けたものである。との仮説を立てていた時にそのままの内容が書かれていた文がCreate a Sprite Particle Effect in Niagara [2]にあったのでそれを引用したんでした。
それだけでした。
何で勉強しなかったんでしょう?
その理由も2021-05-10のブログで説明してありました。
要するにCreate a Sprite Particle Effect in Niagara [3]に書かれている事は既に全部知っているから勉強しません。と言う事でした。
でもSub UVの使用方法は知りませんよね。やっぱりCreate a Sprite Particle Effect in Niagara [3]は勉強する必要があります。
2.2 Create a Sprite Particle Effect in Niagara [3]を先に勉強する
こっちを先に勉強します。
Create Sprite Particle Effect in NiagaraはGuideの三番目にあるもっとも基本的なTutorialです。
それを今更勉強しなくちゃいけないのか?と思うとがっくりですが、Sub UVの使用方法を勉強出来るのはこのDocumentだけと思うとやる気が爆発してきます。
<Prerequisite Steps>
ここでもM_smoke_subUV Materialを使用します。
こいつです。
念のため、中身も見ておきます。
まずResult ノードですが先週勉強したM_cloud_lit Materialと同じでBlend ModeがTranslucentにセットされています。
まずBase Colorのノードから見てみます。
成程、Texture Sampleで使用しているTexture、T_Smoke_Tiled_Dは以下に示したように非常に精密な雲のTextureです。
一方でTexture Sampleと合成するParticle SubUVに使用されているTexture、T_Smoke_SubUVは以下に示したように8x8の雲のアニメーションを64個の絵で表したものです。
T_Smoke_SubUVはアニメーションを表すために一個一個の絵自体は雑にならざる得ません。それを補うために、非常に精密な一枚絵の雲のTextureであるT_Smoke_Tiled_Dと合成しているんです。
正しT_Smoke_Tiled_Dは大きな一枚絵ですので単に合成してもT_Smoke_SubUVに描かれている64個の雲の絵とは一致しません。それを補うのがTexCoord[0] ノードです。
TexCoord[0] ノードのDetailを見るとUTilingとVTilingがそれぞれ8にセットされています。
それをTexture SampleのUVsにつなげる事でTexture Sampleに使用されているTexture、T_Smoke_Tiled_Dは8x8の計64個の絵になります。
これと先程のT_Smoke_SubUVと合成する事で、T_Smoke_SubUVの一個、一個の絵がT_Smoke_Tiled_Dのような精密な雲の絵に変化する訳です。
簡単な例を作成しました。
T_Smoke_SubUV中の一個の絵を以下の絵とします。
T_Smoke_Tiled_Dの精密な雲の絵を以下とします。
この二つを単純に加算します。
アニメーションのための形を維持したまま、雲が細部まで綺麗に表現されています。うん。綺麗な雲になっています。
最後の実装部分は雲に色を追加する為の物ですね。
ただ実際の計算値がどうなっているのかは分かりませんね。
白い部分のRGBが1と仮定するとそれに例えばRGBが1,0,1である赤い色を掛けると白い部分が赤くなります。実際は黒い部分が赤くなるはずです。
次はOpacityの実装です。
T_Smoke_SubUVのαってどんなイメージが入っているんでしょうか?
背景が黒くなっているだけ。
???
分かりました。背景は黒だから値は0です。αの値が0と言う事は透明と言う事になります。
先程のBase Colorで「Particle colorを掛けたら、背景の方が雲より濃い色がついてしまうじゃないか?」の疑問が解けました。Base Colorの時点では背景に更に濃い色が付いているんです。しかしOpacityでその部分は透明にセットされます。
Clampして敢えて0と1の間の値にするのは何故なんでしょう?別に1以上なら完全に不透明になるだけじゃないでしょうか?
最後のノードがDepth Fadeです。
このノード、先週の勉強で雲に影をつけるなら外さないといけないノードとして紹介されていたやつです。
公式のdocumentであるDepth Expressions [4] によると
と、このノードの機能が説明されていました。
醜い線ってどんな線?と思ったらしっかり図でも説明されていました。
この赤い不透明の球と緑の透明な球の境目に出来ている線が醜い線だそうです。
これがDepth Fadeを使用すると
こうなるそうです。
うーん。このノードがないと困る時も出て来そうです。
実際、先週、勉強したParticle Shadow Castingに不透明なActorが重なったらどうなるんでしょうか?確認する必要がありますね。後でやります。
これでM_smoke_subUV Materialの実装方法については大体は理解しました。
<Project Setup>
ここはNiagara専用のFolderの作成方法やMaterialをcopyしてNiagara用のFolderに移す方法などが説明されていました。本当の初心者以外はスキップして良い部分です。当然スキップします。
<Create the System and Emitter>
Simple Sprite Burst Emitterを追加したNiagara systemを作成しています。何でこんなに丁寧に説明しているのかと思ったんですが、良く考えたらこのTutorial、Niagara systemのTutorialの一番最初のヤツでした。そりゃ丁寧に説明しますよね。
Documentの説明通りに作成しました。
ここも今の私が学ぶ事はありませんね。
<Change Renderer Settings>
ここで初めてSubUVをmaterialに使用した場合のSprite Rendererの設定方法が学べます。
まずM_smoke_subUVをmaterialにセットします。
すると以下の様なイメージがPreviewに表示されます。
これをSubUV用のRenderingに変換する為にSub Image Sizeのxとyにそれぞれ8をセットします。
そしてSubUV Blending Enabledにチェックを入れます。
するとReviewのイメージが以下のように変化します。
所でSubUV Blending Enabledは何を管理するParameterなんでしょうか?
公式DocumentのNiagara Renderers [5]によると
と書かれています。
同じ様な形の雲をBlendしても違いは分かりません。後でもっと分かり易いMaterialを作成して試してみます。
そしてSmoke SystemをLevel上に配置します。
あれ?何も表示されません。
念のためにWireFrameに変えて見ましたがSpriteが生成されていませんね。
なんでReviewとイメージが違うんでしょうか?
取りあえずこの問題は無視して先に進みます。
<Edit the Emitter Update Group Settings>
ここではEmitter Update Groupの設定をします。
ここでする事はSpawn Burst Instantaneous Moduleを外してSpawn Rate Moduleを追加します。
そしてSpawn Rate ModuleのSpawn Rateを50にセットします。
こんなに雲の色が濃くなりました。
一秒間に50個のSpriteを生成してその雲の寿命が2秒とすると少なくとも1秒間は50枚の雲が重なっている計算になります。雲の色が上記の様に濃くなるのは当然でしょう。
Level上に配置したSmoke Systemには何も表示されません。
この理由は直ぐ分かりました。ReviewのようにLoopしないので、一回しか雲を生成していなかったんです。その時を逃したら上記のような何もないイメージしか見れません。
次にEmitter State Moduleの設定を以下の様に変更しました。
雲が消えなくなりました。
このParameterの中でLoop Durationだけ意味が分かりません。
と言うのは、
Loop DurationはParticleをSpawnする時間を指定しているはずです。
Loop BehaviorをOnceにセットしてテストすると4秒後に雲が消えます。これは2秒間雲がSpawnされてそれぞれの雲の寿命が2秒であるため、最後に生成された雲の寿命が尽きるのは4秒後だからです。
次にLoop Behaviorをinfiniteにセットします。
これって結局Loop Durationがinfiniteになったと言う事だと思うんですが。
そうなるとLoop Durationの値をセットする意味ないですよね。
公式DocumentのEmitter Update Group [6]にはLoop BehaviorとLoop Durationの機能は以下の様に説明されています。
うん。やっぱりこの説明でもLoop Behaviorをinfiniteにセットした場合は、Loop Durationがinfiniteになったと解釈出来ます。
CursorをLoop Behaviorに重ねた時に表示される説明文が公式DocumentのEmitter Update Group [6]と違っていたのでそちらも読んでみます。
Infiniteの場合は、Loop Durationで指定した時間が過ぎたらすぐに次のLoopを開始するとあります。つまりLoop Durationで指定した時間が2秒でも1秒でもその時間が過ぎたらすぐに最初の状態からやり直す訳です。
成程、ある非常に特殊な条件ならばLoop Durationで指定した時間によって何らかの差が出る可能性もありますね。この説明なら。
この辺で納得しておきます。
因みにCursorをLoop Durationに重ねた時に表示される説明文は以下のものでした。
0の指定は出来ないというのは豆知識として覚えておきます。
<Particle Spawn Group Settings>
この節では主に3つの事を行っています。
- Initialize Particle ModuleのLife Timeの値の調節
- Initialize Particle ModuleのSpriteの位置、角度、そしてサイズの調節
- SubUVのイメージを全部使用するためのSubUV moduleの追加と設定
最後の「SubUVのイメージを全部使用するためのSubUV moduleの追加と設定」こそが私が知りたい事でこれを最初にやってみます。と言うのはこのDocument通りにやるとSubUV moduleを追加した時には既にspriteがいろんな箇所から発生して実際にSubUVの影響がどうなっているのか良く分からなくなってしまうからです。
以下の様なやり方が説明されていました。
まずSub UV Animation Moduleを追加します。
設定は以下の様にします。
Documentでは赤で囲った部分の値を変更して上記の値にしてくださいと書かれていましたが、私のはSub UV Animation Moduleを追加した段階で既にそうなっていました。
はい。
結果です。
雲のイメージは全く変化していません。
うーん。分からん。
ひょっとするとLife Timeの値が影響しているのかもしれません。それを変更してみます。
Document通りの設定にしました。
何も変化しません。
もうDocument通りにやってみます。
今度はSpriteのサイズを変更します。
しました。
次は回転を追加します。
もう雲のイメージが回転し始めてSubUVが効いているのか分からなくなりました。
後、ここでDocumentの方で2つの違う値が載っています。多分レアレスミスでしょうね。
雲を移動させるために初速度を追加します。
Add Velocity Moduleを追加して
以下の設定にします。
この辺は基本なのでサラッといきます。
今度はSpriteが発生する場所を変更します。
Sphere Moduleを追加します。
このModuleは球を指定してその球の中でSpriteをSpawnするそうです。
今回は64にしました。
このModule自体も調べたら結構面白そうですが、なんせSub UV Animation Moduleの使用方法も不明な状態では調べる気が起きません。
<Particle Update Group Settings>
最後ですがForceを追加しているだけです。
もう一つありました。このNiagara systemをAssetとしてSaveしていました。
これでassetにしておいてRecreate the Starter Content Smoke Effect in Niagara [2]で使用する訳ですね。
うーん。SubUVについて少しは勉強になりましたが使用方法が判明する所まではいかなかったです。
2.3 SubUVの考察など
SubUVのそれぞれのイメージにアクセスするにはどうしたら良いのかが知りたいですがそれが分かりません。
そしたらどうもSubImage Index Moduleがそれを担当しているらしいです(公式のDocumentのSubImage Index [8]から)。ところがNiagara systemではSubImage Index Moduleはどうもないらしく、代わりにParameterとして存在しているみたいです。
実際に調べて見ると
そのようです。
それでgameDev Outpost氏のUE4 - Niagara Flipbook - Part 2 – Smoke [7]にSub Image Indexの使用方法が載っていたのでそれを勉強します。
ところで今回使用したSub UV Animation Moduleは何をしているんでしょうか?
公式DocumentのParticle Spawn Group [9]には以下の説明がされていました。
うーん。と言う事はSub UV Animation ModuleでもSub UVのそれぞれのイメージを表示はしていたんでしょうか?
ひょっとしてSpawn Rateを50にセットしそれぞれのSpriteの寿命が2秒だったから100個の別々なイメージを保持しているSpriteが重なり合っていたので結果として同じイメージになっていたんでしょうか?
確認します。
Create a Sprite Particle Effect in Niagara [3]でやったのと同じ方法で、Simple Sprite Burst Emitterを含むNiagara systemを作成します。
Sprite RendererのMaterialをM_smoke_subUVに変更します。
更にSprite RendererのSub Image sizeを8,8にします。
次にParticle Update にSub UV Animation moduleを追加します。
アニメーションになっていましたね。
Sub UV Animation moduleのNode Graphicsを見たら以下の様にSub Image Indexが沢山使用されていました。
かなり回り道をしながらですが少しはSub UVの使用方法が分かって来ました。
2.4 UE4 - Niagara Flipbook - Part 2 – Smoke [7] の勉強
気が付いたらNiagaraだけでかなり時間を使ってしまったので今週は、Sub Image Indexの使い方だけ勉強します。
まずSubUVの最初のImageがSpriteに表示されるようにします。
Particle Spawn GroupにSet new or existing parameter directly Moduleを追加します。
こんな感じです。
Set Parametersの右端の+ボタンを押してSub Image Indexを追加します。
こんな感じになりました。
そしてこの数字を弄ると
SubUVのイメージが変わります。
うん。変わるんだけとT_Smoke_Tiled_Dのイメージは全く動いていないのも分かってしまいましたね。
残りは来週やる事にします。
3.Cascadeの勉強-Sub UVの勉強
3.1 CascadeにおけるSub UVの使用方法
今週はCascadeにおけるSub UVの使用方法を勉強します。
で、Niagaraで一応Sub UVの設定方法を理解したので適当にやってみます。
出来ました。
作り方を説明します。
Particle systemから新しいParticle systemを作成します。
Spriteが移動していると見にくいので、Initial Velocity Moduleを外します。
こんな感じになりました。
Initial Size Moduleを弄ってSpriteのサイズを大きくします。
Required ModuleのMaterialにセットされているMaterialをSub UV用のMaterialに変更します。(見えにくいのでBack Ground Colorを白に変更しました。)
Material はNiagaraで使用したM_smoke_subUVを使用しました。
一個のイメージだけを写すためにSub UVの値を8、8にセットします。
Sub UVはRequired Module内にありました。
はい。こんな感じになりました。
これをAnimationにする為にSub Image Index Moduleを追加します。
全てのイメージを表示するためにSub Image Index Moduleの1のOut Valに63をセットします。
はい。
あれ?
先程やった時は出来たんですが今回はイメージが全く変化しません。
先程やった奴と比べたら、先程のはRequired ModuleのInterpolation Methodの値がLinearになっていました。
直しました。
それでもAnimationになりません。
むむむ。
あ、Spawn ModuleのSpawn Rateが初期値のままでした。
一秒間に20回も同じ位置でSpriteを生成していたら全部が重なり合って一つのイメージに収束してしまいます。
Spawn ModuleのSpawn Rateの値は0にしてBurstの値を5に変更しました。
これで5個のSpriteが同時に同じ場所で生成されるはずです。
SubUVのアニメーションが出来ました。
微調整をします。
次のLoopが始まるまでに少し間がほしいのでLoop Delayの値を変更します。
Loop DelayではなくてEmitter Delayでした。場所はRequired Module内にありました。
2秒に変更しました。
Smokeの動きも少し速い気がします。Life timeを長くしてみます。
Life Time ModuleのLife timeの値を2秒にしました。
こんな感じになりました。
こんだけ出来れば十分です。
3.2 先週作成したParticle Shadow CastingのDepth Fade Nodeについて
Depth Fade Nodeを使用すると影が出来ないので外す事を習いました。
先程、「2.2 Create a Sprite Particle Effect in Niagara [3]を先に勉強する」で勉強しましたが、公式のdocumentであるDepth Expressions [4]で
Depth Fade Nodeが無いと見た目が結構やばくなる事を勉強しました。
この問題は先週作成したParticle Shadow Castingは回避しているんでしょうか?
それを確認します。
Third Person Characterをそのまま突っ込ませてみました。
別に普通です。
うーん。もう少し深く知りたいですが今の知識でDepth Fade Nodeの中の実装方法を理解するのは無理です。今回はこの問題についてはこの辺で諦めるしかなさそうです。
4.Ch4_3の確認
そういえば先週、Ch4_3 がオカシクなって途中で止めたんでした。すっかり忘れていました。
久しぶりにVisual Studio を開いてそのままにしてBlogを書いていたらVisual Studioの挙動がおかしくなって途中で中止したんでした。
Buildしてみました。
大丈夫そうですね。
一応ゲームもPlayして確認します。
普通に出来ました。
ただし一個バグを見つけてしまいました。
BlockからPlayerの操作するキャラが出ているのにMonsterが消滅しません。後でこのバグを検証します。
5.RPG、戦闘後のアイテム入手-「20%の確率で元の世界に戻らないようにする仕組み」の実装
はい。これはほとんど先週の検証で出来ています。
先週、検証したRPGGameModeBPのBranchを追加したところに更にBranchを追加します。
これで5回に1回は戻らなくなるはずです。
戦闘を何回かすると元のLevelに戻らなくなりました。
骸骨が回っていると3D 酔いが凄いです。消します。
Level内に配置されているActorに何かをする時はRPG Game Mode BPにEvent Dispatcherを作成してそれにやらせると簡単です。
RPG Game Mode BP内にEvent Dispatcherを作成します。
Delete Skull BPと名付けました。
Battle Field のLevel BP内で以下に示した様にBindさせます。
これで空中に浮遊している骸骨は消えるはずです。
戦闘後にアイテムがもらえる時はこのDispatcherを呼び出します。
テストします。
骸骨が消えました。
先週作成したWidgetを追加します。
RPG Game Mode BPから追加しました。
Battle Field のLevel BPから追加するのとどっちが整合性があるんでしょうか?分かりません。
以下の様になりました。
Widgetを消すボタンが必要ですね。作成します。
しました。
テストしたら普通にこのWidgetが消えました。
最後にですが、イラストの紋章が気に入りません。
直します。
直しました。
6.RPG、戦闘後のアイテム入手-「石像との会話」の実装
6.1 「石像との会話」の実装方法について
こんな感じで考えています。まずNPC_Person BPに似たStone‗Statue BPを作成します。
NPCとの大きな違いはTrigger boxは外付けでStone‗Statue BPの変数の一つがTrigger Boxになります。残りの仕組みは同じにします。
9体の石像全て作成せずにenumで対応します。
Exclamation markの実装ですが
こんな複雑な事をしなくてもBoxに侵入したら反応するでOKだと思います。
NPCの製作でスパゲティコードになってしまった原因は、RPG Game Mode BP内のMy Place For Event変数の値にNPCはまとめて一つにしなかった事です。
ので以下のようにそれぞれのNPCに対して全部別の対応を作成する必要が出来てしまいました。
石像との会話では開くWidgetも全部同じにします。
そしてそのWidgetの中でセリフやイメージを変えるようにします。
ただし、この方法を採用した場合はどの石像と話しをしたのかを記憶する変数が必要になります。それはRPG Game Mode BP内に作成する事にします。
取りあえずここまで制作します。
6.1 Stone Statue BPの作成
Stone Statue BPはActor クラスから作成しました。
Static Mesh、TextRender、そしてPoint Lightを追加します。
TextRenderはExclamation markを表しPoint Lightがそれを照らします。
ただしそれはその石像と会話出来る時だけです。
更に変数としてTrigger BoxをInstance Editableにして追加します。
Trigger Boxの名前はStone Statue Talkにしました。
実際のTrigger Boxは別にLevel 内に静的に配置します。それをStone Statue TalkにAssignします。
Trigger Boxに侵入したらExclamation markが光ります。
これでテストします。
2体のStone Statue BPを配置しました。
それぞれのStone Statue Talkは別のTrigger BoxにAssignされています。
Boxに侵入する前です。Exclamation markは見えません。
右のBoxに侵入しました。
右の石像のExclamation markが発現しました。
予測した通り、左の石像のExclamation markは反応していません。
6.2 石像の種類を示すEnumを作成する。
はい。出来ました。名前はE_StoneStatueとしました。
名前ですがそれぞれの石像のStatic meshの名前をそのまま入れました。
後で訳わからなくなるのを防ぐためです。
6.3 Stone Statue BPの表示する石像を選択出来る様にする
Stone Statue BP内に先程作成したE_StoneStatueから作成した変数Stone Statue Nameを追加します。
そのまま実装するとまたスパゲティコードになってしまうので関数を作成します。名前はReturn Statue Meshとします。
E_StoneStatueの要素から石像のStatic meshを選択して返す関数です。
その関数を使用して石像の種類を変更出来るようにしました。
テストします。
左の石像はBetrayal Statueになるように設定しました。
なっていますがサイズが全く違います。サイズの設定も必要です。
それぞれの石像のサイズも追加します。
Return Statue Mesh()関数の返し値にそれぞれの石像のscaleの値も返すようにします。
それぞれの石像のScale値はBattle Field mapに配置されているそれぞれの石像のScale値をそのまま使用します。
例えばBetrayal Statueならば
X=3、y=3、そしてz = 3 です。
テストします。
良い感じです。ほかの石像も試してみます。
Statue 01 です。
げ。向きが逆です。Rotationの値も設定しないといけないようです。
直しました。
他の石像も調べます。
5番目の石像であるSM_Skeleton Headです。
今度は高さの変更が必要です。
はい。追加しました。
こうなりました。
この骸骨、SM_Skeleton Headは20倍のScaleなんでちょっと雑な作りに見えますね。
やっと出来ました。
6.4 石像との会話用のWidgetを作成する。
先にWidgetを作成します。このWidgetは9体全ての石像に対応しています。
Oldman Welcome ウィジェットをコピーして改良して作成する事にします。
流石に今から9体の石像の絵を描いている時間もアイデアもありません。以下のデザインで行きます。
勿論後で差し替えます。
それぞれの石像のBGIは以下の関数で変更します。
WidgetのImageにTextureを動的に指定する場合、Make Slate Brushノードを使用する必要がありました。
すっかり忘れていました。
これでそれぞれの石像で別なBGIを表示するwidgetは出来たはずです。
テストします。
6.7 石像との会話用のWidgetを表示するための実装をする
これが結構面倒くさいはずです。
丁寧にやっていきます。
まずEnumのEPlaceForEventsに石像との会話用の要素を追加します。
PE_TalkStoneStatueとします。
Buildします。
当たり前ですが成功しました。
思い出したんですがRPGGameModeのEnumを書き変えた時は、その新しい要素がBPまで反映されるには一端UE4Editorを閉じる必要がありました。多分、.24以降ならそんな問題はなかったはずですが。
UE4Editorを開きなおしたらPE_TalkStoneStatueがBPからも使用出来るようになっていました。
StoneStatueBPでTrigger Boxに侵入した時にRPGameModeBP内の変数、My Place For Eventsの値がPE_TalkStoneStatueになるようにセットしました。
勿論、Trigger Boxから退散した時はMy Place For Eventsの値がPE_Noneになるようにセットします。
今回の石像との会話はもう一個変数が必要です。
RPGameModeBP内にそれを作成します。EnumのE_Stone Statue タイプの変数です。
名前はStone Statue Talkingとしました。
この変数もStoneStatueBPでTrigger Boxに侵入した時に値が変わります。
これで準備は出来ました。
ThirdPersonCharacterのBPからStoneStatueBPに侵入した時に開くwidgetをセットします。
RPGameModeBP内の変数、My Place For Eventsの値がPE_TalkStoneStatueだった時、
W_StoneStatueTalkウィジェットを開くようにします。
これで出来たはずです。
テストしてみましょう。
一番目の天使の石像に話しかけました。
一番目のBGIが表示されています。
文章はまだ作成していないのでNPC_Oldmanのままです。これは次に直します。
今度はとなりの石像に話してみます。
この石像は9番目の石像でした。
BGIは正確に表示されています。
6.8 石像との会話を作成する。
それぞれの石像の会話を作成します。と言ってもセリフ中身は後で考えます。今週は取りあえず動く事だけ確認します。
先週の検討では、石像との会話は簡単でNPCのような複雑な仕組みは要らないと結論づけました。しかしNPCで作成した会話のシステムは大変優れているのでそれをそのまま使用する事にしました。
以上の事を踏まえて以下のセリフを作成しました。
1のセリフの石像の名前の部分だけ変えて9種類作成しました。
これをWidgetから呼び出します。
9柱の石像でそれぞれセリフが違うので関数を作成して呼び出します。
以下の様な実装になっています。
後はAnswer ButtonもW_StoneStatueTalkウィジェット様に作り直しました。
Answer Buttonは以下の実装部でParent Widgetを呼ぶ時にそのWidgetが正確に親Widgetである必要があります。
ので親のWidgetのタイプだけAnswer Button ウィジェットが必要になります。
テストします。
はい。指定したセリフが表示されています。はいといいえの文字の配置がおかしいですね。これは後で直します。
「はい」ボタンを押すと
となりました。
「いいえ」ボタンでは
こちらも正確に表示されました。
6.9 Itemの受け取り方法について
Item受け取り用のWidgetは別に作成します。のでそのWidgetをどうやって開けるかが問題になります。
「汝に褒美を与える。」と言った後に、そのWidgetが開けるようになると良いのですが、このセリフはData Tableで管理しているためBPで干渉する事が出来ません。
そこで以下の様にしました。
「汝に褒美を与える。」と石像が答えた後に、「褒美を受け取る」ボタンを表示させます。
このボタンをクリックするとRewardと書かれたコメントを表示するように指示が出ます。
しかし実際には、このコメントがData tableから返されるや否や、以下に示したように、BranchのTrueに送られます。(W_StoneStatueTalkウィジェットのConversation Start Event内の実装です。)
この後でItemを得るWidgetを開けば良いはずです。
6.10 Item受け取りのためのWidgetの作成
Itemを受け取るWidgetは最終的には複雑になるかもしれませんが今回は非常に簡単にします。
名前はGet Items ウィジェットにしました。
まず、上のコメントですが、褒美の種類と数が変えられるようにします。
どの石像に話しかけたのかを確認します。
Angle Statue 02の場合は、Data TableのReward Enumから褒美の種類と数を決定します。
Data TableであるReward Enumは以下の様な作りになっています。
Reward がItemの種類、NumberがそのItemの個数を表しています。
その中からRandomに一個選びます。
選ばれた値をGet Items ウィジェットの変数であるReward とNumberに保存します。
これらの値は後で、戻るボタンを押した時に使用するからです。
RewardとNumberの値をAppendノードで合成して文章にします。それを別の変数であるCommentに保存します。
そのComment変数に保持されているTextを先程のコメント欄に表示します。
こんな感じです。
次にボタンの機能を追加します。
ボタンが持つ機能は二つあります。一つ目は貰ったアイテムを道具袋に追加する事です。そして2つ目は元のLevelに戻る事です。
貰ったアイテムを道具袋に追加する方から実装します。
最初のノードはReward変数に保持されているアイテムの名前が本当にData Tableのアイテムにあるのか確かめます。
これはItemはData Tableで管理しているので常にスペルミスをする可能性があるからです。最終的にはenumに変更するのかどうか、今の時点では不明ですが、Data Tableで管理しているため、微妙なゲームバランスの調整は出来るようになっています。
次のノードでNumber変数に保持されている値だけLoopします。勿論Loopの中でReward変数内に保持されているItemをRPG Game Instance のArrayであるItemsに要素として追加します。
これで道具袋にもらったアイテムが追加されたはずです。
次に元のLevelに戻る実装を作成します。
元のLevel名はRPG Game Instance BP内の変数、Map Name Before Battleに保持されています。それを利用して元のLevelに戻ります。
だたし、今テスト用にMap1に配置されているStone Statue BPは元々、元のLevelにいます。
のでTestのために元のLevelに戻る実装は外して、同じLevel内でWidget画面から普通のPlay画面に戻る別の実装をおこないます。
まずこのWidgetを消します。
これ最初にやったらこの後に続くノードは実行されないんじゃないの?と疑問に思うんですが何故か実行はされています。まあテスト用ですし、あまり深くは考えません。
その後で、Player の操作するキャラを固定していた機能を解除したり、Play画面でカーソルが消える事が無いようにします。
これでテストします。
褒美は回復薬が5個です。
「戻る」ボタンを押すとPlay画面に戻りました。
道具袋を開けると回復薬が5個入っています。
成功ですね。
回復薬の数もランダムになっている様です。
今週はここまでで、一端中止して検証します。
自分で発見しておいてあれですが、Preparation and Implementation Programmingの効果は凄いです。本当に先週、調査した箇所まで実装出来るとは。信じられない効率です。
6.10 石像との会話とアイテムの入手 -機能の追加と改良点-
石像との会話ではWidgetに表示する石像のイラストは全部描き直す必要があります。
石像との会話では、実装部分はこれで良いと思います。特に何処かを改良する必要はないと考えています。
唯一直す必要がある箇所は、返事のボタンに表示されるTextです。
何で2行に渡って書かれているんでしょうか?謎です。これは後で直します。
石像からのアイテムの入手手順ですが、
Get Item ウィジェットが開き、
その中でどの石像からItemをもらうのかによって対応を変化しています。
これは今思ったんですが、どの石像からItemをもらうのかによって開くWidgetを変えた方が色々なItemや武器を貰う事が出来るようになります。
のでそのように改良します。これは来週やります。
後、戦闘中に石像と会話が出来ないような実装を作るのを忘れていました。これも来週追加します。
もう1つコードを書いている間に思い付いた事を書いておきます。
9柱の石像全てと最初から会話出来るのではなく、ほとんどの石像が最初は封印されているようにします。物語が進むにつれて段々、石像と会話が出来るようになるようにします。
Warp passはWarpをするのに必要なItemとします。
Warp Passには種類があります。
Warp Passの欠片:10個でWarp Passが作れる。ただし魔法合成屋に行く必要がある。
青いWarp Pass:ある特別なWarp Spotは移動するのに青いWarp Passが必要。
赤いWarp Pass:普通のWarp Spotに赤いWarp Passを使用すると別な場所に行ける。
黄金のWarp Pass:効果は不明。世界に一個だけある金で出来たWarp Spotで使えるらしい。
銀のWarp Pass:死者の国に行けるらしい。2枚あれば死者を生き返らせる事も出来る?
銅のWarp Pass:天使の国、や悪魔の国、そして竜の国など人間が通常は行く事が許されない場所にいけるらしい。
こんなんでどうでしょうか?
8.Good Sky をLandscape 4に追加するための検証
Good SkyをLandscape4 に追加出来るのは来週以降になるのは確実なので今調べても無駄になってしまいます。ので今週はパスします。
9.Dreamscape Nature : Meadows - Stylized Open World Environmentを見る
Epic Games社の今月のFree AssetであるDreamscape Nature : Meadows - Stylized Open World Environmentが今制作中のRPGの世界観に合いそうなのでサラッとですが見てみます。
Demoから開いて見ます。
8.1 Demoの見学
かなりToon調で良いですね。
木の作りが良いです。Toon調ですが葉の付き方が本物の木の様なもっさり感があります。
水もToon調ですね。Water simulationを使用しているんでしょうか?
滝の部分ですがToon調にかなり改良している感じです。
滝の周りには霧も立ち込めています。
岩はかなり単純な作りのようです。
所々に以下に示した様な透明な板があります。
FX_fog_Cardと書かれています。何をしているのかは不明です。
Landscapeですが丸いです。
こんな作り方も出来るんですね。
黄土色の部分を選択したら以下の様にBPと表示されました。
ひょっとするとLandscapeは使用していないのかもしれません。
うーん。このTextureの繰り返し感はLandscapeを使用してそうですが。
この白い板は何をしているんでしょうか?
となっていますね。
World Outlinerから使用されているActorを調べると以下の様に大量のEffectがありました。
Niagaraで作成されたのかと思ったのですが全部Cascadeでした。
MapのFolder内にLandscapeがありました。
あれ。と思ってチェックしたら
滅茶苦茶小っちゃい領域をカバーしていました。元からある分を残しておいた感じです。
Post Process Volumeもありました。
これはまだ勉強していないので見ても良く分かりません。
Toon調にするためにPost Process Volume内で何かしているんでしょうか?
たき火がありました。
流石に火はToon調ではなかったです。
Rainbowなんてのがありました。
ほとんど見えませんが綺麗です。
BenchなどのAssetがありました。
見た目はToon調ですが影がしっかり載っています。
使用しているMaterialのNormalを調べたらしっかりNormal ノードからデータが渡されていました。
やっぱり影はMaterialのNormalで指定されるみたいですね。
草ですが生え方が複雑で作り物感がないです。
SM_Bushes_Newと言う名前でした。
花ですが全部静的に配置されています。
Landscape4を制作した時に使用したGrass Toolを使用して一気に追加出来るのか試したいです。
パッと見で面白そうなのはこの位です。
あっ。もう一つ忘れていました。
空です。BP_Sky_Sphere_Stylizedと言う名前になっています。
これはどうやって作成したんでしょうか?
Toon調でありながら非常にきれいです。
8.2 Showcaseの見学
全体像です。
思っているよりActorの数は少ないです。
細かいActorはこれだけです。これ位だったらBlenderを勉強し直したら自分で作成できそうです。
山のActorです。
これは駄目でしょう。Textureの繰り返しが丸見えです。
2,3カ月前まで私も同じような岩肌を作成していたくせに偉そうです。
8.3 その他の部分の見学
BPです。
HUDクラスが何をしているのかが分かりません。それ以外は中身をみて勉強すれば大体理解出来そうです。
今週は見学だけなので中身は見ませんが。
Effectです。
全部、Cascadeで作成されています。やっぱり今もCascadeの方が実用的なんでしょうか?
Foliageです。
うーん。Bushは非常にきれいです。ぜひRPGの何処かで使用したいです。
Propです。
うーん。今使用しているAssetと比べて特別凄い気はしませんね。影が出るのでその辺が長所かな。
Treeです。
木はどれも綺麗です。今更ですがLandscape4の木と交換するか迷います。
Waterです。
これも使用するか迷いますね。
Toon調の滝の作成方法の勉強には結構良い気がしています。
8.4 見学した感想
実用面から言うと、木や茂みは非常に綺麗で何処かで使用したいです。小物系は影があるので影のないのと交換する形なら使用してもいいかなと言う感じです。岩や山は要らないです。
Toon調の勉強面から言うと、滝や空、そして虹のBPはどうやって作成したのか結構勉強になると思います。後でBPを見てみます。
FXは一応全部見てみます。勉強になる事はいっぱいあると思います。
10.まとめと感想
今週の勉強した内容です。
- NiagaraとCascade共にSub UVの使用方法がとうとう分かりました。
- RPGでは石像との会話と石像からのItemの入手を実装しました。
- Warp Passの検証を行いました。
- 今月のFree AssetであるDreamscape Nature : Meadows - Stylized Open World Environmentをざっと見ました。
来週の予定ですが、
- Niagara とCascadeの勉強
- 石像との会話と石像からのItemの入手
- それぞれの石像のBack Ground Imageの作成
- それぞれの石像からItemを貰うときに開くWidgetの作成
- それぞれの石像のセリフの作成
- 戦闘中に石像と会話出来ない仕組みの作成
- 石像を封印する仕組みの作成
- Warp Passの作成
- Good Skyの検証
をやる予定です。
流石に今週は疲れました。
11.参照(Reference)
[1] Epic Games. (n.d.-e). Niagara Visual Effects. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/
[2] Epic Games. (n.d.-g). Recreate the Starter Content Smoke Effect in Niagara. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/HowTo/RecreateSmoke/
[3] Epic Games. (n.d.-a). Create a Sprite Particle Effect in Niagara. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/HowTo/SpriteEffect/
[4] Epic Games. (n.d.-b). Depth Expressions. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Materials/ExpressionReference/Depth/#depthfade
[5] Epic Games. (n.d.-d). Niagara Renderers. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/EmitterReference/RenderModules/
[6] Epic Games. (n.d.-c). Emitter Update Group. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/EmitterReference/EmitterUpdate/
[7] gameDev Outpost. (2020, September 23). UE4 - Niagara Flipbook - Part 2 - Smoke [Video]. YouTube. https://www.youtube.com/watch?v=okrHUHunPIQ
[8] Epic Games. (n.d.-h). SubUV Modules. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/ParticleSystems/Reference/Modules/SubUV/
[9] Epic Games. (n.d.-f). Particle Spawn Group. Unreal Engine Documentation. Retrieved July 18, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/EmitterReference/ParticleSpawn/