お盆休みなどで実家に帰っていたり旅行に行ったりでしばらくパソコンに触れませんでした

久々に進めていきます

スマホでUE4の開発できたらいいのにな

 

http://unrealengine-blog.hatenablog.com/entry/2014/05/09/004856

 

次はスコアとHPバーを表示するみたいです

インベーダにHPバー・・・?

本物に近づけるために後で残機に改造してみよう

今は手順通り進めていく

 

HUDクラスで画面に文字を表示してみる

・コンテンツブラウザ→コンテンツ→Blueprints→新規追加→ブループリントクラス→すべてのクラス→Object→Actor→HUD→選択→名前「MyHUD」

・上部メニュー→ウィンドウ→ワールドセッティング→GameMode→選択したゲームモード→HUD Class=MyHUD

・コンテンツブラウザのMyHUDをダブルクリックで開く→イベントグラフへ移動

・ブループリント上を右クリック→イベントを追加→イベントReceiveDrawHUD

→線を引き→HUD→DrawText

→Text=Hello!、TextColor=白、ScreenX=20、ScreenY=10、ScalePositionにチェック

→Scaleから線を引き→演算→Float→float / float→下段に640

→上段から線を引きSize Xとつなげる

左上にHello!と表示された

※インベーダの数を増やしたりカメラを引いて傾けたりしてました

 

ブループリントインターフェースを作成する

・コンテンツブラウザ→コンテンツ→Blueprints→新規追加→ブループリント→ブループリントインターフェース→名前「MyInterface」

 

ここから先はこまめにコンパイルしないと呼び出せない事もあるのでおかしいなと思ったらコンパイルしてください

 

インターフェースを関連付ける

・コンテンツブラウザ→コンテンツ→Blueprints→MyGameStateをダブルクリックで開く

→上部アイコンのクラス設定→詳細→インターフェース→実装インターフェース→追加→MyInterface

・コンテンツブラウザ→コンテンツ→Blueprints→MyHUDをダブルクリックで開く

→上部アイコンのクラス設定→詳細→インターフェース→実装インターフェース→追加→MyInterface

・コンテンツブラウザ→コンテンツ→Blueprints→PlayerBuleprintをダブルクリックで開く

→上部アイコンのクラス設定→詳細→インターフェース→実装インターフェース→追加→MyInterface

 

インターフェースに関数を作る

・コンテンツブラウザ→コンテンツ→Blueprints→MyInterfaceを開く

・新規関数_0をクリック→名前「GetScore」

→詳細→アウトプット→+新規パラメータ→名前「Score」、型「Integer」

・関数→+関数→名前「AddScore」

→詳細→インプット→+新規パラメータ→名前「Score」、型「Integer」

 

MyGameStateからスコアを渡す

・コンテンツブラウザ→コンテンツ→Blueprints→MyGameStateを開く

・変数→+変数→名前「Score」、型「Integer」

・インターフェース→GetScoreをダブルクリック

(本編通りにやっても動かなかったがこうすると動いた)

・リターンノードのScoreから線を引き→変数→デフォルト→GetScore

・イベントグラフへ移動

→右クリックで→イベントを追加→イベントAddScore

→Scoreから線を引き→演算→Integer→integer + integer

→左下から線を引き→変数→デフォルト→GetScore

→右側から線を引き→変数→デフォルト→SetScore

・イベントAddScoreとSetScoreをつなぐ

 

敵が死んだらスコアを足す

・コンテンツブラウザ→Blueprints→EnemyBlueprintを開く→イベントグラフ

・敵爆発処理のSpawnActor Blueprint Effect Explosionの右上から線を引き

→クラス→MyInterface→AddScore(メッセージ)→Score=10

→ターゲットから線を引き→ゲーム→GetGameState

・AddScoreとDestoroyActorとつなぐ

 

画面にスコアを表示する

・コンテンツブラウザ→Blueprints→MyHUDを開く→イベントグラフ

・イベントReceive Draw HUDの左上から線を引き→状況に合わせた表示のチェックを外し→クラス→MyInterface→GetScore(メッセージ)

→ターゲットから線を引き→ゲーム→GetGameState

→Scoreから線を引き→ユーティリティ→ストリング→BuildString(int)

→Prefix=Score

・GetScoreとDrawTextをつなぐ

・BuildString(int)のReturnValueとDrawTextのTextをつなぐ

 

これで左上にスコアが表示されて敵が爆発すると10づつ増えます

 

 

続いてHPバーの表示

 

弾が当たるとダメージを与える

・コンテンツブラウザ→Blueprints→BulletBlueprintを開く→イベントグラフ

・イベントActorBeginOverlapから線を引き→ゲーム→ダメージ→ApplyDamage

→OtherActorとDamagedActorをつなぐ

→BaseDamage=10

→右側から線を引き→ユーティリティ→DestoroyActor

 

自機爆発処理を変更する

・コンテンツブラウザ→Blueprints→PlayerBlueprintを開く→イベントグラフ

・変数→+変数→名前「Health」、型「Integer」→コンパイル→デフォルト値=100

・イベントActorBegineOverlapを削除

・右クリック→イベントを追加→イベント→ダメージ→イベントAnyDamage

→右側から線を引き→変数→デフォルト→SetHealth

→Healthから線を引き→演算→Integer→integer - integer

→左上から線を引き→変数→デフォルト→GetHealth

→左下から線を引き→演算→Float→Floor

→Aから線を引きイベントAnyDamageのDamageにつなぐ

・SetHealthの左から線を引き→ユーティリティ→フロー制御→ブランチ

→Conditionから線を引き→演算→Integer→integer <= integer

→左上をinteger - integerにつなぐ

→TrueとSpawnActor Blueprint Effect Explosionをつなぐ

この時点で再生すると10発ぐらいまで敵の攻撃を耐えられるようになった

3発目で爆発させたいならBaseDamage=40を指定すれば良いのかな?

と試しにやってみると2発目で爆発

BaseDamage=30を指定すると3発目で爆発

なぜだろう

BaseDamage=10に戻して着弾数を数えると9発目で爆発

計算が合わないが本編とは関係なさそうなので今は気にしないでおく

 

インターフェースでHealthを渡せるようにする

・コンテンツブラウザ→Blueprints→MyInterfaceを開く

・関数→+関数→名前「GetHealth」

→詳細→アウトプット→+新規パラメータ→名前「Health」、型「Integer」

・コンテンツブラウザ→Blueprints→MyGameStateを開く

・変数→+変数→名前「Health」、型「Integer」

 

 

HPバーをテクスチャに登録

自分で描いても良いけど今回は先人者様の素材をそのまま使わせていただきます

素材をダウンロードしてHealth.pngで保存

・コンテンツブラウザ→StarterContent→Textures→インポート→Heath.png

→名前変更→T_Health

 

HPバーを表示する

・コンテンツブラウザ→Blueprints→MyHUDを開く

・関数→+関数→名前「DrawHealthBar」

→詳細→インプット→+新規パラメータ→名前「InPosition」、型「構造体→Vector2D」

→インプット→+新規パラメータ→名前「InScale」、型「Float」

→右側から線を引き→状況に合わせた表示のチェックを外し→クラス→MyInterface→GetHealth(メッセージ)

→ターゲットから線を引き→ゲーム→GetPlayerPawn

・GetHealthから線を引き→HUD→DrawTexture→Texture=T_Health、ScreenH=16、TextureV=0.5、TextureVHeight=0.5、ScalePositionにチェック

→線を引きHUD→DrawTexture→Texture=T_Health、ScreenW=128、ScreenH=16、TextureUWidth=1、TextureVHeight=0.5、ScalePositionにチェック

・DrawHealthBarのinPositionから線を引き→BreakVector2D→

→Xから線を引き→それぞれのDrawTextureのScreenXに繋ぐ

→Yから線を引き→それぞれのDrawTextureのScreenYに繋ぐ

・DrawHealthBarのinScaleから線を引き→それぞれのDrawTextureのScaleに繋ぐ

(Scaleは省略されているので▼で展開する)

・GetHealthのHealthから線を引き→演算→コンバージョン→ToFloat(int)

→右から線を引き→演算→Float→float / float→下の段に100を入力

→右から線を引き→演算→Float→float * float→下の段に128

→右から線を引き→一つ目のDrawTextureのScreenWに繋ぐ

・float / floatからもう一本線を引き→一つ目のDrawTextureのTextureUWidthに繋ぐ

 

・イベントグラフに戻りDrawTextの右から線を引き→関数呼び出し→DrawHealthBar

→InPositionのX=490、Y=15

→InScaleから線を引き→float / floatに繋ぐ

 

 

できた!

しかしやはりダメージ計算が一発分おかしい

ひとまずこのまま進めることにする

先ほどUnrealEngineのバージョンが4.17に上がった

怖いもの知らずなのでそっちで作る

開こうとするとプロジェクトはコピーさせられた

親切だ

 

http://unrealengine-blog.hatenablog.com/entry/2014/05/04/132523

 

では早速本編を追う

 

好きな位置にEnemyBlueprintをたくさん配置する

私はひとまずこんな感じにしました

 

再生すると敵自身の弾で最上段以外がすぐに爆発

折り返し地点で敵同士が衝突して爆発してしまいます

 

まずは後者の問題を解決

一匹でも端に着いたら折り返しフラグを立てて全員でその折り返しフラグを共有します

 

ゲームステートクラスの作成

・コンテンツブラウザ→コンテンツ→Blueprints→新規追加→ブループリントクラス→

→Object→Actor→Info→GameStateBase→名前「MyGameState」

(ここで誤ってGameStateから作成してしまうとはまる というかはまった)

・MyGameStateをダブルクリック→変数→+変数→名前「DirectionY」→型「Float」

→コンパイル→デフォルト値DirectionY=1

 

レベルブループリントを記述

・ブループリント→レベルブループリントを開く

・イベントTickから線を引き→ユーティリティ→Get All Actors Of Class→クラス「Actor」を選択

→線を引き→ユーティリティ→配列→ForEachLoop→OutActorsとArrayを繋ぐ

・LoopBodyから線を引き→状況に合わせた表示のチェックを外し→ユーティリティ→キャスティング→CastToEnemyBlueprint→ArrayElementとObjectを繋ぐ

・CastToEnemyBlueprintのAs Enemy Blueprintから線を引き→ユーティリティ→トランスフォーメーション→GetActorLocation

→ReturnValueから線を引き→BreakVector

→yから線を引き→演算→Float→float > float→下段に600

→再びyから線を引き→演算→Float→float < float→下段に-600

・CastToEnemyBlueprintから線を引き→ユーティリティ→フロー制御→ブランチ

→Conditionとfloat > floatを繋ぐ

→Falseから線を引き→ユーティリティ→フロー制御→ブランチ

→Conditionとfloat < floatを繋ぐ

・一つ目のブランチのTrueから線を引き→ユーティリティ→キャスティング→CastToMyGameState

→Objectから線を引き→ゲーム→GetGameState

・CastToMyGameStateから線を引き→クラス→MyStateGame→DirectionY→ターゲットとAs MyGameStateを繋ぐ

→DirectionY=-1

・2つ目のブランチのTrueから線を引き→ユーティリティ→キャスティング→CastToMyGameState

→ObjectとGetGameStateを繋ぐ

・CastToMyGameStateから線を引き→クラス→MyStateGame→DirectionY→ターゲットとAs MyGameStateを繋ぐ

→DirectionY=-1

長くなっちゃいましたのでコメントで見やすくし線を調整しました

画像ではMyStateGame2となってますがいろいろ失敗した名残です

 

次の作業はやらないとだめかどうかわからないけどはまってる時に設定しました

・ワールドセッティング→GameMode→選択したゲームモード→GameStateClass=MyGameState

 

敵のDirectionYをGameStateのDirectionYを見るように変更する

・コンテンツブラウザ→Blueprints→EnemyBlueprint

 

次の作業の前に

EnemyBlueprintのイベントグラフをもう少し見やすくするために勝手にアレンジして敵の移動を関数にまとめてしまってました

まさかすぐに変更するはめになるとも知らず

↓関数化したい項目をCTL押しながらクリックして選択した後に右クリックで「関数に折りたたむ」

関数名はMoveEnemyとしました

 

今回はそのMoveEnemyをサイトの指示に沿って編集していきます

その前にこのブループリントから

・ReverceDirectionを削除してMoveEnemyとShotBulletを繋ぐ

折り返し判定をレベルブループリントに変えたためです

 

・イベントグラフからMoveEnemyをダブルクリックで開く

・GetDirectionYを削除

・MoveEnemyから線を引き→ユーティリティ→キャスティング→CastToMyGameState

→SetActorLocationと繋ぐ

→Objectから線を引き→ゲーム→GetGameState

→AsMyGameStateから線を引き→変数→デフォルト→GetDirectionY

→float * floatの空いているところに繋ぐ(もともとDirectionYが繋がっていたところ)

 

敵がじわじわ降りてくるように若干のアレンジ

・float + floatのピンを追加→Z=-0.02

 

見やすいように配置しなおしてこんな感じ

 

続いて敵はプレイヤーの弾としか衝突しないようにする

・EnemyBlueprintのイベントグラフに移動

・イベントActorBeginOverlapから線を引き→ユーティリティ→キャスティング→CastToPlayerBlueprnt

→SpawnActorBlueprintEffectExplosionに繋ぐ

 

これで再生を押すとよい感じ

だが敵がかなりの弾幕仕様なので少しアレンジ調整する(後のセクションでやってるかもしれないけど)

 

・イベントBeginPlayから線を引く→変数→デフォルト→SetShotTimer

→ShotTimerから線を引き→演算→ランダム→RandomFloat in Range→Min=3、Max=10

 

・ShotBullet関数へ移動

・RandomFloat in Range→Min=3、Max=10に変更

 

これでよい感じに敵の弾がばらついた

 

今回ハマったおかげでGameStateの変数を様々なクラスブループリントから使えるやり方を理解できた

 

はまると辛いけど面白いツールだ

http://unrealengine-blog.hatenablog.com/entry/2014/05/01/012420

 

お次は背景とマテリアルらしい

 

背景の板を配置

・コンテンツブラウザ→コンテンツ→StarterContent→Shapes→Shape_Plane→右クリックして複製→名前「Shape_Space」

・ドラッグドロップでレベルに配置→詳細→トランスフォーム→位置X=2000、Y=0、Z=0、回転X=90、Y=0、Z=90、拡大・縮小X=50、Y=50、Z=1

(位置のX=2000は解像度でお好みで 見切れない程度に調節してください)

 

画像を作成

・上記URLにあるページから画像をT_Space.jpgという名前で保存

(これぐらいは自分で作ってもよさそう)

・コンテンツブラウザ→コンテンツ→StarterContent→Textures→インポート→T_Space.jpg

 

マテリアルを作成

・コンテンツブラウザ→コンテンツ→StarterContent→Materials→新規追加→マテリアル→名前「M_Space」

・ダブルクリックでマテリアルエディタを起動

・詳細→シェーディングモデル→Unlitに変更

・マテリアルエディタ上で右クリック→テクスチャ→Texture Sample→一番右上とエミッシブカラーを繋ぐ(ERRORが出る)

・TextureSampleをクリック→詳細→Texture→T_Space

・すべて保存

Shapeにマテリアルを割り当て

・コンテンツブラウザ→コンテンツ→StarterContent→Shapes→Shape_Spaceをダブルクリックでスタティックメッシュエディタを起動

・詳細→マテリアル→エレメント0→M_Spaceに変更

これで背景が宇宙になる

 

二重スクロール

・M_Spaceのマテリアルエディタを起動

・エディタ上で右クリック→座標→TextureCoordinate

→右から線を引き→座標→Panner→詳細→SpeedY=-0.1

→右から線を引き→TextureSampleのUVsと繋ぐ

・TexCord[0]~TextureSampleまでを選択してCtrl+C→Ctrl+vで一式をコピー

・2つ目のPannerを選択→詳細→SpeedY=-0.05

・一つ目のTextureSampleから線を引き→演算→Add

・2つ目のTextureSampleとAddのBを繋ぐ

・Addからエミッシブカラーに繋ぐ

保存して実行すると宇宙が動いた

これはすごい

 

アレンジしてみる

・2つ目のPannerを選択→詳細→SpeedX=0.01

 

縦スクロールと斜めスクロールがこんな簡単に実現できるとは

すごいツールが無料で使えるようになったものだ

 

実行していると背景がどんどん明るくなってしまうけど後で解決できるのかな?

進めてみる

 

弾のマテリアル

・コンテンツブラウザ→コンテンツ→StarterContent→Materials→新規追加→マテリアル→名前「M_PlayerBullet」

→エミッシブカラーから線を引き→演算→Multiply→詳細→Const B=5

→Aから線を引き→ベクター→Constant3Vector→詳細→Constant→R=0、G=1、B=0

・コンテンツブラウザ→コンテンツ→StarterContent→Materials→新規追加→マテリアル→名前「M_PlayerBullet」

→エミッシブカラーから線を引き→演算→Multiply→詳細→Const B=5

→Aから線を引き→ベクター→Constant3Vector→詳細→Constant→R=1、G=0、B=0

 

マテリアルの割り当て

・コンテンツブラウザ→コンテンツ→Blueprints→PlayerBulletBlueprint

→コンポーネント→StaticMesh→詳細→Materials→M_PlayerBulletを選択

→保存して閉じる

・コンテンツブラウザ→コンテンツ→Blueprints→EnemyBulletBlueprint

→コンポーネント→StaticMesh→詳細→Materials→M_EnemyBulletを選択

→保存して閉じる

・コンテンツブラウザ→コンテンツ→Blueprints→PlayerBlueprint

→コンポーネント→StaticMesh→詳細→Materials→M_Material_Copperを選択

→保存して閉じる

・コンテンツブラウザ→コンテンツ→Blueprints→EnemyBlueprint

→コンポーネント→StaticMesh→詳細→Materials→M_Material_Goldを選択

→保存して閉じる

 

再生するとやはり背景が明るくなってしまう

これは次でなおるようだ

 

・モード→ボリューム→PostProcessVolume→レベルにドラッグドロップ

→詳細→BrushSettings→X=1、Y=1、Z=1

→Post Process Volume Settings→Unboundにチェック

→Auto Exposure→Min BrightnessとMax Brightnessにチェックを入れそれぞれ1を入力

 

 

すごい!感動してしまった

引き続き作っていきます

さてさてお次は当たり判定らしい

 

http://unrealengine-blog.hatenablog.com/entry/2014/04/29/015733

 

だんだんバージョンの違いと説明が省略されてきていてついていけなくなりそうだったので極力イメージをつけて作業をしてみる

 

弾のモデルを作る

・モード→ジオメトリ→シリンダをレベルにドラッグドロップ

→詳細→Brush Settings→Z=30、Outer Radius=5

・コピーして二つにする

・コピー元を選択し→詳細→Brush Settings→スタティックメッシュを作成→ファイル名「PlayerBulletMesh」

・コピーした方も同様に→ファイル名「EnemyBulletMesh」

・レベルにある二つの弾を削除

 

弾のクラスを作る

・ブループリント→新規の空のブループリントクラス→Actor→ファイル名「BulletBlueprint」→ダブルクリックで開く

・関数→+関数→関数名「MoveBullet」

→インプット→+新規パラメータ→パラメータ名「MoveVector」、型「Vector」

→インプット→+新規パラメータ→パラメータ名「DeltaTime」、型「Float」

 

・MoveBulletのMoveVectorから線を引き→演算→ベクター→vector * float→左下からDelta Timeにつなげる

 

・vector * floatの右から線を引き→演算→ベクター→vector + vector→右から線を引き→ユーティリティ→トランスフォーメーション→GetActorLocation

 

・MoveBulletから線を引き→ユーティリティ→トランスフォーメーション→SetActorLocation→NewLocationとvector + vectorをつなぐ

 

これでいったん全て保存する

 

 

プレイヤーの弾の作成

・ブループリント→新規の空のブループリントクラス→全てのクラス→Object→Actor→BulletBlueprint→選択→クラス名「PlayerBulletBlueprint」

 

・PlayerBulletBlueprintを開く

・コンポーネントを追加→スタティックメッシュコンポーネント→詳細→StaticMesh→PlayerBulletMesh

後ろにある白い玉は気にしなくて良いのかな・・・?

 

・イベントグラフに移動

・イベントTickから線を引き→関数呼び出し→MoveBullet→MioveVectorのZ=200→DeltaSecondsとDeltaTimeをつなぐ

 

置いとくとややこしいので保存して閉じる

 

敵の弾を作成(ほぼ同じなので画像省略)

・ブループリント→新規の空のブループリントクラス→全てのクラス→Object→Actor→BulletBlueprint→選択→クラス名「EnemyBulletBlueprint」

・EnemyBulletBlueprintを開く

・コンポーネントを追加→スタティックメッシュコンポーネント→詳細→StaticMesh→EnemyBulletMesh

・イベントグラフに移動

・イベントTickから線を引き→関数呼び出し→MoveBullet→MioveVectorのZ=-200→DeltaSecondsとDeltaTimeをつなぐ

 

名称以外では一か所だけ違うので注意

 

自機から弾を発射する

・PlayerBlueprintを開く

・ブループリントのどこかで右クリック→インプット→マウスイベント→マウスの左ボタン

・Pressedから線を引き→ゲーム→クラスからアクタをスポーンします→classでPlayerBulletBlueprinmtを選択

・SpawnTransformから線を引き→演算→コンバージョン→ToTransform(vector)

・ToTransform(Vector)の左から線を引き→演算→ベクター→vector + vector→下段のZ=30

・vector + vectorの左上から線を引き→GetActorLocation

 

これで再生してクリックすると弾が発射されるようになりました

面白いなこれ

 

 

当たり判定の追加

・コンテンツブラウザ→コンテンツ→PlayerMeshを開く

・上部メニューバーのコリジョン→ボックス単純化コリジョンを追加

(6DOPが見当たらないがどれでも良かったのだろうか?意味がわかってない)

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→EnemyMeshを開く

・上部メニューバーのコリジョン→ボックス単純化コリジョンを追加

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→PlayerBulletMeshを開く

・上部メニューバーのコリジョン→ボックス単純化コリジョンを追加

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→EnemyBulletMeshを開く

・上部メニューバーのコリジョン→ボックス単純化コリジョンを追加

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→Blueprints→PlayerBlueprintを開く

・StaticMeshを選択→詳細→Collision→コリジョンプリセット→OverlapAllDynamic

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→Blueprints→EnemyBlueprintを開く

・StaticMeshを選択→詳細→Collision→コリジョンプリセット→OverlapAllDynamic

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→Blueprints→PlayerBulletBlueprintを開く

・StaticMeshを選択→詳細→Collision→コリジョンプリセット→OverlapAllDynamic

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→Blueprints→EnemyBulletBlueprintを開く

・StaticMeshを選択→詳細→Collision→コリジョンプリセット→OverlapAllDynamic

・保存して閉じる

 

・コンテンツブラウザ→コンテンツ→Blueprints→EnemyBlueprintを開く

・イベントグラフを表示

・イベントActorBeginOverlapから線を引き→ゲーム→クラスからActorをスポーンします→Class「Blueprint_Effect_Explosion」→更に線を引き→ユーティリティ→キャスティング→DestroyActor

・SpawnTransformから線を引き→演算→コンバージョン→ToTransform(vector)

・ToTransform(Vector)の左から線を引き→ユーティリティ→トランスフォーメーション→GetActorLocation
 

ここまでで弾を発射すると敵が爆発する処理ができた

 

(少し用事ができたので今日はここまで。次回はここに追記します)

 

というわけで続き

 

弾の削除

・コンテンツブラウザ→Blueprints→BulletBlueprint

・SetActorLocationから線を引き→ユーティリティ→フロー制御→ブランチ

→Trueから線を引き→ユーティリティ→構造体→DestroyActor

→Fasleから線を引き→ユーティリティ→フロー制御→ブランチ

→Trueから線を引き→DestroyActorに繋ぐ

・一つ目のブランチのConditionから線を引き→演算→Float→float > float→下段に「1000」

→上段から線を引き→演算→ベクター→Break Vector→Xにつながっていた線をzに繋ぎなおす

→Break VectorのIn Vecから線を引き→ユーティリティ→トランスフォーメーション→GetActorLocation

・2つ目のブランチのConditionから線を引き→演算→Float→float < float→下段に「-1000」

→上段から線を引き→Break Vectorのzに繋ぐ

→Break VectorのIn Vecから線を引き→GetActorLocationに繋ぐ

(少しだけアレンジしてみたけど余計に見にくいか)

 

敵からの攻撃などはヒントなしだそうです

 

掲載されたブループリントを見てまねてみます

 

敵の移動部分を関数化

・コンテンツブラウザ→Blueprints→EnemyBlueprint

・関数→+関数→名前「ReverseDirection」

・イベントグラフへ移動→SetActorLocationより後ろの処理をすべて選択(ドラッグで範囲指定)→Ctrl+x

・ReverseDirectionへ移動→Ctrl+v→ReverseDirectionと一つ目のブランチを繋ぐ

→どちらかのSetDirectionYから線を引き→リターンノードの追加

→もう一つのSetDirectionYとも繋ぐ→ブランチのFalseとも繋ぐ

 

・関数→+関数→名前「ShotBullet」

→詳細→インプット→+新規パラメータ→パラメータ名「DeltaTime」、型「Float」

・ShotBulletから線を引き→ユーティリティ→フロー制御→ブランチ

→Conditionから線を引き→演算→Float→float < float

→上段から線を引き→演算→Float→float - float

→上段から線を引き→変数へ昇格→変数名「ShotTimer」

・ShotBulletのDeltaTimeとfloat - floatの下段を繋ぐ

・ブランチのTrueから線を引き→ゲーム→クラスからアクタをスポーンします→クラス「EnemyBulletBluePrint」

→右から線を引き→変数→デフォルト→Set ShotTimer

→左下から線を引き→演算→ランダム→Random Float in Range→Min=1、Max=2

・SetShotTimerから線を引き→リターンノードの追加

・SpawnActor Enemy Bullet BlueprintのSpawnTransformから線を引き→状況に合わせた表示のチェックを外す→演算→ベクター→vector + vector→下段Z=-40

→左上から線を引き→ユーティリティ→トランスフォーム→GetActorLocation

・ブランチのFalseから線を引き→変数→デフォルト→Set ShotTimer→リターンノードに繋ぐ

→ShotTimerからvector - vectorに繋ぐ

 

・イベントグラフへ移動→SetActorLocationから線を引き→関数呼び出し→ReverseDirection

→ReverseDirectionから線を引き→関数呼び出し→ShotBullet

→DeltaTimeから線を引きイベントTickのDeltaSecondsに繋ぐ

コメントなどもつけて見やすくした

線をダブルクリックすることで「・」が追加された

このおかげでなるべく線が重ならないように見やすくできた

 

再生すると敵が弾を発射するが弾が自機にあたってもこちらが爆発しない

サイトをよく読むとひとつやり忘れがありました

 

・コンテンツブラウザ→Blueprints→PlayerBlueprint

・EnemyBlueprintのイベントグラフにある「敵爆発」の処理を丸ごとコピーして貼り付け

・コメントは自機爆発に変える

 

再生してみる

敵の弾が当たって自機が爆発

やった!

と思いきや

自機が弾を撃つと爆発した

 

PlayerBlueprintで弾の発射のvector + vector 下段のZ=40にすることで爆発しなくなりました

こんな解決方法で良かったのかな・・・?

 

ともかく次へ進みます

前回の記事を追記しました。

解決できた旨の報告と引用したURLをページ単位で入れていきます

 

 

そして先日の続きを淡々と進める

 

http://unrealengine-blog.hatenablog.com/entry/2014/04/27/211646

 

敵のインベーダを作る

・グリッドを5にする

・モード→ジオメトリ→ボックスをレベルにドラッグドロップ

→詳細→トランスフォーム→位置→X=0、Y=0、Z=60→Brush Settings→X=20、Y=5、Z=5

・ALTキーを押しながら緑の矢印をドラッグし、すぐ右にくっつける

(ALTキーを押しながら物体を移動させようとするとコピーするらしい)

 

敵ぐらいは違うものに変えてみよう

インベーダ ドットでぐぐってこのサイトに良いインベーダ絵があったので拝借

http://buzz-netnews.com/Excel_Art

真ん中のインベーダにしよう

 

CTRLとALTを駆使して以下のようなインベーダーが完成

・アウトライナでBox ブラシ~Box ブラシ60までを選択(最初をクリックしてからShiftを押しながら最後をクリック)→右クリック→グループ化

・→詳細→Brush Settings→隠れているメニューを表示→スタティックメッシュを作成→ファイル名「EnemyMesh」

・レベルにある敵を削除

 

敵が動くようにする

・ブループリント→新規の空のブループリントクラス→Pawn→ファイル名「EnemyBlueprint」

・コンポーネント→DefaultSceneRootを選択→コンポーネントを追加→スタティックメッシュコンポーネント

・StaticMesh→EnemyMeshを選択

・変数→+変数→変数名「DirectionY」→変数の型「Float」→コンパイル→デフォルト値「1」

・イベントグラフへ移動

・イベントTickから線を引き→ユーティリティ→トランスフォーメーション→SetActorLocation

・SetActorLocationのNewLocationから線を引き→演算→ベクター→vector + vector

・vector + vectorの左下から線を引き→ユーティリティ→トランスフォーメーション→GetActorLocation

・vector + vectorの左上から線を引き→演算→ベクター→vector * vector

・vector * vectorの左上から線を引き→演算→ベクター→vector * float→上段のY=50→左下の線をイベントTickのDeltaSecondsにつなげる

・vector * vectorの左下から線を引き→演算→ベクター→vector * float→上段のY=1→左下から線を引き→変数→デフォルト→DirectionY

・レベルにEnemyBluprintをドラッグドロップ

再生するとインベーダーが右に動いていきました

 

次は画面の端にたどり着いたら左に動くようにする

・SetActorLocationから線を引き→ユーティリティ→フロー制御→ブランチ

→Trueから線を引き→変数→デフォルト→SetDirectionY=-1

・ブランチのConditionから線を引き→演算→Float→float > float→下段に「100」

→上段から線を引き→演算→ベクター→Break Vector→Xにつながっていた線をYに繋ぎなおす

・Break VectorのIn Vecから線を引き→ユーティリティ→トランスフォーメーション→GetActorLocation

・Break VectorのIn Vecから線を引き→演算→Float→float < float→下段に「-100」→右から線を引き→ユーティリティ→フロー制御→ブランチ

・一つ目のブランチのFalseと二つ目のブランチを繋ぐ

・二つ目のブランチから線を引き→変数→デフォルト→SetDirectionY=1

再生するとインベーダが画面の端で折り返す

良いね!

 

しかしもうちょっときれいに書き直せないものなのかな?

それはもっと余力のある時にする

0からゲームを作るとなるとハードルが高いので

世の中にある既存のゲームを移植してみる

とはいえいきなり大作ゲームをコピるのではなく

もっと簡単なもの

例えば子供のころにやり倒したようなものを作ってみる

 

・インベーダやギャラクシアンのようなシューティング

・パックマンやドルアーガのような見下ろし型ゲーム

・ドンキーコングやマリオブラザーズのような重力があるゲーム

 

よしまずはインベーダで行こう

 

ちなみにこのブログではインストールとか細かい使い方は説明しません

あくまで自分のメモとして作りながら書いていきます

暇すぎたら字に色をつけたりスクショつけたりするかも

 

バージョン4.16.3

 

イチから作ろうかと思ったけどまったく何をして良いのかわからない

 

ひとまずググる

「ue4 インベーダ」で検索すると以下のページが見つかった

http://unrealengine-blog.hatenablog.com/entry/2014/04/24/133055

3年以上前に誰かがすでにやっていた(そらそうだ)

今回はここをそのまま真似しながらオリジナル要素を入れられるようにする

 

 

プロジェクトの作成

・空のプロジェクト、スターターコンテンツあり、プロジェクト名「invader」

 

新規レベルを作成

・ファイル→新規レベル→default

・現在のレベルを保存→ファイル名「invaderMap」

 

再起動してもこのマップを開くようにする

・編集→プロジェクト設定→マップ&モード

・DefaultMaps→Editor Startup Map→invaderMap

・同じく→Game Default Map→invaderMap

 

 

実行して操作してみる

WASDキーとマウスでカメラが動いた

 

http://unrealengine-blog.hatenablog.com/entry/2014/04/25/005756

 

画面を固定する

・モード→全てのクラス→カメラをレベルにドラッグドロップ

・カメラを選択したままブループリント→レベルブループリントを開く

・ブループリントのどこかを右クリック→ゲーム→Get Player Controller

・ブループリントのどこかを右クリック→CameraActorのリファレンスを作成

・薄くなっているイベントBeginPlayから線を引いて離す→状況に合わせた表示のチェックを外す→ゲーム→プレイヤー→Set View Target with Blend

・Get Player ControllerのReturn ValueをSet View Target with Blendのターゲットにつなぐ

・CameraActorからSet View Target With BlendのNew View Targetにつなぐ

 

やばい

すでに何をしているのかわからない

しかし実行してみると丸い球がWASDキーによって動く

マウスを動かしてみると一見何も起きないがWASDの動き方が変わる

そうか自分はこうなっていたのか

わからないことだらけでもとにかく今は進もう

後で理解できるだろうきっと

 

http://unrealengine-blog.hatenablog.com/entry/2014/04/25/232153

 

自機の砲台作成

・モード→ジオメトリ→ボックスをレベルにドラッグドロップ

→詳細→トランスフォーム→位置→X=0、Y=0、Z=60→Brush Settings→X=20、Y=20、Z=20

・モード→ジオメトリ→ボックスをレベルにドラッグドロップ

→詳細→トランスフォーム→位置→X=0、Y=0、Z=40→Brush Settings→X=20→Y=20→Z=20

・Ctrlキーを押しながらBoxブラシとBoxブラシ2をクリック→2つ選択されたら右クリック→グループ

→詳細→Brush Settings→隠れているメニューを表示→スタティックメッシュを作成→ファイル名「PlayerMesh」

・レベルにある自機を削除

 

自機を動かせるようにする

・ブループリント→新規の空のブループリントクラス→Pawn→ファイル名「PlayerBlueprint」

・コンポーネント→DefaultSceneRootを選択→コンポーネントを追加→スタティックメッシュコンポーネント

(このあたりはバージョン違いで操作も違っていたので迷ったがこれで合ってるはず)

・StaticMesh→PlayerMeshを選択

・イベントグラフへ移動

・ブループリントのどこかを右クリック→インプット→マウスイベント→マウスのX軸

・ブループリントのどこかを右クリック→演算→ベクター→Vector * float→Y=10

・マウスのX軸のAxis ValueとVector * floatの下の緑をつなぐ

・Vector * Floatの右から線を引く→演算→ベクター→vector + vector

・vector + vector の左下の黄色から線を引く→ユーティリティ→トランスフォーメーション→GetActorLocation

・マウスのX軸から線を引く→ユーティリティ→トランスフォーメーション→SetActorLocation

・vector + vectorの右とSetActorLocationのNewLocationにつなぐ

 

作った自機をプレイヤーとする

・設定→ワールドセッティング→GameMode→GameMode Overrideの+→ファイル名「MyGameMode」→選択したゲームモード→Default Pawn Class

 

記事ではこれで再生すればいけるとあったがここで躓いた

自機砲台が出てこない

 

コメント欄を見ると同じく困っている方々

 

>プレイヤーBPの詳細にある[Pawn」の設定で「Auto Process Player」を「Player0」に設定したら解決しました。

 

とあったので試してみるもうまくいかない

 

トレースラーニングはここまでか

原因を調べて解決したいが諦めて他の勉強するかのどちらか

 

解決したら何か書きます

 

(追記 2017/08/03)

コメントでも書きましたがその後解決しました

コンテンツブラウザからPlayerBlueprintをレベルにドラッグドロップするだけでした

当たり前すぎて書かなかったのかバージョン違いなのかわかりませんがこれで進めていくようにします

 

そしてわずか1記事を書いただけで想像よりも多いアクセスをいただいてただただ驚きました

これがアメブロの力なのか

見ても1~2人ぐらいだろうと思ってただけに適当すぎる書き方はまずいなと思った

なるべく丁寧に書こうか

いやしかしそれだと面倒になって書かなくなるかもしれないからやっぱりマイペースな書き方でいきます

アラフィフ直前のおっさんです

初めてブログを書きます


そこそこ有名な企業の社員だが本来ならもう中堅以上の歳

若かりし頃に酔って上司(後に取締役に就任)を殴るというしくじりをして出世コースが途絶え

入社数年目と変わらず雑務に追われて走り回る毎日
職種はSEだがやっていることは便利屋
質問や苦情にお応えしては日が暮れる

しくじった時に転職してしまえばよかったのだが
家族も抱えていて保守的な考えだった私はそんな決断をする度胸もなく
クビにならなかっただけでも幸いとばかりに居座り続けて早10数年
万年ヒラ社員のまま定年を迎える会社生活になるのだろう
 
 
こんな出世を諦めたつまらない人間が
ある時突然「映画を作りたい」という衝動に駆られる
 
子供のころから現在まで自分の中で温め続けたストーリーがある
誰にも話した事がなくそれが面白いのかどうかはわからない
でも死ぬまでに何らかの形にしたい

映画を作るとなると
役者が要る
舞台も要る
機材も要る
金はない
暇もそんなにない
 
世の中にあふれる映画の数
その一つ一つがたくさんの人が協力しあって作り上げる作品
深く考えた事がなかったがあらためてすごいなと思う
 
人脈も人望も金もない自分に何ができるか?
 
生活費が必要だから今の仕事はやめられない
会社をやめて映画作りに没頭できるほどの度胸がないからだ
完成が老後になっても構わない
趣味の時間のすべてを作品作りに没頭したい
 
自分の都合の良い時間に自分のペースで自在に動く役者が欲しい
そんな都合の良い役者がいないのはわかりきっている
 
アニメ映画はどうか?
絵を一枚一枚書いていくのは厳しい
そもそも絵心が無い
 
では小説は?
このブログでお解かりのように文才がない
文字だけで情景を表すなんてできっこない
 
ならばCGではどうなのか?
 
ある日パソコンを触っているとunreal engine 4というものが2年以上前に無償化されていたと知る
売れたらロイヤリティを払わないといけないが売れないだろうから関係ないし間違って売れたら払えばいい

 

デモやチュートリアルを見ていると

何の根拠もなく「これはいけるのではないか?」と思った

 

そのためには0からこのツールを使いこなす必要がある

SEとは名ばかりのオブジェクト指向すらろくに理解できていないプログラマーな自分にできるのか?

 

ダメ元でまずはやってみよう

初歩的な事から段階的に

ダメだったらこのブログの更新は止まるだけ

不定期更新上等

句読点が無くて読みにくい?

文才がないからあえて入れてません

 

これはunreal engine 4を使っていい加減で無計画な一人のアラフィフが

老後ぐらいに映画を完成させようという無謀な計画を綴った日記である

 

最終目的

unreal engine 4を使って2時間規模のCG映画を作りたい