Quantcast
Channel: historia Inc –株式会社ヒストリア
Viewing all 981 articles
Browse latest View live

[UE4]GameplayAbilitySystemで「スタミナ」を作る

$
0
0
執筆バージョン: Unreal Engine 4.25

ハローアンリアル!エンジニアの片平です!

前回に引き続き、GameplayAbilitySystem関連の記事です。

前回:[UE4]GameplayAbilitySystemでコンボ攻撃を作る

スタミナつけます

前回はGameplayAbilitySystemを使用して華麗なコンボ攻撃を作成しました。

しかし、これだけだとひたすらコンボで殴るゲームになりイマイチ面白くなさそうです……。
そこで、今回は戦闘の駆け引きを面白くする「スタミナ」システムを実装していきます。もちろん、GameplayAbilitySystemを使って。

「スタミナ」の仕様は以下のようなものとします。

  • ・攻撃を繰り出すたびに「スタミナ」を消費する
  • ・攻撃に必要な「スタミナ」がないときは攻撃できない
  • ・「スタミナ」を消費する行動をしないときに「スタミナ」は自動で回復する
  • ・最小値は0.0、最大値は100.0固定
  • ・プログレスバーで表示する

今回実装するのは「スタミナ」ですが、MPやSPやマナやラスやフューリーやアーケイン・パワーなどの行動するために支払う系(リソース)のパラメータの実装なら今回の実装例を汎用的に使えると思います。

ちなみに筆者はスタミナ丼が大好き

GameplayAbilitySystemとは

GameplayAbiliySystem(以下GAS)については、前回の記事や以下のリンクをご参照ください。

今回は、前回の記事で使用したGameplayAbilityに加え、GameplayAttribute、GameplayEffectも使用します。

GameplayAttributeとは

GameplayAttributeとは、GASで扱う「数値(HP、MP、攻撃力、防御力、スタミナなどのパラメータ)」です。
GASで扱うパラメータはActorのメンバ変数に直接格納するのではなく、AttributeSetというクラス中にGameplayAttributeとして格納します。

GameplayAttributeの値は内部的にはfloat型です。intで扱うような値も全てfloatとして扱ってください。

GameplayEffectとは

GameplayEffectとは、GameplayAbilityによって引き起こされるGameplayAttributeへの「影響」です。

例えば、

  • ・攻撃で敵のHPにどれだけのダメージを与えるか
  • ・バフでどれだけの時間、どれだけ攻撃力を上げるか
  • ・GameplayAbilityを使うのにどれだけのコストを支払うか

などを設定するクラスです。

詳しく知りたい方は以下の公式ドキュメントもご覧ください。

ゲームプレイ アトリビュートとゲームプレイ エフェクト

スタミナを実装する

プロジェクト

前回記事で作成したBlogComboプロジェクトを引き続き使用します。

筆者は前回作成したプロジェクトを紛失したため、泣きながら自分の記事を見てもう一回作りました。

プレイヤーにパラメータを追加する

スタミナをGameplayAttributeとして宣言します。

AttributeSetを作成する

スタミナのGameplayAttributeを含むAttributeSetを作成します。

BlogComboAttributeSet.h

#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "BlogComboAttributeSet.generated.h"

//アクセサ(Setter、Getter)を生成するためのマクロ
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

/**
 * 
 */
UCLASS()
class BLOGCOMBO_API UBlogComboAttributeSet : public UAttributeSet
{
	GENERATED_BODY()

public:
	// コンストラクタ
	UBlogComboAttributeSet();

	//GameplayEffect実行の後に実行される関数
	virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)override;

	/*スタミナ*/
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BlogComboAttributes")
	FGameplayAttributeData Stamina;
	ATTRIBUTE_ACCESSORS(UBlogComboAttributeSet, Stamina)
};

BlogComboAttributeSet.cpp 

#include "BlogComboAttributeSet.h"
#include "GameplayEffect.h"
#include "GameplayEffectExtension.h"

UBlogComboAttributeSet::UBlogComboAttributeSet() :
	Stamina(100.f)
{
}

void UBlogComboAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
	Super::PostGameplayEffectExecute(Data);

	if (Data.EvaluatedData.Attribute == GetStaminaAttribute())
	{
		SetStamina(FMath::Clamp(GetStamina(), 0.f, 100.f));
	}
}

PlayerにAttributeSetを追加する

作成したBlogComboAttributeSetをPlayerCharacterに追加します。

キャラクターやカメラの移動処理の記述があり、長くなるため中略します。

BlogComboCharacter.h

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AbilitySystemInterface.h"
#include "BlogComboAttributeSet.h" //追加する
#include "BlogComboCharacter.generated.h"

UCLASS(config=Game)
class ABlogComboCharacter : public ACharacter, public IAbilitySystemInterface
{

~中略~

public:
	/** AttributeSet **/
	UPROPERTY()
		UBlogComboAttributeSet* BlogComboAttributeSet;

	UFUNCTION(BlueprintCallable, BlueprintPure, Category = "BlogComboAttribute")
		virtual float GetStamina();
}

BlogComboCharacter.cpp

~中略~
ABlogComboCharacter::ABlogComboCharacter()
{
~中略~

	// AttributeSetを追加
	BlogComboAttributeSet = CreateDefaultSubobject<UBlogComboAttributeSet>(TEXT("AttributeSet"));

}

~中略~
//スタミナを取得
float ABlogComboCharacter::GetStamina()
{
	return BlogComboAttributeSet->GetStamina();
}

~中略~

ここまででコンパイルします。

PlayerCharacterのGetStamina関数で現在のスタミナ値にアクセスすることができます。


初期値である100.0が表示されました。

UIに表示する

数字で見ても増減がイマイチわからないので、プログレスバーとしてUI表示させておきます。

今回の趣旨とは外れるため詳しくは記載しませんが、下のドキュメントなどを参考にちゃちゃっと作りましょう。

2. ヘルス、エネルギー、弾薬を表示する


左上につけました。誰がどう見てもスタミナゲージですね。

Abillityのコストを設定する

GameplayAbilityにコストを追加

今回はAbilityごとにコストを持たせたいので、前回作成したGameplayAbilityを継承したクラスであるBlogComboGameplayAbilityにコスト変数を追加します。

BlogComboGameplayAbility.h

メンバ定義に以下の変数を追加します。

/** (追加)アビリティコスト*/
	UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Cost")
		FScalableFloat Cost;

FScalableFloat型は実数以外に、Curveを指定することで実数*Curveの値を得ることができる型です。Curveに何も指定しなければ実数の値がそのまま使用されます。

コンパイルしたら、前回作成したコンボ1~3のGameplayAbilityにCostが追加されているので、それぞれClassDefault->Cost->Costにコストを設定していきます。


とりあえず3段階ともスタミナ30.0消費としておきました。

コスト分だけ消費させる

設定したコスト分だけ消費させる(=GameplayAttributeに影響を与える)には、GameplayEffectを使用します。

GameplayModMagnitudeCalculationの作成

GameplayEffectを作成する前に、コストをどのように計算するかをGameplayModMagnitudeCalculationクラスで実装します。

GMMC_AbilityCost.h

#include "CoreMinimal.h"
#include "GameplayModMagnitudeCalculation.h"
#include "GMMC_AbilityCost.generated.h"

/**
 * 
 */
UCLASS()
class BLOGCOMBO_API UGMMC_AbilityCost : public UGameplayModMagnitudeCalculation
{
	GENERATED_BODY()

	float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override;
};

GMMC_AbilityCost.cpp

#include "GMMC_AbilityCost.h"
#include "Abilities/BlogComboGameplayAbility.h"

float UGMMC_AbilityCost::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const
{
	const UBlogComboGameplayAbility* Ability = Cast<UBlogComboGameplayAbility>(Spec.GetContext().GetAbilityInstance_NotReplicated());

	if (!Ability)
	{
		return 0.0f;
	}

	return Ability->Cost.GetValueAtLevel(Ability->GetAbilityLevel());
}

今回は単純にGameplayAbilityからCostを取得してくるだけですが、例えば、攻撃力が上昇するにつれて消費コストに補正が入るなど自由な計算を実装することができます。

コスト用GameplayEffectの作成

GameplayEffectを継承したBPを作成します。


GameplayEffect->Modifierの+をクリックし、一つ追加します。

以下の画像のように設定します。(クリックで拡大します。)


デフォルトから変更した項目の解説です

Attribute 変更対象のGameplayAttributeです。
Modifier Op Attributeに対して行う演算方法です。
減算の場合はマイナス値を加算するのでAddです。
MagnitudeCalculationType CustomCalculationClassを選択することで、独自実装したMagnitude※を使用できます。
CalculationClass Magnitudeの計算に使用するGameplayModMagnitudeCalculationクラスを指定します。
Coefficient CalculationClassで算出した値にかける係数です。
-1.0にすることでマイナス値にしています。

※MagnitudeとはAttributeに与える影響の大きさです。
Modifier OpがAddだと単純にMagnitudeの値が加算されます。

コスト用GameplayEffectの設定

コンボ1~3のGameplayAbilityのCosts→CostGameplayEffectClassに作成したコスト用GameplayEffectを設定します。

スタミナ消費完成!

スタミナを消費してコンボを繰り出せるようになりました。

動画ではわかりづらいですが、コストが足りなくなると攻撃ボタンを押してもコンボ攻撃が出せなくなります。

スタミナを自動回復させる

このままでは3発攻撃するとスタミナがなくなり一生攻撃できなくなってしまうので、自動でスタミナが回復するように実装していきます。

自動回復用GameplayEffectの作成

GameplayEffectを継承したBPを作成します。


GameplayEffect->Modifierの+をクリックし、一つ追加します。

以下の画像のように設定します。(クリックで拡大します。)


1回でスタミナが0.5回復回復するように設定しました。
DurationPolicyを「Infinite」にすることで無限にGameplayEffectの効果が繰り返されます。

Period->Periodに0.016を入れます。


これで0.016秒毎にスタミナが増加します。
0.016秒は60fpsでの1フレームの秒数のため、毎フレーム更新することになります。

ネットワークゲームの場合はもっと更新間隔を長くしてUIで補完するなどの実装をしたほうがいいかなと思います。

Tags->OngoingTagRequirements->Ignore Tagsに「Stamina.Cooldown」を入れます。


Ignore Tagsに設定したTagをGameplayAbilityComponentが持っているときにはGameplayEffectは発動しません。

自動回復用GameplayEffectの設定

作成したGameplayEffectをBlogComboCharacterで実行するようにします。

BlogComboCharacterのBeginPlayに以下の画像の赤線のようにノードを繋ぎます。


これで常にスタミナが自動回復するようになりましたが、コンボ攻撃中はスタミナ回復が止まってほしいです。
そこで、コンボ攻撃発動後にスタミナ自動回復にクールタイムを持たせます。

クールタイム用GameplayEffectの作成

クールタイムの設定にもGameplayEffectを使用します。

GameplayEffectを継承したBPを作成します。


GameplayEffetを以下の画像のように設定します。


DurationPolicyを「HasDuration」にすることでGameplayEffectが一定時間継続します。

DurationMagnitude->ScalableFloatMagnituideはGameplayEffectが発生してから消えるまでの時間です。
今回は攻撃をしてから1秒たったらスタミナ自動回復が再開してほしいので1.0にしました。

Tags->GrantedTags->Addedに「Stamina.Cooldown」を設定します。


これでGameplayEffectが実行されているときにGameplayAbilityComponentに「Stamina.Cooldown」が付与されます。

クールタイム用GameplayEffectの設定

コンボ1~3のGameplayAbilityのCommitAbilityの後ろにApplyGameEffectToOwnerを追加し、作成したクールタイム用のGameplayEffectが実行されるようにします。

スタミナ自動回復完成!

以上で、スタミナ自動回復が完成しました!

攻撃中はスタミナが回復せず、1秒以上なにもしないと自動回復します。

攻撃失敗の通知を受け取る

スタミナが足りず攻撃を出せないときは通知を受け取ってメッセージを出すとかビープ音を出すとかしたいですよね。

ちょっと応用的な内容になりますが、攻撃失敗の通知の実装に癖があったのでご紹介します。

通知関数の作成とデリゲートの設定

通知はデリゲートで受け取れます。

BlogComboCharacter.h

メンバ定義に以下の関数を追加します。

/** GameplayAbility失敗 */
	UFUNCTION(BlueprintImplementableEvent)
		void OnAbilityFailed(const UGameplayAbility* Ability, const FGameplayTagContainer& GameplayTags);

BlogComboCharacter.cpp

BeginPlayの実装部分に1行追加します。

void ABlogComboCharacter::BeginPlay()
{
	Super::BeginPlay();

	if (AbilitySystem)
	{
		int32 inputID(0);
		if (HasAuthority() && AbilityList.Num() > 0)
		{
			for (auto Ability : AbilityList)
			{
				if (Ability)
				{
					AbilitySystem->GiveAbility(FGameplayAbilitySpec(Ability.GetDefaultObject(), 1, inputID++));
				}
			}
		}
		AbilitySystem->InitAbilityActorInfo(this, this);
		AbilitySystem->AbilityFailedCallbacks.AddUObject(this, &ABlogComboCharacter::OnAbilityFailed);//この行を追加する
	}
}

これでデリゲートの設定は完了ですが、GameplayAbility実行失敗時のGameplayTagが設定されていないため、OnAbilityFailedが通知されても引数のGameplayTagsには何も入らないです。

通知タグの作成

GameplayAbility実行失敗時のGameplayTagを作成します。

ProjectSettingsを開き、Project->GameplayTagsページから以下のタグを追加します。

  • ・Ability.Fail.Cooldown … クールダウン中
  • ・Ability.Fail.Cost … コストが足りない

通知タグの設定

Game/Config/DefaultGame.iniを開き、以下を追加します。

[/Script/GameplayAbilities.AbilitySystemGlobals]
ActivateFailCostName=Ability.Fail.Cost
ActivateFailCooldownName=Ability.Fail.Cooldown

グローバルデータの更新

上記の設定を反映させるために、GameInstanceの拡張が必要です。

GameInstanceを継承したC++クラスを作成します。

以下のように実装します。

BlogComboGameInstance.h

#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "BlogComboGameInstance.generated.h"

/**
 * 
 */
UCLASS()
class BLOGCOMBO_API UBlogComboGameInstance : public UGameInstance
{
	GENERATED_BODY()

public:
	UBlogComboGameInstance();
};

BlogComboGameInstance.cpp

#include "BlogComboGameInstance.h"
#include "AbilitySystemGlobals.h"

UBlogComboGameInstance::UBlogComboGameInstance()
{
	UAbilitySystemGlobals::Get().InitGlobalData();
}

ここまででコンパイルします。

BPで通知を受け取る

OnAbilityFailedイベントから以下の画像のようにノードを組みます。

攻撃失敗通知完成!


コストが足りないときに攻撃を出そうとするとメッセージが表示されます。
地味ですが、意外とこういうの大事ですよね。

まとめ

というわけで、今回はスタミナシステムを実装してみました。

今回ご紹介したGameplayEffectの機能を駆使することで、単純な数値の増減以外にもさまざまなキャラクター制御が実装できるので是非お試しください!

The post [UE4]GameplayAbilitySystemで「スタミナ」を作る first appeared on historia Inc - 株式会社ヒストリア.


【UE4】UDeveloperSettingsでプロジェクト設定に項目を追加する

$
0
0
執筆バージョン: Unreal Engine 4.25

こんにちは。エンジニアの小倉です。
今回はUDeveloperSettingsを使って簡単にプロジェクト設定に項目を追加する方法を紹介します。
ちなみに、UDeveloperSettingsを使わずに項目を追加する方法は、以前のブログでも取り上げました。

[UE4] 「エディタの環境設定」や「プロジェクト設定」に項目を追加する

UDeveloperSettingsを継承する

プロジェクト設定に項目を追加する基本的な手順は以下になります。

1. UObjectを継承したコンフィグ用クラスを作る
2. UPROPERTY(EditAnywhere, Config)をつけた設定用の変数を宣言する
3. ISettingsModuleに作成したコンフィグ用クラスを登録する

ここで、1.で示したコンフィグ用クラスの継承元をUObjectの代わりにUDeveloperSettingsにすると、3.の登録処理を省略できるようになります。3.の登録手順を省略できると、例えば以下のようなメリットがあります。

・登録解除処理の書き忘れを気にしなくて済む
・外部クラスに登録処理を書かなくて済む(コンフィグ用クラス内で完結する)

具体的な実装方法を示します。まず、UDeveloperSettingsを継承したクラスを作成します。

次に、UDeveloperSettingsの関数をオーバーライドして実装します。

オーバーライドする関数の詳細は以下のようになります。

関数名 詳細
GetContainerName() コンテナ名を指定します。ここではProjectEditorのどちらかです。
この関数は基本的にはオーバーライドしません
GetCategoryName() カテゴリ名を指定します。ここではEditor, Engine, Game, などの他に
ユーザー定義のカテゴリ名も指定できます
GetSectionName() セクション名を指定します。ここではクラス名になります。
この関数は基本的にはオーバーライドしません
GetSectionText() プロジェクト設定に表示されるセクション名を指定します。
GetSectionDescription() プロジェクト設定に表示されるセクションの説明を指定します。

プロジェクト設定の項目を追加する

UDeveloperSettingsを継承して、必要な関数をオーバーライドしたら、実際にプロジェクト設定の項目を追加します。これはUPROPERTYでコンフィグ用のメンバ変数であることを明示するだけです。なお、ConfigRestartRequiredというメタ指定子を付けると、項目が変更されたときにエディタのリスタートを促すメッセージが表示されます。

これをプロジェクト設定に表示すると、次のようになります。

なお、各項目は以下のようにアクセスします。

The post 【UE4】UDeveloperSettingsでプロジェクト設定に項目を追加する first appeared on historia Inc - 株式会社ヒストリア.

[UE4]LightBuildのクオリティ設定について

$
0
0
執筆バージョン: Unreal Engine 4.25

 

LightBuildのクオリティ設定は具体的に何が変化しているのでしょうか?

 

LightBuildを行う際にアイコンの▼からオプションでLighting Qualityをクオリティが高い順に、
ProductionHightMediumPreview
と変更することができますが、具体的には何が変更されているのでしょうか?

 

これらの設定を変えても、World SettingsLightmass設定は何も変更されません。

 

実はこの設定項目の詳細はiniファイルに書かれています。

 

エディタのWorld SettingsUIではこのiniファイルの一部を調整していることになります。

通常はエンジンフォルダのコンフィグ内に入っているBaseLightmass.iniを参照しています。

UE4.25の場合、『インストールフォルダ\Epic Games\UE_4.25\Engine\Config』にあります。
この中身を見てみましょう。
BaseLightmass.iniの内容を変更してしまわないよう注意してください

 

 

BaseLightmass.iniLighting Quality設定部分

iniファイルの上部には緑色で注意書きがなされています。
こちらの注意文は一旦置き、ページの下の方を見てみると、先程エディタUIで書かれていたProductionHightMedium3つの項目があります。
画像はBaseLightmass.ini内のDevOptions.StaticLightingMediumQuality設定です。エディタでMediumを選択したときに適用される設定です。

大体の項目にScaleとついており、それぞれ倍率がかかっています。

つまり、Lighting Qualityとは、このiniファイルには書かれていないPreviewの設定が倍率1の状態で、そこからそれぞれ倍率を変更したものを指しています。

それぞれの設定がどういった意味を持っているのかは下記を参考にしてください。

値の大まかな意味や、値を変更した際の比較、その他そもそものLightmassについて非常にわかりやすいスライドです。
建築ビジュアライズにおけるLightmass実践使用方法 (フリーランス 真茅健一様)

凵 ー 88 Dive 2 建 第 ビ ジ ュ ア ラ イ ズ に お け る し を 加 , “ 田 方 法

それぞれの値に関する説明は以下のページが参考になります。(Lighting Quality設定項目の半分ほどが説明されています。)
https://forums.unrealengine.com/development-discussion/architectural-and-design-visualization/62129-baselightmass-ini-a-summary-from-various-posts

上記の元スレッドで、BaseLightmass.iniついて様々な検証がなされています。(43ページもあります…!
https://forums.unrealengine.com/development-discussion/architectural-and-design-visualization/60547-lets-make-lightmass-epic-and-understandable?q=NumHemisphereSamples

 

 

DefaultLightmass.iniでプロジェクト固有のライトビルド設定にする

先程一旦飛ばしたBaseLightmass.iniの冒頭の注意文に以下のことが書かれています。

DefaultLightmass.iniを作成し、必要な項目だけオーバーライドすると良いようです。では試してみます。

 

以下のシーンをMediumProductionでライトビルドしてみます。


まず以下がMediumでライトビルドしたものになります。

次にProductionでライトビルドしてみます。

テーブルの部分にわかりやすく違いが出ています。

 

ではMedium設定をProduction設定で上書きしてみます。

DefaultLightmass.iniを作成し、プロジェクトフォルダのConfigに入れます。

そしてMedium設定でライトビルドします。

Production設定と同じになりました。

今回はMedium設定をProduction設定と同じにしてしまったのでiniファイルを変更している旨味がありませんが、部分的に必要な部分だけ調整すれば、効率的に高品質なライトビルド結果を得られたり、
エディタの
UIだけでは調整できないiniで調整できる項目がLighting Quality設定以外にもたくさんあります。
影の部分だけこうしたい、計算をもっと細かくしたい、といった調整がエディタ上でできない場合は、iniを調整すると良いかもしれません。

The post [UE4]LightBuildのクオリティ設定について first appeared on historia Inc - 株式会社ヒストリア.

[UE4] クリックした位置にアクタを貼り付ける方法

$
0
0
執筆バージョン: Unreal Engine 4.26

タイトルの通り、今回はクリックした位置にアクタを貼り付ける方法を紹介します。

通常のコピペ「Ctrl+C → Ctrl+V」「Alt+クリック&ホールド」を行うと、コピー元のアクタ同座標にペーストされますが、
以下の設定を行うと、同座標ではなくクリックした座標にアクタをペーストできるようになります。
※通常のコピペもそのまま使用できます。

設定方法

1.エディタの環境設定画面を開く

2.Generalのキーボードショートカット項目から「Level Edito “Paste Here”」のショートカットを設定します。

※英語設定は「paste」、日本語設定は「貼り付け」等で検索すると出ます。



とりあえずXキーを設定してみました。

使用方法

1.アクタをコピー


2.ペーストしたい場所をクリックし、先ほど設定した「X」キーを押す

3.ペーストされます!

-動画―

以上です!
ランダムに配置したい場合や、なんとなくこの辺に~の様な際に役立つ面白い機能です。
是非使ってみて下さい!

The post [UE4] クリックした位置にアクタを貼り付ける方法 first appeared on historia Inc - 株式会社ヒストリア.

年末年始休暇のお知らせ

$
0
0

平素は格別のお引き立てをいただき、厚く御礼申し上げます。

誠に勝手ながら、弊社では記の期間中、年末年始休暇のため休業とさせていただきます。
皆様にはご迷惑をおかけいたしますが、何卒ご了承いただきますようお願い申し上げます。

年末年始休暇
2020年12月29日(火)~2021年1月3日(日)

1月4日(月)より、通常通りに営業いたします。
何卒よろしくお願い申し上げます。

The post 年末年始休暇のお知らせ first appeared on historia Inc - 株式会社ヒストリア.

[UE4]ポストプロセスでフレア、パラエフェクトを作る

$
0
0
執筆バージョン: Unreal Engine 4.26

ハローワールド。アーティストの千葉です。
ぷちコン映像編2ndが絶賛開催中ということで、
今回は映像制作でよく使うフレア、パラの効果をUE4で再現してみようと思います。

■フレア、パラとは
アニメの撮影処理で画面全体に対してグラデーションをかける効果のことをフレアやパラというそうです。
ベタ塗りの絵の平坦な印象を緩和するためにかける効果のようですね。

■作り方
まずは上からのグラデーションを作ってみます。
[TexCoord]からスクリーンスペースのUV座標をRGの値で取得できるので、
そこからGの値を抜き出すことで縦のグラデーションを得られました。

上から下に向かってかかるグラデーションにしたいので[OneMinus]で反転し、
[Power]で明るい部分の幅を調整します。

だいぶそれっぽくなりましたが、グラデーションの方向や色を変えられるようにしたいので、
こんな感じにします↓

 

 

 

これだけでも十分いい感じですが上記の処理を使って、
加算と乗算のグラデーションを別々にかけれるようにしてみました。
(分かりやすくするためにちょっと強めに効果をかけています。)
↓Before

↓After

いつもよりグレイマンさんが凛々しく見えますね!

The post [UE4]ポストプロセスでフレア、パラエフェクトを作る first appeared on historia Inc - 株式会社ヒストリア.

新年のご挨拶 2021年

$
0
0

 

 

新年、あけましておめでとうございます!
代表の佐々木です。今年は年賀状をゲーム系とエンタープライズ系で2種類作りました。
ゲーム系は家でゲームにふける女の子。エンタープライズ系は2020年リリースの3作品を並べました。

ゲーム事業においては2020年は「ジョジョの奇妙な冒険 ラストサバイバー」のアップデート開発と、夏にロケテストが行われた「スピード錯覚アトラクション PAC-MAN RACER」の開発を行わせていただきました。そのほかにも様々なプロジェクトが動いており、全体としては仕込みの多い年となりましたが、その分2021年はいくつも展開がある年となりそうです。これまでのヒストリアではこなせなかったような規模のタイトルも走っており、それに伴い組織としての成長、そして社内メンバーの成長も日々実感しています。2021年はその成果をお届けできるよう、着実に歩みを進めていければと思います。

エンタープライズ事業においては、2020年から「ヒストリア・エンタープライズ」ロゴを新設しブランドとして切り分け、対外的にも攻めに打って出た1年となりました。リリース実績でも、過去一番面白い動きが出来た年だったのではないでしょうか。まだしばらくは自社のノンゲーム系の実績やUnreal Engineのエンタープライズ用途について、世に認識を広めるフェーズと捉えています。そのためにも、チームを規模的にも成長させ、2021年も皆さんに注目していただけるようなことを行っていけたらと思っています。

2020年はイレギュラーな年でありつつも、コミュニティー活動面でも週1ブログの継続、ぷちコン(春・夏・映像)、出張ヒストリア、アンリアルフェスの運営協力・講演&フェスジャム、コンテンツ東京2020出展、Unreal Engineエデュケーションサミット2020運営などなど、いつも以上にイベントを行わせていただきました。2021年はUnreal Engine 5がリリースされる年。設備面でも近々グレードアップし、オンラインイベントが展開しやすくなる予定です。我々もUnreal Engineの進化についていけるよう、情報発信、イベント等の新展開を予定しておりますので、ご注目頂けたら幸いです。

去年の2020年はすべての人にとって特別な年になり、2021年もそれが続くと思われます。そのような中でも、我々が物作りと情報発信に集中できているのは、取引先の皆様をはじめ、パートナー企業様、コミュニティーの皆様のおかげです。感謝申し上げます。

2021年も変化の目まぐるしい世の中に対して柔軟性を保ちながら、各方面で皆様に良い体験を与えられるコンテンツ作りに励んで参ります。
注目していて面白い企業であれるよう精進いたしますので、本年もどうぞよろしくお願いいたします。

 

代表取締役 佐々木 瞬

The post 新年のご挨拶 2021年 first appeared on historia Inc - 株式会社ヒストリア.

[UE4]Movie Render Queueでオブジェクトごとにマスクを自動作成

$
0
0
執筆バージョン: Unreal Engine 4.26

 

Movie Render Queueで一般的にCryptomatteとよばれるオブジェクIDの色分けがマスクが
Unreal Engine 4.26 で実験的機能で追加されました。

今回はこのマスクの作り方を説明していきたいと思います。

 

 

作り方

最初にプラグインを追加します。
PluginsでMovie Render Queue Additional Render Passesをオンにします。



実験的機能というポップアップがでるのでYes

再起動

 

シーンとカメラを配置できたら

Level Sequenceを作成

作ったLevel Sequenceにカメラをドロップしてショットを作成。
ここらは通常のシーケンサーでの動画作成と同じ手順です。

シーケンサーを書き出していきます。
Window>Cinematics>Movie Render Queueを表示

Movie Render Queueに先ほどのシーケンサーをドロップします。

Settings
Outputで.jpgを削除し、新らしく.exrを追加
RenderingでObject Idsを追加します。

Deferred Render
Disable Multisample Effect オン
Additional Post Process Materials 0と1をオン

これでモーションブラー、被写界深度、アンチエイリアシングをOFFにしてマスクのエッジをシャープにします。

設定が完了したらRender(Local)で書き出します。

マスク付きのexrファイルが書き出されました。

マスクの書き出しがうまくいっているか確認してみましょう。
PhotoshopでCryptomatteありのexr形式を開くにはExr-IOなどのプラグインが必要です。

Exr-IOを入れてファイルを開くとちゃんとマスクが作られていました。

Exr-IOでは色別のマスクが自動生成されるわけでなく
白黒のオブジェクトレイヤーが生成されるのでオブジェクトが多いとマスクとして使用するには手間はかかります。

NUKEなどのコンポジットソフトで設定して表示すると色分けされ表示可能です。

アウトライナで同じ名称のオブジェクトは1つのマスクでまとめらるようです。

コンポジットだけでなくUE4でレイアウトを作成しマットペイントに使うなど活用の幅は広いのでぜひ使ってみてください。

The post [UE4]Movie Render Queueでオブジェクトごとにマスクを自動作成 first appeared on historia Inc - 株式会社ヒストリア.


[UE4]UE4ぷちコン映像編2nd 応募作品公開!その1

$
0
0

UE4ぷちコン映像編2ndのエントリー作品一覧ページです。
今回は全部で41作品集まりました!!
応募いただいた皆さま、ありがとうございます!!

UE4ぷちコン映像編2nd応募作品一挙公開!
※コンテストの告知ページはこちらです。

UE4ぷちコン映像編2nd 応募作品一挙公開!
その1/その2

[エントリーNo.1]仮想スカイランタン雪まつり

ミート丸 さま

▼応募者コメント▼

コロナウィルスの影響で地元の雪まつりの開催が中止になったので、少しでも雪まつりの雰囲気を味わって頂ければと思い製作しました。

 

[エントリーNo.2]アニまるズの安息

mako さま

▼応募者コメント▼

森の奥にあるといわれている森の秘湯をついに発見!旅の疲れを癒し、ひと時の安息にぬくもりを感じるアニまるズたち。

 

[エントリーNo.3]浜辺の思い出

若宮一樹 さま

▼応募者コメント▼

映画を作る夢があり、UE4を試行錯誤しています。前回の映像編では、シーケンサーを使用しました。
タイムラインでの操作は作り易かったのですが、ブループリントが使用できませんでした。
今回は、プレイ開始にシーケンサーを開始させる事でブループリントは使用できましたが、タイムラインのようにシーク的に映像を操作する事ができませんでした。
どのように映像作品を作るのが良いのかのアドバイス等を頂けるとありがたいです。
次のアセットを使用させて頂きました。[Automotive Beach Scene][Paragon: Yin][Automotive Materials] どれも無料で凄い品質です。

 

[エントリーNo.4]帰る場所

Foltkaur さま

▼応募者コメント▼

家を中心に母と子の時の流れをイメージしました。

 

[エントリーNo.5]温もりの跡

Psyboo さま

▼応募者コメント▼

2020年はコロナやステイホームで閑散とした寂しさや一方で家庭(大切な人)と向き合う機会が多かった一年でした。
それらをふまえて家の「温もり」を1分間に込めて表現してみました。

 

[エントリーNo.6]ぬくもり(爆)

綾波レイ さま

▼応募者コメント▼

こたつを作ろうと思ったら失敗したので爆破しました。

 

[エントリーNo.7]PATHFINDER

平井秀次 さま

▼応募者コメント▼

荒廃した惑星を探索する一人の探検家。荒れ果てた大地を孤独に探索していると、奥地で巨大な樹木が息づいていた。というストーリーです。生命のぬくもりが少しでも伝われば幸いです。

 

[エントリーNo.8]秘湯を求めて

しまふくろう さま

▼応募者コメント▼

前人未到の雪山の山頂にあると伝えられる秘湯を求めて、無謀なグレイマンが山頂を目指しますが……?
凝縮されたストーリーとグレイマンのコミカルな動き、そして美しい景観が見どころです。
字幕はUE4のキャプション機能を使っています。

 

[エントリーNo.9]こたつでぬくぬく

かたつむりの中の人 さま

▼応募者コメント▼

こたつでぬくぬくしている様子です。

 

[エントリーNo.10]FAMILY

ぎんりゅー さま

▼応募者コメント▼

ぬくもりというテーマと家族の二つをテーマに考え、喧嘩しても家族はこういうものだよねというショートムービーになります。

 

[エントリーNo.11]帰る途中です。

Zf SilverFox さま

▼応募者コメント▼

もうすぐ国へ帰るなので、いつ親が老いていく、いつも若ママでいられないだろう、帰る途中、誰が食べ物を備えて、私を待ってる、だから、前に進まなければいけないだ。

 

[エントリーNo.12]Reboot

あまみ さま

▼応募者コメント▼

故郷から遠く離れた場所で仲間が一人、また一人といなくなり孤独になったグレイマン。残された彼もまた自ら思考を閉ざし機能を止めようとしていた。
そんな中、届いたメール。彼は再び動き出す。 そんなお話です。

 

[エントリーNo.13]遭難グレイマン

いっかく さま

▼応募者コメント▼

初めてレベルシーケンスを使いました。あとコントロールリグも初めて使いました。とても難しく、思うように行きませんでしたがなんとか完成させました。

 

[エントリーNo.14]温められて

ヒトシキリ さま

▼応募者コメント▼

温もりといえば焚き火かなと思いメインテーマにしました。雪があったほうがより強調されるかなと思い雪山をイメージしました。

 

[エントリーNo.15]UnrealEngineで制作したCM風動画

合成人間 さま

▼応募者コメント▼

手持ちのアセットの組み合わせで、映像を作ってみました。音楽付きも考えましたが、怒られそうなのでつけてません。最後までご覧いただいて脳内で音楽をお願いいたします!

 

[エントリーNo.16]極地の友

恒吉星光 さま

▼応募者コメント▼

猛吹雪で遭難した主人公。逃げ込んだ屋内で出会ったのは…

 

[エントリーNo.17]ぬくぬくねこぱんち

zohyo u さま

▼応募者コメント▼

ねこがこたつであたたまってる動画です。

 

[エントリーNo.18]アットホーム

ポメラニスト さま

▼応募者コメント▼

白狼さんが青い蝶に誘われて安寧の地を見つけるまでの話。 温かいって幸せですよね。 布団乾燥機最高。
ぷちコンに参加し始めて1年経ちました 以前より慣れたかな?と思うようでそうでもない。 相変わらずのギリギリ入稿。
今回は事前に Udemyの講座 「はじめてのアンリアルエンジン【Unreal Engine 4】入門チュートリアル講座」https://www.udemy.com/share/10200SAEcZc15RRHwB/ を勉強してからやってみました。
シーケンサーのところむっちゃ見直した。 相変わらずのアセット頼りですが アセットを使いこなすのも上達の内ってことにしておきましょう。
マップは「パーティクルエフェクト」 オオカミは「ANIMAL VARIETY PACK」 コテージは「Log Cabin」 蝶々は「Butterflies Collection (BP, Niagara + AI)」へへっ。買っちゃった

 

[エントリーNo.19]音で燃やして暖を取る

jirochi.sz さま

▼応募者コメント▼

ぬくもり と聞いて、思いついたのがレコード針の音とエレピの音。
手持ちの素材を貼り付けて曲を作ったらやたらとクールな曲に、、、それなら音で燃やして暖を取ろうと漂う箱にひたすら引火。

 

[エントリーNo.20]ふーとん

二度寝イレブン さま

▼応募者コメント▼

寒い朝はお布団の「ぬくもり」が恋しくないでしょうか?毎日お布団が離してくれないという経験がどんな方も一度は経験なさっているのではないでしょうか?
その経験をもとにお布団のぬくもりをテーマに映像を制作いたしました。

 

The post [UE4]UE4ぷちコン映像編2nd 応募作品公開!その1 first appeared on historia Inc - 株式会社ヒストリア.

[UE4]UE4ぷちコン映像編2nd 応募作品公開!その2

$
0
0

UE4ぷちコン映像編2ndのエントリー作品一覧ページです。
今回は全部で41作品集まりました!!
応募いただいた皆さま、ありがとうございます!!

UE4ぷちコン映像編2nd応募作品一挙公開!
※コンテストの告知ページはこちらです。

UE4ぷちコン映像編2nd 応募作品一挙公開!
その1/その2

[エントリーNo.21]Mistletoe

macchi さま

▼応募者コメント▼

ロボット一人が佇む世界で家の中にはねじ巻きで動く友達がいる。ロボットは寂しくなるとねじ巻きを回し友達と遊ぶ。
それは一人寂しい冬を乗り切るため友達というぬくもりを求めにきたのである…Mistletoe(ヤドリギ)の花言葉は「困難に打ち勝つ。」

 

[エントリーNo.22]夕方の森

栗崎健翔 さま

▼応募者コメント▼

UE4を初めて3日で何とか森の中にある湖の作成まで頑張りました、植物と夕日で温かみのある映像になったかなと思います

 

[エントリーNo.23]Night of the walking wolf

merao さま

▼応募者コメント▼

フェイシャルを含むアニメーション用モデルの作成と手付モーションの練習を目的に作ってみました。

 

[エントリーNo.24]Dragon’s love

Enigman さま

▼応募者コメント▼

生まれたドラゴンが初めて親を見るシーンを作ってみました

 

[エントリーNo.25]ぬくもり、求め

ぎーすー さま

▼応募者コメント▼

夕日がきれいな感じがぬくもりに繋がれば良いなぁ、と思います。アニメーションシーケンスを並べてブレンドしただけのものを、カメラで色々ごまかそうと頑張りました。

 

[エントリーNo.26]REVENGE

山田将嵩 さま

▼応募者コメント▼

昨年に引き続き、今年もご応募させて頂きました。ん?ぬくもりはあるんか??って感じの動画ですが、どうぞよろしくお願い致します!!

 

[エントリーNo.27]おらの村にも春を・・

大宮広樹 さま

▼応募者コメント▼

極寒の地・・、春の訪れを願う、祈祷師(きとうし)に起きた。奇跡の物語を大急ぎで製作したハートフル💛ストーリーです。
SpriteStudioを利用しました。

 

[エントリーNo.28]ある森のものがたり

hinata さま

▼応募者コメント▼

UE4ならではのストーリー性のある作品を作りたいと思い、MegascansやMixer、Bridgeを一から勉強してふんだんに取り入れました。
見せるところを絞ったことで画づくりに注力できました。

 

[エントリーNo.29]抜ク森

CGとか さま

▼応募者コメント▼

良い子のみんなは、むやみに森を引っこ抜かないようにね!

 

[エントリーNo.30]ignition sequence-イグニションシーケンス

サンセツビ空間計画 さま

▼応募者コメント▼

エンジンが赤々と光っているので、ぬくもりを感じていただければと。他、最後のほうに、森を抜けるので、『ぬけもり』とさせてください。
丸いPOD以外はすべてキットバッシュです。ライティングとカメラはミーヤキャットデモを流用しました。
ミーヤキャットの頭にPODを取り付けてライティングテストをしましたhttps://youtu.be/rQF_jDf4U4o

 

[エントリーNo.31][生放送]雑談します!!

Incl さま

▼応募者コメント▼

ボーカロイドを使ってなんか動画を作りたいと思ってしまった。 そしてUE4ぷちコン 映像編2ndが来てしまった。 世界的ですもんね 乗るしかない このビッグウェーブに!

 

[エントリーNo.32]ぬ、くもり

コンノヒロム さま

▼応募者コメント▼

UE4.26から女性型Mannequinが追加されて、ロマンティックなプロトタイピングも可能にになりましたね

 

[エントリーNo.33]喪失

千葉広大 さま

▼応募者コメント▼

良い機会なので学んだことの復習も兼ねて参加してみました!キャラモデルはVRoidの改造で制作し、モーションは妻(3Dアニメーター)に作ってもらいました。テーマについては、二度と取り戻すことのできない「ぬくもり」という解釈でストーリーを考え、悲劇的な展開との対比で暖かさを演出することにチャレンジしました。

 

[エントリーNo.34]Bonfire Lit

ネリスさん さま

▼応募者コメント▼

ControlRigの勉強を兼ねて。よい子はちゃんと火を消そうね

 

[エントリーNo.35]こたつでおひるね

阿部壮太郎 さま

▼応募者コメント▼

「ぬくもり」をテーマに、コタツに入ってうたた寝している時のぽかぽかとした夢うつつな時間をイメージして制作しました。

 

[エントリーNo.36]約束の木

りっと さま

▼応募者コメント▼

「ぬくもり」というテーマから、「人のぬくもり」、「自然が生み出すぬくもり」と考え、それに沿った構成にしました。
約束の木の下で過去に交わした約束を、グレイマンは不安になりながらなもその地へ向かいます。その木の下では、先に相手となるグレイちゃんが待っていました。
グレイマンは、全力で坂を駆け上がり、グレイちゃんのもとへと走っていきます。
桜の木と、周りはお花ばかり。ちょっとエモい感じで、心はぬくぬく!!!!!!!!

 

[エントリーNo.37]あの温もりはどこへ

taiyo さま

▼応募者コメント▼

グレイマンが気の迷いから温もりを感じて走る動画です。初めてのシーケンサー、アニメーション制作でしたが、色々と勉強になりました。

 

[エントリーNo.38]灯台島

wvigler さま

▼応募者コメント▼

ローポリ作品を作りたかった…レイトレーシングはローポリとの相性がかなり良いのですが、僕のグラボだとノイズがとても気になります。
設定上げすぎると今度はクラッシュするし…それにしてもアニメーションが上手くなりたいです

 

[エントリーNo.39]森の夜と昼

らいふぉ さま

▼応募者コメント▼

どこかの森で夜が明け、森が日光を浴びます。シーケンサーを使ったことはありますが、映像を作ったのは初めてです。アセットのほとんどはマーケットプレイスのものを利用しています。

 

[エントリーNo.40]UE4ぷちコン 映像編2nd応募作品「Twinmotionでぬくもり表現」

霜月(しもつき)@shimotuki2012 さま

▼応募者コメント▼

■作品説明 Twinmotionのプロジェクト内に水中と水上のシーンの 両方設けて、ぬくもり表現を模索しました。
最初のシーンは水中リングの輪を、2枚目のシーンには、 夕日の温かさにぬくもりをフォーカスしました。
テロップやフェード加工・サウンド挿入と動画結合は、 Adobe Premmire Proで行ってます。

 

[エントリーNo.41]IRORI

YTT さま

▼応募者コメント▼

囲炉裏をテーマにコミカルな動画を作成しました。3人で制作しました。

 

The post [UE4]UE4ぷちコン映像編2nd 応募作品公開!その2 first appeared on historia Inc - 株式会社ヒストリア.

[UE4]RetainerBoxを用いたUMG Jitterへの対処

$
0
0
執筆バージョン: Unreal Engine 4.26

こんにちは。エンジニアの小倉です。
今回は、UMG Jitterと呼ばれる現象に対して、簡易的な対処方法を紹介します。

0. 目次

1. UMG Jitterとは
2. 現象の再現方法
3. UVスクロールによる対処
4. ピクセル単位の移動と組み合わせる
5. 注意事項

1. UMG Jitterとは

この現象は、以下のページで話題にあがっています。
UE4 answerhub
Unreal Engine Forums

上記によると、UMG Jitterは主にウィジェットを平行移動・拡縮した際に、それらの変形がピクセルにスナップするために、ウィジェットがジリついて見える現象とのことです。これはRenderTransformを変更した場合だけでなく、ScrollBoxなどの子ウィジェットで内部的に平行移動した場合にも起こります。

これはUMGのどこでも起きる現象ですが、常に小さく動き続けるようなウィジェットでしか悪目立ちしません。多くの場合、ウィジェットは常に動きませんし、短い時間のアニメーションではほぼ気づきません。
よってここでは「現象が悪目立ちするウィジェット」に対して、Blueprintで簡易的に対処する方法を紹介します。また、今回は主に平行移動によって起きるUMG Jitter現象について紹介し、拡縮については取り扱いません。

2. 現象の再現方法

まず、大きさの異なるTextをHorizontalBoxに配置した「W_JitterTestA」を作成します。

次に、このウィジェットに以下のような平行移動の処理を追加します。
これは毎フレームX座標値を加算して、HorizontalBoxを平行移動させる処理です。

PIEで確認すると以下のようになり、ジリついていることが確認できます。

3. UVスクロールによる対処

UMG Jitterはウィジェットが平行移動したとき、新しい座標がピクセルにスナップして座標がとぶことで起こります。これを解決するには、ピクセルにスナップしない機能(例えばマテリアルなど)を使う必要があります。ここでは、RetainerBoxのEffect Materialを用いたUVスクロールによって、ウィジェットを擬似的に平行移動させる方法を紹介します。

まず、RetainerBoxで使うための以下のようなEffect Materialを作成します。
Translationが平行移動のパラメータで、TextureがRetainerBoxから渡される子ウィジェットの描画結果のテクスチャです。

W_JitterTestAを複製してW_JitterTestBを作成し、ウィジェットの親にRetainerBoxを追加します。
EffectMaterialには上記のマテリアルを設定します。

次に、平行移動の処理を「RenderTranslationの変更」から「DynamicMaterialInstanceのパラメータの変更」に書き換えます。ここで、ウィジェットの平行移動とUVスクロールによる平行移動を一致させるためにはDPIを考慮する必要があるので、GetViewportScaleの値を乗算します。

PIEで確認すると以下のようになりました。
上がSetRenderTranslationによる平行移動、下がUVスクロールによる平行移動です。

ジリつきはありませんが、左端から「UVスクロールによってループしてきた右端」が表示されています。
上の例では少しわかりにくいですが、この方法はウィジェット自体が平行移動しているわけではなく、RetainerBoxで描画されたウィジェットの表示位置をズラしているだけです。このためRetainerBoxの範囲外にある描画されていないウィジェットは、(実際には移動していないため)表示できないという問題があります。

4. ピクセル単位の移動と組み合わせる

表示するウィジェットがRetainerBoxの描画範囲に収まっているならUVスクロールによる方法でも問題ありませんが、実際にはClippingなどにより描画範囲が削られることもあり、汎用的に使うのは難しいです。そこで「2. 現象の再現方法」と「3. UVスクロールによる対処」の2つの方法を組み合わせて問題に対応します。具体的には、ピクセル単位の移動はウィジェットの平行移動で行い、サブピクセル単位の移動はUVスクロールで行います。イメージとしては、以下のように平行移動の値を整数部と小数部に分けて、整数部の移動をSetRenderTranslationで行い、小数部の移動をUVスクロールで行います。

はじめに、W_JitterTestBを複製してW_JitterTestCを作成し、平行移動の処理を以下のように変更します。

順に説明します。
まず、以下が平行移動の値を更新する処理になります。さきほど「整数部と小数部に分けて別々に処理する」と説明しましたが、実際にはViewportScaleによってピクセルの大きさ(「ピクセル単位」と呼んでいる基準の量)は変動します。ここで、Baseという変数はViewportScaleの逆数で、1ピクセルの大きさとなります(ViewportScaleの値はDPIであり、逆数をとると1ピクセルの大きさが得られます)。
もしViewportScaleが1なら、単純に平行移動の値を整数部の値と小数部の値に分けて処理できますが、ViewportScaleが1でない場合はViewportScaleの逆数を用いて、ピクセル単位の平行移動の値と、サブピクセル単位の平行移動の値をそれぞれ計算する必要があります。

ピクセル単位の平行移動の値は、以下のように計算します。

ピクセル単位の平行移動はSetRenderTranslationで行います。以下のように実装しました。

サブピクセル単位の平行移動の値は、以下のように計算します。

サブピクセル単位の平行移動はUVスクロールで行います。以下のように実装しました。 ※ 最後にBaseとGetViewportScaleノードと乗算していますが、説明のためにノードを残しているだけで、実際にはBaseとGetViewportScaleの乗算は1になるためこの部分の計算は不要です。

PIEで確認すると以下のようになりました。
一番下が2つの方法の組み合わせによる平行移動で、ジラつきがなく、またUVスクロールによるループもないことを確認できます。

5. 注意事項

この方法には、2つの問題があります。
1. RetainerBoxを使用した時点で見た目が少し変わる
2. RetainerBoxの描画範囲の端がチラつくことがある

1.はRetainerBoxを使うなら妥協が必要です。2.は以下のような現象ですが、UVスクロールを使うとどうしても見えることがあります。気になる場合は、端を表示しないようマスクなどで対処します。

The post [UE4]RetainerBoxを用いたUMG Jitterへの対処 first appeared on historia Inc - 株式会社ヒストリア.

【新卒採用】2021年3月卒業予定の学生の皆様へ。ヒストリアでは2022年卒枠でも応募いただけます

$
0
0

 

この度ヒストリアでは「2021年新卒期間延長制度」を設けることを決定しました。

この制度は2021年3月卒業の学生で、学校卒業後に就職先が決定していない場合2022年卒の新卒選考の対象者として受け入れを行う制度です。
本来であれば3月に学校を卒業し、翌月4月に入社された方を新卒入社と位置づけ、それ以外の時期に入社された方は中途入社として受け入れることが一般的とされていますが、
昨今の新卒コロナウイルスの影響で2021年卒の採用活動に大きく影響が出たことを受け、このような取り組みを行うことにいたしました。
新卒枠で入社していただくことにより、新卒独自の福利厚生や研修制度を受けていただけるほか、2022年卒の新卒と同期として働いていただけます。
入社時期に関してもご本人と相談しながら柔軟に対応を行う予定です。

なお、ヒストリアでは新卒を通年採用しているため、2021年3月卒業見込みで現状就職先が決定していない方がおりましたら、2021年4月入社枠として選考を進めることも可能です。
2021年3月に卒業見込みの学生のみなさま、まずは気軽に会社説明会からでも結構ですので、ぜひヒストリアにご応募をお待ちしております!


「2021年新卒期間延長制度」の概要

2021年3月卒業の学生を対象とし、学校卒業後に就職先が決定していない場合2022年卒の新卒選考の対象者として受け入れを行います。

 

【対象】

2021年3月の学校卒業後に就職先が決定していない学生の方
※大卒、専門学校卒など学歴は問いません

 

【採用フロー】

①ヒストリアにご応募いただく
 https://historia.co.jp/recruit/
 ※エンタープライズ事業ご希望の方も、ゲーム事業の新卒採用と同様の方法でご応募ください
書類選考
③面接
④インターンシップ(有給 / 1~3か月)もしくは、それに代わる選考
⑤採用内定
⑥入社
 入社時期に関しては内定後に本人と相談し決定します。
 内定後すぐの入社でも、2022年4月入社でも問題ありません。新卒研修は2022年4月に22年卒のメンバーと一緒に行います。

【募集職種】

ゲーム事業
・エンジニア
・プランナー
・3Dアーティスト
・UIデザイナー

エンタープライズ事業
・エンジニア
・3Dアーティスト

細かい募集要項に関してはこちらをご覧ください
https://historia.co.jp/recruit/

 

【中途採用との違い】

・本来であれば3月に学校を卒業し、翌月4月に入社された方を新卒入社と位置づけ、
それ以外の時期に入社された方は中途入社として受け入れることが一般的ですが、ヒストリアでは新卒枠としての受け入れを行います

・新卒独自の福利厚生や研修制度を受けていただけます
 ―福利厚生
   新卒住宅手当(月10,000円)
 ―研修制度
   新卒マナー研修
   新卒業界基礎研修
   職種ごとの課題による研修

・2022年卒の新卒と同期として働いていただけます

 

【事業内容】

ゲーム開発事業や、エンタープライズ事業などを行っています。

・ゲーム制作実績
https://historia.co.jp/products/

・エンタープライズ制作実績
https://historia.co.jp/enterprise/e_products/


学生向けオンライン会社説明会

2021年2月18日(木)18時30分より、学生を対象にしたオンライン会社説明会を行います。
代表の佐々木自ら会社について説明を行うほか、新卒入社の社員による座談会も実施予定です。
まずはヒストリアのことを知りたいという方はぜひご参加くださいませ。

詳細・お申込みはこちらから!


代表メッセージ

株式会社ヒストリア 代表取締役 佐々木 瞬

2020年は新型コロナウイルスの影響により、各学校・企業、刻々と変化する状況の中、対応に迫られた一年でした。そしてそれはいまも続いています。
一方で、オンラインミーティングやリモートワークの環境が整ったことにより、ものづくりに対する最適な体制を改めて追い求める良い機会となりました。

しかしながら、2021年卒業見込みの方々に対する新卒採用活動は、リアルで会う機会が作れず、オンラインでの施策も手探りとなり、例年よりも手薄になってしまったことは否めません。
弊社だけではなく採用活動が手薄になった企業は多いのではないでしょうか。
未曽有のこととはいえ、就職活動をする学生の方々の苦労は大変なものだったのではないかと思います。

そこでヒストリアでは、今回の「2021年新卒期間延長制度」を行うことにしました。
弊社はもともと通年採用のため卒業後も応募いただけますが、新卒年度扱いでない場合は、選考基準が中途採用と近い基準になってしまうということもまた事実です。
よって、2021年卒のみなさまが焦ることなく応募作品作りおよび就職活動を行えることを期待して、明確にアナウンスすることにしました。

ヒストリアでは毎年数名単位ですが新卒採用を行っており、2020年卒は6名、2019年は1名、2018年は3名の採用をしています。
現在彼らはプロジェクトのリーダー職や、居なくてはならないコアメンバーとして活躍してくれています。
今後のゲーム業界やエンタープライズコンテンツ業界、そしてヒストリアの成長のために若い力は必要不可欠です。

ぜひ少しでも興味を持ってくれた学生の方がいればご応募お待ちしています。

 

The post 【新卒採用】2021年3月卒業予定の学生の皆様へ。ヒストリアでは2022年卒枠でも応募いただけます first appeared on historia Inc - 株式会社ヒストリア.

【新卒採用】学生向けのオンライン会社説明会を実施します!

$
0
0

2021年2月18日(木)18時30分~
学生向けオンライン会社説明会 開催決定!!

 

この度ヒストリアでは、2021年、2022年卒業見込みの学生を対象にしたオンライン会社説明会を行うことになりました。
(2021年、2022年以外の代の方でもご希望の方はご参加いただけます)

いつもは「ほぼ月1会社説明会」として中途、新卒合同の説明会を行っていましたが、今回は学生の方限定の説明会となります。
代表の佐々木自ら会社について説明を行うほか、新卒採用の選考フローや、
求める人物像、新卒研修制度などについてもご紹介いたします。
また、新卒入社したゲームデザイナー、エンジニアの社員の座談会を予定しております。

ぜひお気軽にご参加くださいませ。

 

■日時

2021年2月18日(木)18時30分~
※説明会は90分程度を予定しています

 

■対象

2021年、2022年卒業見込みの学生の方
※2021年、2022年以外の代の方でもご希望の方はご参加いただけます

 

■新卒入社社員による座談会

ヒストリアに新卒入社したゲームデザイナー、エンジニアの計2名による座談会を予定しております。

小倉 裕貴 (エンジニア/2018年新卒入社)
<過去の講演経験>
出張ヒストリア! ゲーム開発勉強会2019 講演
 「アスレチックVR PAC-MAN CHALLENGE(パックマンチャレンジ)制作事例 ~Oculus Questを使用した我々の挑戦~」
UNREAL FEST EAST 2019 講演
「モバイルスペックで72fpsのVR!?「パックマンチャレンジ」での飽くなき挑戦。」

西尾 雅也 (ゲームデザイナー/2020年新卒入社)

 

■場所

オンライン開催
※ビデオ会議ツール「Zoom」を使用します。
事前にソフトのダウンロードをしていただきご準備をお願いいたします。

「Zoom」アプリのダウンロード
表情が見える状態で会社説明会を行いたい為、可能な限りカメラが使用できる媒体でのご参加をお願いいたします。

・パソコンから参加の方
https://zoom.us/client/latest/ZoomInstaller.exe

・スマートフォンから参加の方
iPhone
 https://itunes.apple.com/us/app/id546505307

Android
https://play.google.com/store/apps/details?id=us.zoom.videomeetings

 

■応募方法

ご参加希望の方は下記のフォームよりご応募くださいませ。

応募はこちらから!

 

当日まで参加受付を行っております。
たくさんのご参加お待ちしております。

 

The post 【新卒採用】学生向けのオンライン会社説明会を実施します! first appeared on historia Inc - 株式会社ヒストリア.

[UE4]消えないでStat!

$
0
0
執筆バージョン: Unreal Engine 4.25

■ごあいさつ

こんにちは、プランナーの谷口です。

何の数字だと思いますか?
私が携帯電話を変えた回数です、全く同じ機種に。

1回目:画面がバキバキに割れて交換。
2回目:不具合で電源がつかなくなって交換。
3回目:↑で交換したものも不具合で即交換。
4回目:画面がバキバキに割れて交換。

そんな感じです(*╹◡╹*)

携帯を交換する度に、色々な設定をし直したり、
アプリを入れ直したり、各所にログインし直したり……
非常に面倒でした。

特に、3回目の交換したての新品に不具合が発生した時なんかは、
あれこれ一通りやり終えて「さぁ、これからよろしくね」って
長い付き合いになるであろうNew携帯電話さんににっこりした後に
画面が真っ黒になり、そこから息を吹き返すことはありませんでした。
そして再び交換、再びあれやこれや……

同じ作業を何度もするのって本当に面倒ですよね。

(ここから本題)
UE4でも、起動する度に毎回やっていたことというのが地味に色々あって、
最初にしっかりセッティングしておくのって大事だなぁと思う今日この頃。

……と、結構無理やり繋げましたが、
UE4まだまだ勉強中の私が今回紹介するのは、
【ビューポートのStat表示を保存する】です!

「これ設定しておくと、毎回起動の度にやらなくて大丈夫だよ~」と
教えてもらった中の1つをお話しさせて下さい。

—————————————————-
■ビューポートのStat表示を保存する

・Stat FPS
・Stat UNIT

Statコマンドは色々あると思いますが、
最初の負荷計測によく使うこの2つでいきます!

※コンソールコマンドについては過去記事に記載してあるので、
よければこちらもご覧下さいませ。

 

この2つのコマンドを画面に表示させたはいいですが、
プロジェクトを閉じて再度開くと表示が消えている人、いませんか?
起動の度に毎回表示させている人、いませんか?

地味に手間ですよね、面倒ですよね、分かります。
よし、常に表示させましょう!

1.Editor Performances(エディタの環境設定)を開く

2.Save Engine Stats (エンジン統計の保存)にチェック

これだけです!
あとはStatコマンドを表示させた状態でプロジェクトを再起動してみると…

表示されたままの状態ですね!\(^o^)/

例えば、途中でFPSだけ表示させた状態に変更して状態保存したいのであれば、
UNITを消した状態でプロジェクトを閉じれば、
次に起動した時にはFPSのみ表示状態になります。

これで毎回毎回表示させる必要ございません!

—————————————————-
■おわりに

これまでもそうでしたが、
知らなくてもいいけど、知ってるとちょっとにっこり( ◠‿◠ )できる
そんな機能をご紹介していけたらなぁと思います。

「大変」という一言では済まされない世の中になってしまいましたが、
ほんの些細なイライラを減らしていって
みんなでにっこり( ◠‿◠ )していきましょう。

最後までご覧頂きありがとうございました!

The post [UE4]消えないでStat! first appeared on historia Inc - 株式会社ヒストリア.

【予告】Unreal Engine 4作品コンテスト「第15回UE4ぷちコン」を2月19日(金)より開催決定!

$
0
0

2、3日でサクッと作ってサクッと応募!

“第15回UE4ぷちコン”開催決定!

開催期間: 2021年2月19日(金)~4月5日(月)(4月6日(火)AM10:00)まで!

UE4ぷちコンとは、株式会社ヒストリアが主催する、
ゲームエンジン「Unreal Engine 4」の学習を目的とした
ゲーム制作中心の作品制作コンテストです!

UE4を触ったことがない方でも気軽に勉強できる機会を作りたいという思いから
「2、3日でサクッと作ってサクッと応募」をコンセプトに定期開催しております。

参加者は短期間(約1か月半)でテーマに沿った作品を制作・投稿し、入賞を目指します。

「UE4の学習」を目的としたコンテストなのでプロもアマチュアも関係ありません。
ぜひ皆さんのUE4に触れるきっかけにして頂けると嬉しいです!

テーマ発表は2月19日(金)

テーマ発表は第15回UE4ぷちコン特設ページにて行います。
テーマの発表と同時に開催概要を公開、コンテスト開始となります。
12:00に特設ページが公開されますので、お楽しみに♪

特設ページはこちらから

 

 

※UE4ぷちコンはご協賛いただける企業様を募集しております。
詳細は下記よりお問い合わせください。
ue4-petitcon@historia.co.jp

【告知サイト】 https://historia.co.jp/ue4petitcon15 (2月19日(金)12:00に公開)
【主催】 株式会社ヒストリア
【共催】 エピック・ゲームズ・ジャパン

The post 【予告】Unreal Engine 4作品コンテスト「第15回UE4ぷちコン」を2月19日(金)より開催決定! first appeared on historia Inc - 株式会社ヒストリア.


[UE4] UE4ぷちコン 映像編2nd 受賞作品発表!

$
0
0

UE4ぷちコン 映像編2nd 受賞作品が決定!

ゲームがメインの作品制作コンテスト UE4ぷちコンの番外編として開催された映像編!
今回は41作品が集まりました! たくさんのご応募ありがとうございました!

“ぬくもり”というテーマの中、考察させられる動画から楽しく温かい動画など
それぞれ考えるものはバラバラで面白いですね!

その中から最優秀賞含む7作品を選出いたしましたのご紹介します♪

受賞作品の発表はヒストリア公式YouTubeにて生放送で行いました!
惜しい作品の紹介も沢山おこなっております。
アーカイブが残っておりますので、まだの人はぜひご視聴ください♪

【第14回UE4ぷちコン】審査結果発表会!

<審査員>
・株式会社ヒストリア      佐々木 瞬(代表取締役 / プロデューサー / ディレクター)
・株式会社ヒストリア      有末 けい(広報/イベントデザイナー)

<ゲスト審査員>
・エピック ゲームズ ジャパン  岡田 和也(Software Engineer)
・エピック ゲームズ ジャパン 斎藤 修(Technical Artist)
・エピック ゲームズ ジャパン 向井 秀哉(Solution Architect)


【最優秀賞】灯台島

wvigler さま


【ぬくもってるで賞】森の夜と昼

らいふぉ さま


【おかず賞】Reboot

あまみ さま


【ずし賞】温もりの跡

Psyboo さま


【しゅーや賞】Mistletoe

macchi さま


【ささき賞】ぬくぬくねこぱんち

zohyo u さま


【けーちん賞】Night of the walking wolf

merao さま


受賞おめでとうございました!
そしてご参加いただきありがとうございました!

少しでもみなさんのUE4に触るきっかけになっていたら嬉しいです♪

次回開催もお楽しみに!

 

UE4ぷちコン 映像編2nd イベントページ

 

The post [UE4] UE4ぷちコン 映像編2nd 受賞作品発表! first appeared on historia Inc - 株式会社ヒストリア.

[UE4]ブループリント内の検索について

$
0
0
執筆バージョン: Unreal Engine 4.26.0

こんにちは、エンジニアの山中です。
皆さんがエディタを使用していく中で
エディタ内の検索機能を利用することが多々あるかと思います。
今回はその中のブル―プリント(以下「BP」と呼ぶ)内での検索に関する一部機能を紹介します。
※サンプルプロジェクト「Third Person」を使用させていただきました


↑こんなの

■BP内検索ウィンドウの出しかた

BP内にて以下のいずれかの操作を行います

①「Window」→「FindResults」を押下

②「Ctrl+F」

上記操作により表示される検索ウィンドウは
検索範囲がそのBP内のみとなりますが、
検索入力欄右側のアイコンを押下することで
プロジェクト内の全てのBPを対象に検索を行うことができます。


↑BP全体の検索ウィンドウ

■使いかた

①検索したいキーワードを入力

「update」という文字列を含んだ検索を行いたい場合、
入力欄にそのまま検索したいキーワードを入れます。
一般的に検索と言うとこの方法がポピュラーかと思います。

update

※大文字、小文字は区別しません


↑キーワードと一致する要素が検索結果として一覧化

また、「&&」や「||」を使用することで複合的な検索も可能です。

update || overlap


↑「update」「overlap」両方の文字列を含んだ要素が検索結果として一覧化

update && overlap


↑「update」「overlap」いずれかの文字列を含んだ要素が検索結果として一覧化

②サブフィルタ情報を利用した検索

①で紹介した検索結果を見ると、関数、引数、コメント等
様々な要素を対象に検索を行っていることが分かります。
特定の要素(例えば関数)のみを対象に検索を行いたい時には
サブフィルタと呼ばれる情報を使用します。

Functions(Name=update)

※「Name=」は省略可


↑キーワードと一致する「関数」のみが検索結果として一覧化

関数(Functions)の他に、
ノード(Nodes)、
ピン(Pins)、
変数(Variables)、等
様々なサブフィルタが使用可能です。

③ネスティング(入れ子構造)を利用した検索

②で紹介した機能に加え、ネスティングを利用することで
より詳細な検索を行うことができます。

Nodes(Name=PrintString && Pins(Name=Print to Screen && DefaultValue=true))


↑ピン「Print to Screen」の値が「true」のノード「PrintString」が検索結果として一覧化

少しややこしいですが、検索入力と検索結果の対応は以下の通りです。

要するに「ノード」と「そのノード内のピン」に対して
条件を追加することで、より細かな条件で検索を行う方法、ということになります。

いかがでしたか?
BP内の検索機能に関しては、
今回紹介していない内容もまだまだあります。
気になる方は以下の公式ドキュメントをご参照ください。
公式ドキュメントのURL → 「https://docs.unrealengine.com/ja/ProgrammingAndScripting/Blueprints/Search/index.html」

これらの情報を活用して、更なる開発効率UPを目指してみてください!

The post [UE4]ブループリント内の検索について first appeared on historia Inc - 株式会社ヒストリア.

[UE4]ぷちコン映像編2nd応募作品「喪失」振り返り

$
0
0
執筆バージョン: Unreal Engine 4.26

こんにちは、アーティストの千葉です。
今回はちゃっかり参加していたぷちコン映像編2ndの応募作品について解説したいと思います!

↓作ったもの

作品のコンセプト

今回は下記の3点を重視して制作を行いました。

1.キャラクター(人間)を登場させること。

普段は背景制作の仕事がメインなので、違う分野にチャレンジしたかったため。

2.ストーリー性の高い映像にすること。

仕事でコンセプトアートの制作を行うことがあるので、ストーリーを絵で伝えるスキルを伸ばしたかったため。

3.複数人での制作を行う。

一人で作ってるとだんだん飽きてきてエターナることありますよね。

上記を踏まえて、「ぬくもり」が失われるその瞬間を描く……という形でテーマを組み込んで、
制作を進めることにしました。

プリプロダクション

まずはキャラクターの設定画や絵コンテを制作します。

・キャラクターデザイン

映像編は期間が短く、キャラのモデルを真面目に一から作ることは難しかったので、
VRoidを利用することをこの時点で決めていました。
また、フェイシャルモーションの制作もちゃんとしたものを用意するのは期間的に難しそうだったため、
そもそも顔が見えなければフェイシャル作らなくていいじゃん!ということで、お面で顔を隠したキャラクターにすることにしました。
で、描いたのがこちら↓

ベースがあるとはいえモデリングに割ける時間は少ないのでなるべくシンプルなデザインで、
色とシルエットで差をつけるように意識しました。

・絵コンテ

全て載せると長くなるので一部抜粋ですが、
カメラワークやカットの尺をこの段階でほぼ決めています。
回想シーンのシームレスな場面転換はコンテを描いてるときに思いついたものです。
ちなみにキャラクターの名前は特に決めてないのでコンテには白子とか黒男って書いてありますね(´・ω・`)

プロダクション

・マテリアル

ぷちコンは学習用のコンテストということでちょっと変わったUE4の使い方にチャレンジしてみたかったので、
セルルックで絵を作ることにしました。

マテリアル内で処理したトゥーンのライティングをベースカラーに繋げて、ポストプロセスでキャラの部分だけベースカラーを表示するようにしています。
また、頂点カラーのアルファに陰になりやすさの情報(ほぼアンビエントオクルージョン)を格納して遮蔽された箇所にも陰影が入るようにしたり、ブループリントで専用のシャドウマップを作成してセルフシャドウにも対応したりしてます。

↓頂点カラーのアルファを表示した状態(陰影を階調化にする前に乗算してます)

アウトラインはポストプロセスで付けています。CustomDepthや法線から検出した線に加えて、頂点カラーで塗り分けた色からも輪郭検出しています。
頂点カラーはSubsurface Colorのピンに繋ぐことで取得しています。
当初はこの頂点カラーの塗り分けだけで必要な線を出せないかと考えていてRGBで細かく塗り分けたのですが、結局うまく行かずCustomDepthと法線も利用してアウトラインを描画しました。

↓CustomDepthの線

↓CustomDepth+法線から検出した線

↓CustomDepth+法線+Subsurface Color

↓輪郭検出に使っているSubsurface Color

・モデリング(キャラ)

前述した通りベースモデルにはVRoidを使用しました。Blenderのアドオン「VRM_IMPORTER」を使用して、VRoidから書き出したデータをBlender経由でMayaにインポートしてモデリングを行いました。
モデル自体のクオリティが高いだけでなく、ウェイトがとても綺麗で補助ボーン無しでも良い感じに変形してくれるので、セットアップの時間も大幅に短縮することができました!圧倒的感謝!!

個人的なこだわりで手首やお尻には変形を補助する骨を追加しています。追加した骨はリギングの際に自動で動いて補正するように設定しました。

・アニメーション

アニメーションは映像のクオリティに大きく影響する要素なので、プロのアニメーター(私の妻)に依頼して制作してもいました。
妻は普段ゲーム用のモーションを制作しているのですが、以前からカットシーンや映像作品のアニメーションも作りたいと話していたので誘ったら快諾してくれました。
後で牛角奢ります。

アニメーション制作は全てMayaで行いました。
自作のスクリプト「TimeRangeManager」でタイムライン上の各カットの範囲をリストアップし、切り替えながら制作を進めてもらいました。
カットとカットの間は尺の調整をしやすくするために間隔を開けていますが、「TimeRangeManager」はこの空白のフレームをスキップして連続再生する機能を実装しています。
将来的には他のツールと連携できるようにしたかったので、カットリストをCSVで書き出す機能も実装されています。
カット数が多いのでFBXの自動エクスポート機能も実装したかったのですがそこまでは手が回りませんでした。

リグも勉強のために自作しています。余計な機能はいらんと事前に言われていたのでかなりシンプルな構造です。

・モデリング(背景)

背景はほとんどモデリングしていません。基本的に購入したアセットを組み合わせて制作しました。
また、シームレスな場面転換を実現するために一つのレベル上で全ての背景を制作しました。
草原の1000m下に回想シーンの背景が配置されています。
カメラとキャラをまとめて動かす空のActorを用意して、切り替わるタイミングではシーケンサーでまるっと1000m下に移動させました。

・ライティング

背景のディテールが細かく出すぎるとセルルックのキャラが浮いて見えるので、あえてディテールを潰して省略を意識したライティングを行いました。
草原がどんよりした天気なのもフォグを強くかけてディテールを潰すためだったりします。

ポストプロダクション

ほぼ全てのカットでポストプロセスでフレアやディフュージョンフィルタをかけています。アニメでいう撮影の工程を再現しています。
これらの効果はくっきりとした陰影の絵と非常に相性がよく、この工程でルックがかなり良くなるので作っていて楽しかったです。
普通に映像を制作するのであればAfterEffects等でエフェクトをかけた方が楽ではあるのですが、ぷちコンのレギュレーションに則りUE4上で処理を再現して全ての作業を完結できるようにしてみました。

↓エフェクト無し

↓エフェクトあり

反省点

・期間の短さをあまり考慮できていなかった。

働きながらだと思ってた以上に制作の時間が取れない!
次はもっと「ぷち」な内容にして映像のクオリティに力を入れたいですね。

・セルシェーダーの実装が複雑

ブログで解説しておいてこんな事言うのもアレですが、今回の手法は結構強引な実装になっており、いろいろと問題が起きるのであまりオススメできません\(^o^)/
具体的にはポストプロセスの順番の問題でDOFかけたときに意図しない要素がボケて写り込んだり、エミッシブは別途抽出してセルシェーダーで上書きしないようにする必要があったり、ブルームが効かなかったり等々。
やりたい表現の一つ一つは簡単に実装できたのですがそれらが組み合わさると想定外の問題が起きて標準のUE4で特殊な表現を行うことの限界を感じました。
次回(もやるかはわかりませんが)セルルックで映像を作るときはいっそエンジン改造で専用のShading Modelを用意しようかと思っています……

……ということで早速エンジン改造にチャレンジしてみました!

複雑なBPを組まなくてもセルフシャドウが落ち、複数光源の環境(使う場面はあまりなさそうですが)にも対応できて大満足です!
GBufferもある程度自由に使えるので輪郭線の制御等もやりやすくなりそうです。
エンジン改造はバージョンアップ時の対応等デメリットも多いですが、自由度の高い絵作りができるので手段の一つとして試してみる価値はありそうです。
改造の詳細な手順については割愛しますが、多くのサイトやフォーラムでSubsurface Color等が書き込まれているGBufferのCustomDataを使用するにはBasePassCommon.ushの

#define WRITES_CUSTOMDATA_TO_GBUFFER

に定義を追加すれば良いと書かれていますが、今回改造したUE4.26では
DeferredShadingCommon.ushの

bool HasCustomGBufferData(int ShadingModelID)

にもCustomDataを使用したいShading Modelを追記しないとGBufferに情報を書き込めませんでした(泣)

まとめ

標準のUE4が得意としている絵作りとは違う方向性で制作を進めたことで、エンジンの仕様やセルルックの手法についてたくさんの発見がありました。
今回得た知見は実際の業務でも役に立ちそうなので、ぷちコンは学習用のコンテストとしてとても有意義なものだと思います。
皆さんも是非気軽に応募してみてください!

 

 

The post [UE4]ぷちコン映像編2nd応募作品「喪失」振り返り first appeared on historia Inc - 株式会社ヒストリア.

[UE4] 超!初心者向け!!○○したら△△する!

$
0
0
執筆バージョン: Unreal Engine 4.26

こんにちは。エンジニアの高柳です。
今回はUE4でロジックを組む時の基礎となる、「○○すると△△が起きる」をブループリントで実装する方法を教えます!

準備

超!初心者向け!!ということで、まずはUE4に入っているテンプレートを使ったプロジェクトの立ち上げ方から行きます。
Step1.任意のバージョンをインストールして、起動ボタンを押してください。今回はバージョン4.26.0を使います。Step2~3.ゲーム向けのロジックなので、ゲームを選んで次へ。

Step4~5.テンプレートと呼ばれる、UE4側である程度動くものがいくつか用意されているので、その中のサードパーソンを選びます。
Step6~7.プロジェクトデータの保存場所を決めます。保存容量の関係でCドライブ以外がお勧めです。

そして数分後・・・

実装

————————————————————-
ようこそUE4エディタへ。ここからが本編です。
————————————————————-
今回実際に作っていくのはこちら!
「足場に乗ったらその足場が上昇するギミック!」

では早速行きましょう
まずは専用のブループリント(以下BP)を作っていきます。
①と②をすると、「親クラスを選択」ウィンドウが出現します。
これから作るBPの基本的な「振る舞い」を決めるウィンドウです。今回は最も基本的な振る舞いをする「Actor」を選びます。

新しくコンテンツが追加されるので、名前を「BP_Elevator」にします。
UE4ではほとんどのデータを.uassetという拡張子で管理するので、エクスプローラーから見たときにそれが何か
一目でわかるようにブループリントなら「BP_」マテリアルなら「MT_」と名前の頭部分につける文化があります。

先ほど追加した「BP_Elevator」をダブルクリックしてください。すると以下のような画面が開きます。

BPでロジックを組む前に、当たり判定と足場を作ります。
左上のコンポーネントタブから、「+コンポーネントを追加」を押してください。
すると追加するコンポーネントの一覧が出てくるので、まずは「キューブ」をクリックしてください。
次に「コンポーネントの検索」に「Box」と入れて、出てきた「Box Collision」を選びます。

追加したら次は当たり判定と足場として、いい感じの形に変えていきます。
コンポーネントタブからCubeをクリックして、右下の詳細タブからトランスフォームを画像のようにしてください。

同じようにBoxをクリックして、右下の詳細タブからトランスフォームを画像のようにしてください。

出来たものを確認するとこんな感じになります。

さて、いよいよブループリントのロジックを組んでいきます。
UE4におけるブループリントはノードとノードを線でつなぎ合わせてロジックを組み立てるものです。
ノードとはイベント、関数呼び出し、フロー制御、変数等のオブジェクトのことです。
それらのノードに対して、白い線が動作の流れに、その他の色の線がデータの流れになっています。

まずは以下のように組んでいきます。ノードによって出し方が異なるので、左から順に説明します。

まずは「On Component Begin Overlap(Box)」。こちらはコンポーネントタブのBoxを右クリックして、Add Event→OncomponentBeginOverlapを追加 とすると出てきます。
こちらはBox Collisionと他のオブジェクトが重なったタイミングで呼び出される「イベントノード」です。
イベントノードはオブジェクトの立ち振る舞いの「開始の合図」を示します。
Begin Overlap以外にも、BeginPlay(オブジェクトが生まれた瞬間に呼ばれる)やTick(毎フレーム呼ばれる)等様々なものがあります。

次に「Delay」。こちらはイベントグラフと呼ばれる、ノードを配置するグリッドが書かれた場所で右クリックすると、
検索欄が出てくるので、そこでDelayと入れると出てきます。
Durationと書かれているところに数値を入れると、その秒数だけ実行の流れが遅延します。
今回は足場に乗ってから0.5秒後に動きだしてほしいので、このノードを挟んでいます。

その次に「Timeline_Elevator」。こちらはタイムラインノードといい、イベントグラフで右クリックし、
検索欄で「Add Timeline」や「タイムラインを追加」などと検索すると、「タイムラインを追加する…」と出るのでそれを選びます。
このノードは配置した後に好きに名前を変更できるので、適した名前にしてください。
設置した時点では黄緑色の線が出ている「Platform Z」がないので、それを追加する方法をご説明します。

タイムラインノードをダブルクリックするとタイムラインの編集画面が出てきます。
今回のメインではないので、次の画像の番号の順で手順だけ説明します。

①をクリックして、タイムラインで管理する変数を追加する。
②自体ははじめは存在しないので、右クリック→CurveFloat_0にキーを追加を押して、キーを追加する。
③時間を0.0 値を0.0にする
④こちらも②と同じようにキーを追加する。
⑤時間を2.0 値を200にする
⑥チェックボックスにチェックを入れる。
⑦右クリックして名前を変更でわかりやすい名前にする(今回は足場のZ座標を変更するために使うので「platform_Z」にする)
⑧イベントグラフに戻る

タイムラインは過去のブログでも何度か扱っているので、詳しく知りたい方はそちらをご覧ください。

さて、タイムラインが出来上がったら次は「MakeVector」を配置します。
こちらは先ほどのタイムラインの黄緑色の丸からドラッグし、イベントグラフ上でドロップすると検索欄が出てきます。
検索欄にMakeVectorと入れるとMakeVector4やMakeVector2D等も出てきますが、何もついていないものを選びます。
始めはXにつながっているのですが、黄緑色の丸にカーソルを合わせ、Altキーを押しながらクリックすると切断できます。

最後に「SetRelativeLocation」と「Cube」です。イベントグラフ上で右クリックし、検索欄に「SetRelativeLocation」と入れると複数でてくるので、
その中から「SetRelativeLocation(Box)」と書かれたものを選択すると2つがつながった状態で出てきます。

後は画像のようにつなぎ合わせると完成です。(完成図を改めて載せておきます。)

ここまで来たらもう一息です。
ブループリント画面の上の方にあるコンパイルボタンを押します。これを押すことで、自分が組んだブループリントがUE側で動くようになります。

コンパイルが出来たらブループリント画面を閉じてエディタ画面に戻ります。
戻ったらコンテンツブラウザから先ほど作ったBPをビューポートにドラッグ&ドロップして、実際に配置します。

配置が出来たら画面上部にあるプレイを押して確認していきます。

こんな感じにできていたら完成です。

 

最後に

少し長くなってしまいましたが、いかがでしたか?UE4のブループリントを初めて触る方に分かってもらえたら幸いです。
ブループリントでで何かを作るときは「イベントが呼ばれたらイベントに応じた動作をする」という流れが基本です。
今回は「オブジェクトの重なりを検知するイベント」が呼ばれたら、検知した側のオブジェクトを動かしました。
それ以外にも検知した側が、重なっているオブジェクトに何かをする場合もあるので、そちらはまた別の機会に紹介しようと思います。
それでは、良きアンリアルライフを!

The post [UE4] 超!初心者向け!!○○したら△△する! first appeared on historia Inc - 株式会社ヒストリア.

[UE4]レベルエディタでの座標のズレ

$
0
0
執筆バージョン: Unreal Engine 4.25

こんにちは、アートディレクターの黒澤です。
今回はUnreal Engineでレベルで配置したアクターの座標に意図しない端数が入ってしまう問題について解説したいと思います。

はじめに断っておきますが、Unreal Engineでは意図しない端数が頻繁に入るということではなく、端数が入る原因は初学者がやりがちなミスがほとんどです。少なくとも原因がわかっていれば対応はできます。

なぜ座標に意図しない端数が入るのか?

floatによる小数点誤差

Locationに意図しない端数が入る原因の一つにfloatによる小数点誤差問題があります。
多くの3Dアプリケーションでも同じことが言えるのですが、UnrealEngineの座標の値はfloatで持っています。floatとは、floating point number(浮動小数点)という型の数値表現で、あらゆる数値を厳密に表現できるわけではなく、特に小数点の表現で誤差が生じます。

適当なオブジェクトを原点に配置した後、LocationのXに、『100.1』を入力してみましょう。

『100.1』と入力したはずなのに、『100.0.99998』と表示されてしまいます。

これが浮動小数点の誤差です。

整数は比較的保護されるのですが、小数点はどんな厳密な値でも表現できるわけではないので注意してください。

浮動小数点とその誤差については、以下の記事がわかりやすかったです。
https://qiita.com/angel_p_57/items/24078ba4aa5881805ab2

クォータニオン

Rotationに意図しない値が入る場合は、クォータニオンに関する問題があります。
これもUnreal Engineに限った話でもないのですが、ビューポートで回転を行う際にはクォータニオンで計算しており、表示上はオイラーに変換して表現しています。

オイラーというのは、オブジェクトのローカル軸をローピッチロールで回転させて特定の方向を向ける表現形式のデータです。

クォータニオンとは『任意の回転軸を想定し、その軸に対してどれくらい回転しているか』という表現形式のデータです。オイラーもクオータニオンも表現形式が違うだけで、どちらも向きを表すデータです。

クォータニオンは『任意の回転軸に対する回転』というデータなので、別の回転軸においてはどれくらいの回転しているのかを簡単に求めることができるので、自然に別の方向に向けることができます。オイラーは一見シンプルなデータ形式なのですが、ジンバルロックが起こるようなケースがあり、計算上の問題を抱えているため、多くの3Dアプリケーションでは計算にはクォータニオンを使用しています。

クォータニオンは表示上はわかりにくい値なので、Unreal EngineのDetailパネルではオイラーに変換して表示しています。しかしクォータニオンはラジアンを使用したデータなので、弧度法から変換するときに誤差が生じます。

これもやってみましょう。

1.  回転を90°にスナップします。
2. Z軸(青い軸)をマイナス方向に回転させ、-90にします。
3. さらにマイナス方向に回転させ、-180にします。
4. 今度は逆にプラス方向に回転させます。

+90°に回転を行ったことで、-90になりそうなのですが、-89.999969°になります。
これがクォータニオンを変換したときの誤差です。

クォータニオンは以下の記事がわかりやすかったです。
https://qiita.com/drken/items/0639cf34cce14e8d58a5

ローカル座標系のままで操作

これはどちらかというとユーザーの誤操作によるものなのですが、グリッドにスナップしたいオブジェクトをローカル座標モードで移動することで、端数が入ってしまうとことがあります(ありました…

前述のようにfloatによる小数点誤差はグリッドスナップで移動すればかなり防げます。ですが、回転のスナップを使用してもクォータニオンの変換誤差は生じてしまうので、回転の値には端数が入ります。そこで回転に端数が入ったままローカル座標で操作すると、Locationの値も端数になってしまいます。

これもやってみましょう。

1. 先程の座標のように、回転に端数が入った状態を作ります。
2. ローカル座標モードで、グリッドスナップを使って移動します。

Z=-89.999969°という回転軸にそって移動したことで、Locationの値にもめちゃくちゃ端数が入ってしまいます(´;ω;`)

端数が入るのを避けるには

グリッドスナップをうまく使う

floatによる小数点誤差ですが、整数の誤差は起きにくいので、壁などのきっちり配置したいオブジェクトはグリッドにスナップして使えるように作りましょう

座標系を使い分けよう

ローカル座標系のままで操作することによるLocationのズレですが、ワールド座標で動かすと問題ないので、座標系はちゃんと使い分けましょう。
あと、そもそもの話として、アクターの座標の値には多少注意を払って作業することをおすすめします。

端数の座標を修正するには

実際の案件でも、このような座標系にまつわる様々なトラブルがあり、すでに配置が終わったレベルの座標に意図しない端数が入り込んでいました。
そこでレベル上の座標をまとめて修正するBlueprint Utilityを書きました。

具体的な処理は以下になります。

1.  選択したオブジェクトをリスト化
2. リストから順番に取り出して座標の値をRound関数で四捨五入
3. アクターの座標にセットする
4. 2~3をリストがなくなるまで繰り返します。

このようにBlueprint Utilityはレベル上のパラメータにもアクセスでき、簡単な処理でまとめて処理できるのでとても便利です。

The post [UE4]レベルエディタでの座標のズレ first appeared on historia Inc - 株式会社ヒストリア.

Viewing all 981 articles
Browse latest View live