読者です 読者をやめる 読者になる 読者になる

技術ブログを目指すブログ

toncrimentan_w’s blog

アンリアルエンジン のC++の想定される量産設計(仮)

unrial engine

実際にアンリアルエンジンで開発が決まった場合における

C++プログラマ側の量産体制テストコードを書いて検証してみる

 

図はエネミーの処理)

 

メンバ変数はm_idのみReadWriteエディタ側からの指定を有効とするため

それ以外のメンバ変数はReadOnly IDからデータベースを介して設定されるべき。

 

また公開したい変数は public にする必要があるようだ

 

postInitProperty PostEditChangeProperty

からはステータスの更新処理の呼び出し

インスタンスが生成された場合 と エディタでIDを変更された場合の処理を記入

 

文字列はFStringで定義

 

この調子ならUE4の採用もありでプログラマの仕事のなくならない? 

 

ActorEnemy.h

/**
 * @file  ActorEnemy.h
 * @brief  アクター(エネミー)
 */

#pragma once

#include "GameFramework/Character.h"
#include "ActorEnemy.generated.h"

/**
 * @brief  アクター(エネミー)
 */
UCLASS()
class FIELDTEST01_API AActorEnemy
 : public ACharacter
{
public :

    GENERATED_BODY()

    /// エネミーID ※ブループリント開発者に指定してもらうためReadWriteとします。
    UPROPERTY( EditAnywhere, BlueprintReadWrite, Category="Status" )
    int32 m_id;

    /// 名前   ※IDからデータベースを介して設定されるためブループリント開発者からはreadOnlyとなります。
    UPROPERTY( BlueprintReadOnly, VisibleAnywhere, Transient, Category="Status" )
    FString m_name;

    /// HP   ※IDからデータベースを介して設定されるためブループリント開発者からはreadOnlyとなります。
    UPROPERTY( BlueprintReadOnly, VisibleAnywhere, Transient, Category="Status" )
    int32 m_hp;

    /// 攻撃力   ※IDからデータベースを介して設定されるためブループリント開発者からはreadOnlyとなります。
    UPROPERTY( BlueprintReadOnly, VisibleAnywhere, Transient, Category="Status" )
    int32 m_atk;

    /// 防御力   ※IDからデータベースを介して設定されるためブループリント開発者からはreadOnlyとなります。
    UPROPERTY( BlueprintReadOnly, VisibleAnywhere, Transient, Category="Status" )
    int32 m_def;


public:

    /**
     * @brief  コンストラクタ
     */
    AActorEnemy();


    ///
    /// Actor.hからの継承
    ///

    /**
     * @brief  プロパティのポスト初期化イベント
     */
    virtual void PostInitProperties() override;

#if WITH_EDITOR
    /**
    * @brief  アンリアルエディタによるプロパティの変更イベント
    * @param[in] PropertyChangedEvent パラメータ
    */
    virtual void PostEditChangeProperty( FPropertyChangedEvent& PropertyChangedEvent ) override;
#endif

    /**
     * @brief  入力イベント
     *    http://u16kuma.hateblo.jp/entry/2016/05/21/211810
     */
    virtual void SetupPlayerInputComponent( class UInputComponent* PlayerInputComponent ) override;

    /**
     * @brief  再生開始イベント
     *    (アクタがプレイ可能なステートになったことを知らせるイベント)
     */
    virtual void BeginPlay() override;

    /**
    * @brief  更新イベント
    */
    virtual void Tick( float DeltaSeconds ) override;


    ///
    /// ステータスの操作
    ///

    /**
     * @brief  HPの増減
     * @param[in] val   値
     */
    UFUNCTION(BlueprintCallable, Category="Status")
    void addHp( int32 val );

    /**
     * @brief  HPの取得
     * @return  HP
     */
    UFUNCTION(BlueprintCallable, Category="Status")
    int32 getHp() const ;


private :

    ///
    /// ステータスの操作
    ///

    /**
     * @brief  ステータスのセットアップ
     */
    void setupStatus();

};

 

 ActorEnemy.cpp

/**
 * @file  ActorEnemy.h
 * @brief  アクター(エネミー)
 */

#include "FieldTest01.h"
#include "ActorEnemy.h"


/**
 * @brief  コンストラクタ
 */
AActorEnemy::AActorEnemy()
 : m_id( 1 ) ///< IDは1~
{
    /// Tickイベントの有効化
    PrimaryActorTick.bCanEverTick = true;

    /*
     bCanEverTickをtrueにしないことで処理を軽減することができます。
     https://docs.unrealengine.com/latest/JPN/Programming/Introduction/index.html
    */
}


///
/// Actor.hからの継承
///

/**
 * @brief  入力イベント
 *    http://u16kuma.hateblo.jp/entry/2016/05/21/211810
 */
void AActorEnemy::SetupPlayerInputComponent( UInputComponent* PlayerInputComponent )
{
    UE_LOG( LogTemp, Warning, __FUNCTIONW__ );

    Super::SetupPlayerInputComponent(PlayerInputComponent);

}

/**
 * @brief  プロパティのポスト初期化イベント
 */
void AActorEnemy::PostInitProperties()
{
    UE_LOG( LogTemp, Warning, __FUNCTIONW__ );

    Super::PostInitProperties();

    /// ステータスのセットアップ
    setupStatus();
    /*
     インスタンスが生成された直後に
     ステータスが更新される必要があるため呼び出しています。
     */
}

#if WITH_EDITOR
/**
 * @brief  アンリアルエディタによるプロパティの変更イベント
 * @param[in] PropertyChangedEvent パラメータ
 */
void AActorEnemy::PostEditChangeProperty( FPropertyChangedEvent& PropertyChangedEvent )
{
    UE_LOG( LogTemp, Warning, __FUNCTIONW__ );

    Super::PostEditChangeProperty( PropertyChangedEvent );

    /// ステータスのセットアップ
    setupStatus();
    /*
     デザイナによるプロパティが呼ばれたときは
     ステータスが更新される必要があるため呼び出しています。
     */
}
#endif

/**
 * @brief  再生開始イベント
 *    (アクタがプレイ可能なステートになったことを知らせるイベント)
 */
void AActorEnemy::BeginPlay()
{
    Super::BeginPlay();
}

/**
 * @brief  更新イベント
 */
void AActorEnemy::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );
}


///
/// ステータスの操作
///

/**
 * @brief  ステータスのセットアップ
 */
void AActorEnemy::setupStatus()
{
    /// IDからエネミーごとのステータスを更新する
    switch( m_id )
    {
    case 1:
     m_name = "inu";
     m_hp = 100;
     break ;
    case 2:
     m_name = "saru";
     m_hp = 200;
     break ;
    case 3:
     m_name = "kiji";
     m_hp = 300;
     break ;
    default :
     m_name = "unknown";
     break ;
    }

    //UE_LOG( LogTemp, Warning, TEXT("%s:ステータスを更新"), __FUNCTIONW__ );
}

/**
 * @brief  HPの増減
 * @param[in] val   値
 */
void AActorEnemy::addHp( int32 val )
{
    m_hp += val;
    if( m_hp < 0 )
     m_hp = 0;
}

/**
 * @brief  HPの取得
 * @return  HP
 */
UFUNCTION(BlueprintCallable, Category="Status")
int32 AActorEnemy::getHp() const
{
    return m_hp;
}

 

アンリアルエンジン のC++からのプロパティの追加してみる

unrial engine

アンリアルエンジンのC++プログラミングの書籍はほとんどない

なのでこちらのサイトから勉強するとよいかも

https://docs.unrealengine.com/latest/JPN/Programming/Introduction/index.html

 

すると意外と簡単にできた

新規追加 > Actor  でMyActorの追加

f:id:toncrimentan_w:20170325232222j:plain

 

VisualStuidoにはMyActorのクラスが追加されているので

プロパティにする変数を追加する

 

ここでどうもprotectedにしないとだめな模様

URLどおりじゃない

f:id:toncrimentan_w:20170325232223j:plain

 

UnrialEditerの画面に戻りコンパイルすると

先ほど作ったプロパティが追加されている。

これならC++で育った僕にも使いやすそう

まだまだプログラマの仕事はなくならないかも!

f:id:toncrimentan_w:20170325232224j:plain

楽天booksより 進撃の巨人のBlurayBOX が届きました

平和な日常

幾度となく全巻集めようかとおもったことか

友達に絶対2期始まる前あたりにBOX出ると思うから待った方がよいよといわれ待ったかいがありました

 

ひょっとしたら劇場版もはいるんでない

ひょっとしたら5.1ch仕様になってたりとかの予測もありました。

f:id:toncrimentan_w:20170324011054j:plain

今回はコンビニ受け取りをしてみました。

宅配ボックスがないうちのマンションなのでコンビニうけとりは便利。

平日ならほぼ必ず佐川急便さんに往復していただくことになってしまうので

この方がいい。

必ず売り切れないんだったら同じ価格でむしろ店頭でかってもよいのに

というのが消費者心理

 

アンリアルエンジン のC++のキャラクタークラスを追加してみる

unrial engine

どーしても C++プラグラミングをしたいので

 

キャラクターの追加方法を検証。

新規追加>新規C++クラス>Character から追加することができた。

f:id:toncrimentan_w:20170323235238j:plain

f:id:toncrimentan_w:20170323235239j:plain

 

ためしにC++のほうを書き換えても追加可能なのかを検証

この方法でも追加できた。

実際この方法で運用をすすめられるのかは不明 検証をつづける。

f:id:toncrimentan_w:20170323235240j:plain

アンリアルエンジン のC++プログラミングを調べ始める

unrial engine

参考書どおりにつくってきたものの

参考書も半ばですがそろそろ作ってみたいところ

 

とうかそもそもアンリアルエンジンでゲームってできんのをジャッジしたいところ

C++プログラミングなしでも最後までいけるらしい。

 

でもどうしても信用できないのでC++をいじってみることに

新規プロジェクト > C++ > TopDown で作成f:id:toncrimentan_w:20170322032048j:plain

 

unrialEditer と visualStudio の2つが起動する

たぶん unrialEditer はすぐ消していいんじゃないかな おそらく

そして visualStudio から実行する

f:id:toncrimentan_w:20170322032050j:plain

 

visualStudioから実行するとここでunrialEditerで編集する画面が表示

その後unrialEditerのプレイで本当の実行ができる。

f:id:toncrimentan_w:20170322032051j:plain

 

つまりはこうか(?)

・アンリアルプログラマがvisualStudioでデザインするための機能をそろえる

 (unrialEditerのツール画面も含まれる

  実際visualStudioのソリューションエクスプローラ

  Engine>UE4>Source>Editor>SceneOutlinerにシーンアウトライナがあった)

・ベースが出来上がったら

 アンリアルデザイナがunrialEditerが作業をしてデータを作る

・最終的には 遊ぶようのバイナリが出力される。

 

これだったらなんとかゲームできるかも。

ただアンリアルデザイナに自由にデザインさせるのは禁止したい感じ

アンリアルプログラマの檻の中で作業にあたってほしい。

絶対そうなる 動かなかった時の責任の所在ってやつがどうせプログラマに来るんだし。

 

ひきつづき検証をつづける。

アンリアルエンジン のマテリアル関数の使い方

unrial engine

アンリアルエンジンには 

マテリアル関数という機能もあります。

 

まずはマテリアル関数をつくります。

f:id:toncrimentan_w:20170321233901j:plain

 

必ず必要というわけではないが

以前マテリアルパラメータをつくっておく

f:id:toncrimentan_w:20170321233903j:plain

 

マテリアル関数ないでは

さきほど作ったマテリアルパラメータを入力します。

 

※ここは処理を細かく作っても大丈夫

 例ではカラーをそのまま入力する方法を解説しています。

※スペキュラーなどの単一の値にも使用できます

f:id:toncrimentan_w:20170321233905j:plain

 

最後にマテリアルの中身を指定する際に

関数から取得する方法をとります。

※正直ここで細かい計算を行ってもよさげ

f:id:toncrimentan_w:20170321233906j:plain

 

いろいろな指定の仕方があるが

一体どこで設定すればよいのでしょうか。。

となりそう。

 

単純に整理整頓ということで

すべてマテリアル関数を使用してマテリアルをつくるようにするものありかな

夢の汁なしがっつりラーメン(汁あり版)夢を語るトッピングを食べてきました。

平和な日常

赤レンガ倉庫で最終日をむかえました

ラーメン女子博 いってきました。 

 

最初はふやきの御汁宝の面(全部乗せ)

最初は普通にたべて途中から味噌を溶かして食べてくださいとった一品

うん 油がうまい

f:id:toncrimentan_w:20170320211745j:plain

 

 つづいて

夢の汁なしがっつりラーメン(汁あり版)夢を語るトッピング

汁なしで売ってたが最終日なので汁あり版にしてくれました。なにそれ

夢を語る0円でトッピングしてくれるとのこと

これはー マクドナルドのスマイルみたいなもんかな

 

ではどうぞ 夢を語ってください と思ったら

俺が夢を語るシステムやった・・

f:id:toncrimentan_w:20170320211747j:plain

 

いい3連休の最終日でした。

f:id:toncrimentan_w:20170320211756j:plain