主なコンテンツ

〜主なコンテンツ〜

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

2017年4月21日金曜日

キャラクターの差し替え(その1)

「Blender で作ったアニメーションを Unreal Engine 4 で利用する(参考)」を参考に、キャラクターを差し替えてみた。結論から先に言うと上手くいかない

  • インポートでFBXを開く
  • 36項でSK_Mannequinを開くとあるが、UE4_Mannequin_Skeletonの間違い
  • 同様に38項ではGrayChan_Skeletonを開く
  • 39項における具体的な操作が不明
    • アニメーションタブ選択時は待機モーションで立った状態だが、リターゲットマネージャーを操作するためにスケルトンタブに戻ると、Tボーンの状態で下向きに倒れる
  • 44項のAnimClassは選択して初めて末尾に"_C"がつく(検索時には_Cは無い)
  • 45項のMaxWalkingSpeedは前項同様、ブループリントの設定にある
  • MeshをGrayChanに差し替えるとクリーチャーになっている
  • 46項の操作は不明(Blenderで歩行モーションを作成していないといけない?)
  • 48項のマテリアルは完成プロジェクトのGrayChan(スケルタルメッシュ)を参考に割り当てる
    • ただし、移行を指示されたマテリアルと実際に使われているマテリアルが違う
    • 完成プロジェクトも最初はテクスチャが反映されず全て灰色
    • マテリアルを開いて色が読み込まれたら保存することで、マテリアルの更新が始まった印象を受けたが、これが必要動作なのかは不明
    • スキンのマテリアルが反映されず、肌の位置に服のマテリアルが適用されているように見える
  • スライドのハンズオンではver.0.5.0を使ったとあるが、FBX自体が違う印象を受ける

2017年4月19日水曜日

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

#第11~21回

  • BlueprintImplementableEventは、cppに関数の実態を定義しなくても良い模様
    • イベントグラフに配置できるようになる
  • GetMaterialとGetMaterialsは別物
  • ~GameModeのTickが呼ばれない
    • ProjectSettings、WorldSettings共にGameModeの設定は合っている模様
    • PrimaryActorTick.bCanEverTick = true; が要る模様参考
      • GameModeもActorを継承しているので、PrimaryActorTick.bCanEverTickが使える
      • 動画の~GameModeの親クラスはAGameModeだが、今はGameModeBaseになっている
  • ゲームタイトルのヘッダーの#includeをEnginMinimal.h→Engin.hに変える
  • BatteryCollectorGameMode.hでCurrentWidgetにUPROPERTY()を使うが、外部から操作しないのでキーワードの指定は不要とのこと
  • UI配置時のAlignmentがUnityのpivotに当たるもの

    • 純粋キャストに変換する
      • 成功するのが確かなキャストなら純粋キャストの方が見やすい(参考

    • HUDを作ったらGameModeに登録することで表示する
    • ~GameMode.hにenumを足すが、コンパイルが通らない
      • これもAnswerhubで質問が上がっており、enumのクラス名の横に:unit8を付ける(参考
    • UMGのテキストはSizeToContentにチェックを入れると自動調整となる(参考
      • 動画だとさらっとやるので見落としがち
    • ゲームオーバー時にプレイヤーの入力を遮断する方法として、SetCinematicModeを使っている。これについてあまり情報がないが、HUDなども非表示にできる。
      • GameModeと紐づいている?
    • ゲームオーバー時にキャラクターが崩れ落ちる(英語ではラグドールになると言う)のは、BatteryCollectorGameMode.cppに追加したmycharacter->getmesh()->setsimulatephysics(true)によるもの。
    // ragdoll the character
       ACharacter* MyCharacter = UGameplayStatics::GetPlayerCharacter(this, 0);
       if (MyCharacter)
       {
        MyCharacter->GetMesh()->SetSimulatePhysics(true);
        MyCharacter->GetMovementComponent()->MovementState.bCanJump = false;
       }
    • ラグドールになった際、床をすり抜けないようにするにはBPのMeshのCollisionを次のように変更する
    • skeletal mesh(骨格メッシュ)には物理アセットを割り当てることができ、物理シミュレーション時にはこの設定が使用される。今使用しているキャラクターは物理アセットを持っていないので、それを持たせる。
    • SK_Mannequinに物理アセットを新規作成する際、「作成」と「作成と割り当て」の2種類が表示される。今回は「作成と割り当て」を選ぶと良い。

      2017年4月18日火曜日

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

      #第1~10回

      • 新規プロジェクトを作る際に、BPとC++を間違えると後で地獄を見る
        • Comntentの中にThirdPersonCPPがあるか確認
        • C++クラス内にBatteryCollectorCharactoerがあるか確認
          • プロジェクト作成直後は表示されないこともある。エディターを再起動すると直るので、表示されてなければ手間でも再起動して確認した方が良い
      • 途中で素材を取ってくるために使うサンプルは、ランチャーのラーニングにある「機能別サンプル(Contents Example)」というもの
      • BlueprintPureは2度呼ばれる、BlueprintCallableは1度だけ(...と言っているような)。その他の違いは公式などを参照。(参考
        • BlueprintPureは実行ピンを持たない。
      • Pickup_BPをダブルクリックで設定を開ける。
      • Battery_BPを作る際に、コンパイルしていなかったらしく意図しない挙動のBPが出来てしまいハマった
        • このBPを削除しようとした所、他から参照されているから強制削除するかどうか聞かれた。UE4にはリファレンスビューワーという物があり、これで確認できる(参考)。使ってみた所、バッテリーのmeshのことのようだった。これをクリアし、リファレンスビューワーにも表示されなくなったが、それでも参照されていると出た。UE4を再起動した所、解決した。
      • SpawnActorがunityで言う、Instantiateに近い感じ
      • チュートリアルのWEBからソースをDLできるが、ASpawnVolume::BeginPlay()の内容が第8回の内容と異なる
        • 第8回のようにスポーンさせたい場合は、動画の通りBeginPlayに2行書き足す必要がある
      • GetWorldTimerManager().SetTimerは、初級のチュートリアルでやった定期的に呼び出されるイベント(参考)。最後の引数をfalseにするとループしなくなる。
      • 今までUPROPERTYで指定していたCategoryは下図のように使われる
      • サイズを引き伸ばしたりは下図のトグルを使う

      • BatteryCollectorCharacter.hとcppがプロジェクト開始時に用意されているが、何かの拍子に消えてしまうようで、その修正を行う9回目で詰む。新規プロジェクト作成の際に、C++ではなくBPの3rdParsonを選んだものと思われる
        • 結局作り直した
      • 超重要!】AttachTo関数は現在非推奨であり、AttachToComponentを使うように警告が出る(コンパイルエラーになる)。引数はとりあえず次のようにしておけばいい。
         CollectionSphere->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
      

      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(クラスを選択))

      Bloggerにhighlight.jsを導入

      参考元はこちら。Blogger側に変更があって少し戸惑った。
      • cdnというのは、クラウド版のライブラリ提供サービスらしい。cdnjsはそのjavascript版。プラグインをDLしなくてもタグを書くだけでいいらしい。
      • 2017年4月現在、Bloggerに「テンプレート」の項目は無い。「テーマ」のHTMLの編集からheadに書き足せる。


      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で言うシーンが「レベル」と呼ばれるものに当たる模様。使い方はレベルデザイナーのチュートリアルが良さそうだった(参考)。
          • 最初のテーブルなどが予め配置されたレベルはどこにも保存されていないらしく、新しいレベル作成後に戻ってくることができなかった。→プロジェクトを再度開いたら最初のレベルに戻ってきた。