主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity
ラベル UE4 の投稿を表示しています。 すべての投稿を表示
ラベル UE4 の投稿を表示しています。 すべての投稿を表示

2017年4月14日金曜日

UE4プログラミング学習編(その4)

■UMG を使ったユーザー インターフェース

  • UMGはUnreal Motion Graphicsの略らしい
  • ~.Build.cs書き換え後のソースが提示されているが、現在の内容と若干違う模様。この先も度々違いが見られた。言語を英語にしても内容の古いまま。
    • ひとまず完成後のソースに合わせた
    • 最後までやってみたが画面にUIは表示されなかった(原因不明)。この章はやらなくていいかもしれない。夏季講義DAY2では作成したGameModeをブループリントエディタで開き、BeginPlayでAddViewportすることで表示していた(講義動画の45分あたり)。
      • コンパイルしたり、色々試しているうちに何故か表示されるようになった
  • Ueser Widgetを作成しろとあるが、これが何か不明
    • Widget ブループリントのことかと思ったが、どうやら違う模様。合っていた。次のステップで解説されるので今は気にしなくて大丈夫(参考)。
  • 同様に~GameMode.hも見当たらない
    • ~GameModeBase.hならあるので、該当内容を追記

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once

#include "Blueprint/UserWidget.h"
#include "GameFramework/GameModeBase.h"
#include "QuickStartGameModeBase.generated.h"
/**
 * 
 */
UCLASS()
class QUICKSTART_API AQuickStartGameModeBase : public AGameModeBase
{
 GENERATED_BODY()
 
public:
 /** ゲーム開始時に呼び出されます */
 virtual void BeginPlay() override;

 /** 現在のメニューウィジェットを取り除き、指定されたクラスがあればそこから新しいものを作成します */
 UFUNCTION(BlueprintCallable, Category = "UMG Game")
  void ChangeMenuWidget(TSubclassOf NewWidgetClass);

protected:
 /** ゲーム開始時にメニューとして使用するウィジェット クラスです */
 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UMG Game")
  TSubclassOf StartingWidgetClass;

 /** メニューとして使用するウィジェット インスタンスです */
 UPROPERTY()
  UUserWidget* CurrentWidget;
};

  • ~GameModeBase.cppも同様
    • プロジェクト名を独自のものにした場合は、丸写しの際にクラス名に注意

#Menu Widget ブループリントの作成

  • グラフにbuttonとtextを追加しろとあるが、textは使わない。代わりにbuttonを2つ作る。
  • ブループリントデザイナ画面右上の「デザイナー>グラフ」ボタンで、ボタンを配置する画面とイベントの内容を編集する画面を切り替えられる
  • チュートリアルの解説はかなり端折られてるので、説明画像を参考にイベントを作る
  • GameModeは現在GameModeBaseになっていることに注意

#ゲームモードの設定

  • 最初は何故か下図のようにキャンセルしか表示されなかったが、キーボードの上下でメニュー内を移動したところ「選択」が表示された

#セカンド メニューを構築する

  • NewTextEntryだけ右クリックから検索で配置
    • GetとSetがあるのでGetを使う
  • 説明文を読めば察しはつくが、丸い点だけノードはToString

  • 新規ウィジェットをNoneにするとメニュー全体を非アクティブにできる(このときの表示がselect class(クラスを選択))

2017年4月13日木曜日

UE4プログラミング学習編(その3)

■プレイヤー制御のカメラ(参考

  • EAutoReceiveInputでは最大8人までのプレーヤーの入力を検出できる模様
  • 「プロジェクト設定」で入力の名称をチュートリアルと違うものにしつつも、スクリプト側の入力名称を変えていなかったため動作せず無駄に嵌った
  • FVector2DクラスにはIsZeroという関数がある
  • 移動はSetActorLocationにFVectorを渡す形で行われている。この関数はActorで定義されている。

①MyPawnの場合

if (!CurrentVelocity.IsZero())
  {
   FVector NewLocation = GetActorLocation() + (CurrentVelocity * DeltaTime);
   SetActorLocation(NewLocation);
  }
 
→現在座標にそのままベクトルを足しているので、ワールド空間での移動となる

②PawnWithCameraの場合

if (!MovementInput.IsZero())
  {
   //Scale our movement input axis values by 100 units per second (移動入力軸の値を 1 秒あたり 100 単位でスケーリング)
   MovementInput = MovementInput.SafeNormal() * 100.0f;
   FVector NewLocation = GetActorLocation();
   NewLocation += GetActorForwardVector() * MovementInput.X * DeltaTime;
   NewLocation += GetActorRightVector() * MovementInput.Y * DeltaTime;
   SetActorLocation(NewLocation);
  }
 
→現在座標に現在向いている向きに掛け算したベクトルを足しているので、ローカル空間での移動となる

  • 「CollidingPawnMovementComponent.h」ファイルのクラス定義で TickComponent をオーバーライドする(CollidingPawn.hと間違えて色々嵌った)
  • 重要】リストの最後の #include は、generated.hにしないとコンパイルエラーとなる。詳細不明
  • 重要】クラス名の付け間違いを発端にコンパイルエラー地獄となった
    • UE4エディター上ではC++ファイルの削除やリネームが容易でない
    • ファイル名とクラス名を修正して何とか解決した
    • 尚、クラス名を付け間違えたのは日本語チュートリアルには「CollidingPawnMovementコンポーネント」と記載されており、無意識のうちに英字部分だけコピペしていたため
  • 今回のスクリプトで作られた親子関係は次のようになった

    • CreateDefaultSubobjectで型と名前を決め、SetupAttachmentで親子関係を作る
    • 「RootComponent」と名付けたUSphereComponentがUnityでいうShpereColliderに当たる模様(参考1参考2
    • 「VisualRepresentation」はUStaticMeshComponentで、外観担当。指定パス先のメッシュをセットしている。半径50で生成されるらしく、親の半径に合わせるためにスケールと中心点を調整している。
    • 「MovementParticles」はUParticleSystemComponentで、炎のパーティクルアセットをセットしている
      • このON/OFFについては後述
    • 「CameraAttachmentArm」はUE4で度々出てくるUSpringArmComponent。
    • 「ActualCamera」は普通のカメラ。これまで同様にCameraAttachmentArmにアタッチするが、第二引数が何なのか不明。チュートリアル曰く「Spring Arm には、ベース以外に親子付けが出来る特別な内蔵ソケットがあります」とのこと(参考)。

    パーティクルシステムのON/OFF

    //入力イベントの登録
    void ACollidingPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
    {
     Super::SetupPlayerInputComponent(InputComponent);
    
     InputComponent->BindAction("ParticleToggle", IE_Pressed, this, &ACollidingPawn::ParticleToggle);
    
     ...
    }
    
    //実行部
    void ACollidingPawn::ParticleToggle()
    {
     if (OurParticleSystem && OurParticleSystem->Template)
     {
      OurParticleSystem->ToggleActive();
     }
    } 
    
    • 条件分は調査中
    • ToggleActiveはアクティブの切り替え(参考

    UE4プログラミング学習編(その2)

    ■プレイヤー入力と Pawn クラス(参考

    • Pawn(ポーン)はプレイヤーもしくはAIによって制御されるアクターのこと
    • 「クイックスタート」ではAddComponentでConeを選択したが、今回はOurVisibleComponent (Inherited)からStatic MeshからShape_Cylinderを指定した

    ■ゲーム制御のカメラ(参考

    • プレースメントブラウザのModesタブとは、基本レイアウトでの左上のエリアのこと(参考

    ■途中で気になったこと

    • カメラを配置した際、「LIGHTING NEED TO REBUILD」と出た。この場合は、ビルドのボタンを押してビルドしなおせば良いとのこと。(参考
    • Unityで言うシーンが「レベル」と呼ばれるものに当たる模様。使い方はレベルデザイナーのチュートリアルが良さそうだった(参考)。
      • 最初のテーブルなどが予め配置されたレベルはどこにも保存されていないらしく、新しいレベル作成後に戻ってくることができなかった。→プロジェクトを再度開いたら最初のレベルに戻ってきた。

    UE4プログラミング学習編(その1)

    ■変数、タイマー、イベント(参考

    • 初期化時のPrimaryActorTick.bCanEverTickは、UnityでいうUpdateを行うか否かを決めている。不要であれば適宜falseにすることでパフォーマンスを改善できる。
    • RootComponentはUnityでいうtransform(参考
    • GetWorldTimerManager()は、ゲームプレイタイマーにアクセスするためのもの
      • ハンドルはtimerのシャットダウン時に必要

    • FMath::Maxはおそらく指定要素の中で一番大きな値を返す関数
    • UPROPARTYでコメントをeditor上に表示することもできるが、日本語は文字化けする(参考
    • 生成したBlueprintはコンテンツ直下にある
    • 重要】UFUNCTIONタグにBlueprintNativeEventを指定した場合、対象関数の末尾に_Implementationを付けた関数が親関数として呼ばれる(参考1参考2

    UE4の学習の道程(みちのり)

    1. 必要スペック(参考
    2. 基本操作
      1. ビューポートの制御
      2. 再生とシミュレーション
      3. プロジェクトの共有(参考1
      4. C++ vs BP(参考
      5. 日本語入力だとエディタがだんだん重くなる(参考
    3. 夏季特別基礎講義(DAY1, DAY2
    4. ラーニング(公式学び部屋
      1. ドキュメント
        1. C++プログラミングのチュートリアル
          1. 学習編1
          2. 学習編2
          3. 学習編3
          4. 学習編4
          5. FPS(参考
        2. ブループリントにおけるキャラクター移動の設定方法
        3. Aim Offset を作成する
        4. VideoTutorials
          1. C++ Battry Collector
            1. その1
            2. その2
          2. Blueprint 3rd Person Game(学び部屋のは'14版。現行の'15版には日本語字幕がある)
            1. モンタージュ関連
              1. 16 - Intro to Animation Montage
              2. 17 - Skeleton Retargeting & Montage Setup
              3. 18 - Animation BP Punching Setup
              4. 19 - Playing Our Animation Montage
              5. 20 - Using Slot Nodes & Branch Points
          3. Blueprint Twin Stick Shooter
        5. LiveTutorials
      2. キャラクターの外観やアニメーション
        1. キャラクターの差し替え1
        2. 異なるスケルトンのリターゲット
          1. 公式の関連マニュアル(参考
            1. リターゲットされたアニメーションを使用する
            2. 異なるスケルトンのリターゲット
            3. 同じスケルトンのリターゲット
        3. ブレンドスペース(参考1参考2参考3
        4. アニメーションBP
          1. BlueprintのRotatorノードまとめ
        5. 物理で揺れ物
          1. ニコニ立体さんの髪の毛を動かす
      3. UMG
        1. UMGアニメーション(参考
        2. テキストの縁取り(参考
        3. マテリアルによるカウンタ(参考1参考2黒抜きtexcood
      4. ポーズ機能の追加(参考1参考2
        1. ポーズ中のSoundの再生(参考1参考2
      5. サンプルゲーム(ランチャーのラーニングにある)
        1. Shooter Game
          1. 公式
          2. 遊び方(参考1参考2
          3. 海外wiki
        1. マーケットプイレイス
          1. EpicGames
        2. 学習予定
          1. エンドレスランナー(参考
          2. ジャパニメーションキャラクターのシェーダー(参考
          3. UE4のテンプレートに自分で作ったキャラを入れて動かしたい(参考
          4. ZBとBlenderでUE4用のキャラを作る(参考:モデルは完成した状態からスタート)
          5. UGMデザイナーのクイックスタート(参考
          6. 有志によるAnimationTutorial(参考
          7. ゲームエンジンの作り方が書かれた本の紹介(参考
          8. https://www.youtube.com/watch?v=CgPlBjFeu4Y
          9. https://youtu.be/4jZT9ibp_ko
          10. エピック公認学習コース(参考

          2016年8月27日土曜日

          UnrealEngine4動作環境

          動作環境

          wikiに必要スペックなどTipsが載っている。ドスパラさんのを買うのが良さそうか。

          フォーラム


          • Facebookの助け合い所は管理者が見ていないようで承認が下りない
          • 英語ではあるが、UE4Anserhubが情報収集や質問の場として一番良さそう

          2016年8月25日木曜日

          Unreal Engine 4 の学習 (DAY2)



          お題目

          • Third Personテンプレート
            • ヘルスの処理をBPで作成
              • イベントAnyDamageを配置
              • 変数Healthを配置
                • Cntr+D&Dでゲットで配置(MacはCommand)
                • Alt+D&Dでセットで配置
            • ヘルスバーを表示
              • 新規追加でフォルダを追加
              • フォルダ内で右クリック>ユーザーインターフェイス>ウィジェットブループリントを作成
              • パレット>共通>progress Barを配置
              • 詳細>Progress>バインド>バインディングを作成
                • 右上のデザイナー>グラフのグラフ側がオレンジになる

                • イベントグラフタブを開く
                  • 右クリックでGetPlayerCharacterを配置
                  • 右クリックでcastと検索し、ThirdPersonCharacterへキャストを選ぶ
                  • キャストの出力で変数に昇格する
                • 次にGetPercentタブを開く
                  • 先ほど昇格した変数を配置
                  • 0:39:40 ~ 0:42:28までクラッシュ対応
                • フォルダのThirdPersonBP>Blueprint>ThirdPersonGameModeをダブルクリック
                  • ブループリントエディタを開く

                  • イベントBeginPlayを配置
                  • ウィジェットを作成(UIを作るためのノード)
                  • classのドロップダウンリストから先ほど作ったPlayerUIを選択(新規フォルダに作成したウィジェットブループリント)
                  • Add to ViewPortを配置して完成
            • 敵ユニットの作成
              • コンテンツブラウザのThirdPersonBP>Blueprintに新規BPクラスをアクターで作成
              • ダブルクリックでBPエディタを開く
              • コンポーネントを追加>スタティクメッシュコンポーネント
              • 詳細のstatic meshにてShape_Cylinderを選択
              • Construction ScriptでSetRelativeLocationを配置
                • Construction Scriptはインスタンス生成時に実行される処理。
              • 座標のピンを右クリックで分割を選択

              • タワーの頭をプレイヤーに追従させる(1:12:00)
                • イベントグラフタブ
              • 弾を作成する
                • 新規BPをアクタークラスで作成(これが弾となる)
                • コンポーネント追加でSphereコリジョンを追加
                  • コリジョンプリセットをBlockALLに変更
                • コンポーネント追加でCommonから球を追加
                  • こちらはただの外観なので、コリジョンプリセットはNoCollisionに変更
                • Projectile Movementを追加
                • レベルに配置して確認
                  • この辺りからエラーが出るようになるが無視して進める(動画でもエラーが表示されている)
                  • バウンドしない
                    • コリジョンをDefoultSceneRootにD&Dする(13:33:00)
              • 弾を頭から発射する
                • Arrowコンポーネントを追加し、「頭」の子にする
                • イベントグラフにカスタムイベントを配置
                • 「クラスからアクターをスポーンします」を配置
                • 変数内にあるコンポーネントの、先ほど作成したArrowをgetで配置
                • イベントBeginPlayの接続先をSet Timer by Function Nameにする。Function Nameは直接入力
              • 動く敵を作る
                • 新規BPをキャラクターで作成
                • ブレークポイントの作成
                  • ブレーク後にゲームを止めるには、BPエディタ内上部にある「停止」ボタンを押す。ただ、動作が不安定でボタンが反応しない時がある。イベントグラフ内を右クリックをすると治る時があった。

                • Nav Mesh BoundsボリュームはレベルのビューポートでPキーを押すと、正常にビルドされた範囲が緑色で表示される(参考)。
              • マテリアルを作る
                • 3キーを押しながら左クリックでVector3をショートカットで配置できる
                • ノードへの色の反映は10秒ほど時間かかる
              • 連続爆発
                • Alt+クリックでリンクの解除
                • ディレイノードを追加
                • DoOnceのリセットに接続する
              • ゲームオーバーを作る
                • GameOverUIにテキストとボタンを配置
                  • イベントグラフにOnClickedを配置し、リスタートするようにする
                  • Restart Gameノードは「状況に合わせた表示」のチェックを外さないと出てこない
                • ThirdPersonGameMode
                  • カスタムイベントを配置し、詳細にてインプットにDeadというboolean変数を用意する
                  • GameOverUIウィジェットをAdd to Viewportするようにする
                • ThirdPersonCharacterカスタムイベントを配置
                  • GetGameModeを配置し、そこからドラッグし、ThirdPersonCharacterにキャストする
                  • 先ほど作成したGameoverイベントを呼び出す。この時Deadにチェックを入れる。
                  • Set Show Mouse Cursorに接続し、チェックを入れる
                  • Set Input Mode UI onlyに接続する
                • ゴールの作成
                  • 新規BPをアクターで作成
                  • Text Renderはまだ日本語対応されていない
                    • Horizontal Alignment(水平整列)を中央にする
                • GameOverUIに処理を追加
                  • 右上のグラフを選択

                  • マウス操作のみにした後に、ThirdPersonGameModeへキャストし、結果を変数として出力するようにする
                  • 一旦、コンパイルしてからデザイナーに戻り、テキストのConentにてバインドを選択すると先ほど作成した結果の変数が表示され、そこからさらにThirdPersonGameModeで作成したGameOverMessegeがプロパティとして選択できるようになっているので選択する
            • プレイヤーから弾を発射する
              • 編集>インプット>BindingsにてShootを作成し、左クリックを対応ボタンとする。これによりShootというアクションイベントを呼び出せるようになる。
              • 玉がThirdPersonCharacter以外に当たったらDestroyするようにするが、この処理を加えると自分と接触しているのか弾が出なくなる。時間がないのでこれにて講義は終了となる

          2016年8月24日水曜日

          Unreal Engine 4 の学習 (DAY1)



          お題目

          • 基本操作
          • 横スクロールアクションの作成
            • BP内で右クリック+マウス操作で摘んで移動
            • BPを用いたエレベーターの作成
              • 可動性を「ムーバブル」にする必要あり
              • 可変フレームレートなのでdelta secondsをかける
                • delta secondsは前回から何秒後に呼び出されたかを返す
              • タイムラインを追加する(2:30:00)
                • フロートトラックを追加
                • Shift + 左クリックでキーを追加
                • タイムラインはフレームレート非依存
              • タイムラインをAddRelativeLocationにつなぐ
                • イベントティックの切断(2:37:10)
              • ノードを複数選択した状態でCキーを押すと、名前をつけてひとまとめのブロックにできる
            • 奥行きの移動追加
              • 編集>プロジェクト設定>インプット>Bindings>Axis Mappingにて奥行き操作を追加(ここではMoveDepthとした)
              • BP内で右クリックし、検索で「MoveDepth」とすると先ほど追加した軸イベントが選択可能になっているのでこれをBPに配置
              • AddActorWorldOffsetで動かす
                • 横スクロールなので、奥行きXの値はどこかで0を入力しているらしい。滑らかに動かしたい場合は、CharactorMovement選択時の詳細に表示されるPlanarMovomentのConstrain to Planeのチェックを入れた上で、AddMovementInputを用いる。(4:16:00)
            • カメラの位置を変える
              • カメラもSideScrollerCharacterに含まれている。ビューポートタブをクリックしカメラを動かす。