🐡

【UE5】Antigravityを使ってどんなことができるか試してみた

に公開

概要

この記事はUnreal Engine (UE) Advent Calendar 2025 シリーズ2の5日目の記事となります。

今回は最近発表されたAntigravityを使ってUEでどんな事ができるのかを試した記事となっております。

Antigravityを含むコーディングエージェントを使ってUEでどんなことができるのか知りたい方の参考になれば幸いです。

Antigravityとは

Googleが発表したAIを使ったコーディングアシスタントです。

特徴として、実装する際に簡単な計画書を事前に共有し、その実装で問題ないか提案してくれたり、その提案書に対してコメントをつけてレビューをすることができて再提案を求めることができます。

公式サイト

現在はパブリックプレビュー版が公開され、無料で試すことができます。

環境設定

今回は以下の環境で試した内容となっております

  • Antigravity パブリックプレビュー版(Gemini Pro3)
  • UE5.7.0

やりとり

ここからは実際にプロンプトを打ちながらどんなことを試したのか記載していきます。

UnrealEngineについて

試したのはまずUnrealEngineを使った実装ができるのかを確認するために以下のプロンプトを打ちました

UnrealEngineについてわかりますか?実装をお願いしたいです。

すると以下のような回答が帰って来ました

はい、Unreal Engine (UE5) の実装についてお手伝いできます。 C++とBlueprintの両方に対応可能です。 現在のプロジェクトは AntigravityTest という名前で、C++のソースコードも含まれているようですね。

具体的にどのような機能を実装されたいですか? (例:キャラクターの移動、特定のゲームメカニクス、UI、AIなど)

なるほど、では簡単なタスクとして以下のことをお願いしました。

Blueprintは作れるのか

個人的に一番気になっていたBlueprintは作れるのか確認しました。

CharacterがジャンプするAIを実装してほしいです。Blueprintでお願いします

すると以下のような回答が返ってきました

Blueprintの実装はバイナリファイルのため、直接作成することができません。 その代わり、実装手順をまとめた詳細なガイドを作成し、それ通りに進めていただく形でもよろしいでしょうか?

計画書(implementation_plan.md)を作成しましたのでご確認ください。 今回はシンプルに「一定間隔でジャンプするAI」をAI Controllerで実装する手順を提案します。

Blueprintは無理みたいですが、C++を使っての実装はできそうです。

キャラクターがジャンプする機能を持ったAIが作れるか

実際に提案してもらった内容で進めてもらって作成されたソースコードがこちらになります。

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "AIController.h"
#include "AntigravityAIController.generated.h"
/**
 * AI Controller that makes the character jump periodically.
 */
UCLASS()
class AAntigravityAIController : public AAIController
{
	GENERATED_BODY()
public:
	AAntigravityAIController();
protected:
	virtual void OnPossess(APawn* InPawn) override;
	virtual void OnUnPossess() override;
	UFUNCTION()
	void PerformJump();
private:
	FTimerHandle TimerHandle_Jump;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "AntigravityAIController.h"
#include "GameFramework/Character.h"
#include "Engine/World.h"
#include "TimerManager.h"
AAntigravityAIController::AAntigravityAIController()
{
}
void AAntigravityAIController::OnPossess(APawn* InPawn)
{
	Super::OnPossess(InPawn);
	// Start a repeating timer that calls PerformJump every 3.0 seconds
	if (UWorld* World = GetWorld())
	{
		World->GetTimerManager().SetTimer(TimerHandle_Jump, this, &AAntigravityAIController::PerformJump, 3.0f, true);
	}
}
void AAntigravityAIController::OnUnPossess()
{
	Super::OnUnPossess();
	// Clear the timer when unpossessing
	if (UWorld* World = GetWorld())
	{
		World->GetTimerManager().ClearTimer(TimerHandle_Jump);
	}
}
void AAntigravityAIController::PerformJump()
{
	// Check if we are controlling a character and make it jump
	if (ACharacter* ControlledCharacter = Cast<ACharacter>(GetPawn()))
	{
		ControlledCharacter->Jump();
	}
}

ぱっと見ですが動きそうなコードに見えたので、これで動作確認してしてみました。

だいたい15秒くらいでこれができてしまったのですごいと言わざるを得ませんでした…。

手順書(Agent workflow)を用意したらUE5の機能を作れるのか

AntigravityにはAgent Workflowという機能があり、簡単に言うと作業をお願いする際の手順書みたいなものがあります。

これを使うことで、例えばBehaviourTreeで使うDecoratorを新規で作るときに◯◯の時にTrueになるDecoratorを作ってくださいという風に依頼することができます。

とはいえ、どういう風に作ればいいかわからないと作る前は自分も思っていたのですが、Agentgravityに直接DecoratorのAgent workflowを作ってくださいと依頼したら以下のようなmarkdownファイルで作ってくれました。(ありがたい…)

依頼したプロンプト

AIで使うDecoratorを作るためのAgent workflowを作って欲しいです

以下出来上がったプロンプト

---
description: 新しいAI Behavior Tree Decoratorを作成する
---

1. ユーザーにDecoratorの名前を尋ねる (例: `BTDecorator_IsHealthLow`)。
2. このDecoratorが判定すべき条件ロジックをユーザーに尋ねる。
3. ヘッダーファイルを `Source/AntigravityTest/AI/Decorators/[DecoratorName].h` に作成する。
   - 以下のテンプレートを使用する:
     ```cpp
     #pragma once

     #include "CoreMinimal.h"
     #include "BehaviorTree/BTDecorator.h"
     #include "[DecoratorName].generated.h"

     /**
      * 
      */
     UCLASS()
     class ANTIGRAVITYTEST_API U[DecoratorName] : public UBTDecorator
     {
         GENERATED_BODY()

     public:
         U[DecoratorName]();

     protected:
         virtual bool CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const override;
     };
     ```
4. ソースファイルを `Source/AntigravityTest/AI/Decorators/[DecoratorName].cpp` に作成する。
   - 以下のテンプレートを使用する:
     ```cpp
     #include "AI/Decorators/[DecoratorName].h"
     #include "BehaviorTree/BlackboardComponent.h"
     #include "AIController.h"

     U[DecoratorName]::U[DecoratorName]()
     {
         NodeName = "[DecoratorName]";
     }

     bool U[DecoratorName]::CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const
     {
         // TODO: Implement condition logic
         // [User provided logic description]
         
         return Super::CalculateRawConditionValue(OwnerComp, NodeMemory);
     }
     ```
5. 実装計画が存在する場合は新しいファイルを追加し、そうでない場合はファイルが作成されたことをユーザーに通知する。

これを使って、2.の項目だけ達成するように以下のプロンプトを使って機能を作ってもらいました

ターゲットが見えていればTrueという条件でDecoratorを作って欲しいです

そうしたら出来上がったのがこちらになります

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTDecorator.h"
#include "BTDecorator_HasLineOfSight.generated.h"

/**
 * Checks if the AI controller has line of sight to the specified target actor.
 */
UCLASS()
class ANTIGRAVITYTEST_API UBTDecorator_HasLineOfSight : public UBTDecorator
{
	GENERATED_BODY()

public:
	UBTDecorator_HasLineOfSight();

protected:
	virtual bool CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const override;

	/** Blackboard key that holds the target actor to check line of sight to */
	UPROPERTY(EditAnywhere, Category = "Condition")
	FBlackboardKeySelector TargetKey;
};

#include "AI/Decorators/BTDecorator_HasLineOfSight.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "AIController.h"
#include "GameFramework/Actor.h"

UBTDecorator_HasLineOfSight::UBTDecorator_HasLineOfSight()
{
	NodeName = "Has Line Of Sight";
	
	// Filter the Blackboard Key Selector to only allow Actor keys
	TargetKey.AddObjectFilter(this, GET_MEMBER_NAME_CHECKED(UBTDecorator_HasLineOfSight, TargetKey), AActor::StaticClass());
}

bool UBTDecorator_HasLineOfSight::CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const
{
	AAIController* AIController = OwnerComp.GetAIOwner();
	if (!AIController)
	{
		return false;
	}

	UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent();
	if (!BlackboardComp)
	{
		return false;
	}

	// Get the target actor from the blackboard
	UObject* KeyValue = BlackboardComp->GetValueAsObject(TargetKey.SelectedKeyName);
	AActor* TargetActor = Cast<AActor>(KeyValue);

	if (!TargetActor)
	{
		return false;
	}

	// Check line of sight
	return AIController->LineOfSightTo(TargetActor);
}

触ってみた所感

ここ2週間くらい触ってみた所感も書いておきます。

現状はまだパブリックプレビューなのもあって、プロダクションで試すのはリスクが有る気がしました。

コーディングエージェント的に破壊的な変更もあると聞いていた(自分はそのケースにならなかったので大きいことをやろうとすると起きる?)ので、試すにしてもバージョン管理(自分はGitを使いました)で管理しながら試したほうがいい気がしました。

C++やUE特有かもしれませんが、publicではない変数を別のクラスが参照して実装したときもあったり、GameplayAbilityのPluginを追加してないけどGameplayAbilityを使う前提で実装したこともあったので、そこら辺のルールもAgent workflowに書けば解決するのかどうかも気になりました。

コード書ける機能ならどんどん使えるのでは?と思ったのですが、残念ながらレートリミットというAIを使い続けているとAIが特定の時間になるまで応答しなくなる現象があるため、何時間も使い続けるのは難しそうでした。
自分も1回レートリミットになって1時間くらいAIとのやりとりができないときがありました。

他のコーディングエージェントはトークンの量でレートリミットになるか決まるみたいですがAntigravityは作業量に応じて決まるみたいな話も聞くので、そこら辺が正式リリースされた時にレートリミットの扱いがどうなってるのかが気になりました。

今回試せなかったですがテスト機能をこちらで用意して、実装してもらう際にそのテストが通ったらマージリクエストを出すなども出来たら並列で開発できそうだなと感じました。

Antigravityの方のTipsになりますが、Antigravityを日本語化にすることで提案書や依頼書の内容が理解しやすくなったので入れておいたほうがいいなと感じました。

参考:GoogleAntigravity 日本語化3点セット

まとめ

なんとなくどんなことができるか伝わったでしょうか?

一番気になっていたブループリントは作れないのが残念でしたが、C++だけでも作ってくれるのはとてもありがたい感じがしました。

Antigravityは最初に提案書を作ってくれるため、概要だけでもどういう風に実装するのか確認できるのはいいなと思いました。

また、Agent Workflowを使って機能を作る時に手順化できるのが個人的にいいなと感じました。
今回はDecoratorでしたが、GameplayAbility用のAgent Workflowなど、よく使うクラスがあればそれのAgent Workflowも作っておいたほうがより良い開発ができそうだなと感じました。

発表されたばかりのツールのため、どんなことができるか手探りで解説していきましたが、少しでもお役に立てたのなら幸いです。

また便利だなと思う機能やこう使ったら作るのが便利になったなどあれば記事を書こうと思います。

ここまで読んでいただきありがとうございました。

Discussion