Control + P でAIControllerと入力して
UE_4.26\Engine\Source\Runtime\AIModule\Classes\AIController.h
を開きます。
/* 特定の優先度にフォーカスアクターを設定し、結果としてFocalPointを設定します。*/ virtual void SetFocus(AActor* NewFocus, EAIFocusPriority::Type InPriority = EAIFocusPriority::Gameplay);
/ *特定の優先度にフォーカスアクターを設定し、結果としてFocalPointを設定します。 * /
/* Set Focus actor for given priority, will set FocalPoint as a result. */
virtual void SetFocus(AActor* NewFocus, EAIFocusPriority::Type InPriority = EAIFocusPriority::Gameplay);
こっちは
指定された優先度のフォーカスをクリアし、結果としてFocalPointもクリアします@paramInPriorityフォーカス優先度をクリアします。 何を使用すればよいかわからない場合は、おそらくEAIFocusPriority :: Gameplay * /を意味します。
virtual void ClearFocus(EAIFocusPriority::Type InPriority);
/** 指定された優先度のフォーカスをクリアし、結果としてFocalPointもクリアします
* @paramInPriorityフォーカス優先度をクリアします。 何を使用すればよいかわからない場合は、おそらくEAIFocusPriority :: Gameplay * /を意味します。*/
virtual void ClearFocus(EAIFocusPriority::Type InPriority);
フォーカスの優先度ってなによってなるので見てみると
その列挙型の定義を見てみると、デフォルトの動きとMoveとゲームプレイがあることがわかります
そしてそれらは基本的に優先順位の順にリストされています。
//これが通常の列挙型ではなく名前空間である理由は
//ゲーム固有のコードで拡張できるようにする
// @todoこれは少し面倒なので、リファクタリングする必要があります
namespace EAIFocusPriority
{
typedef uint8 Type;
const Type Default = 0;
const Type Move = 1;
const Type Gameplay = 2;
const Type LastFocusPriority = Gameplay;
}
struct FFocusKnowledge
{
struct FFocusItem
{
TWeakObjectPtr<AActor> Actor;
FVector Position;
FFocusItem()
{
Actor = nullptr;
Position = FAISystem::InvalidLocation;
}
};
TArray<FFocusItem> Priorities;
};
私たちは主にこのゲームプレイを使用するので、それらをあまり使用する必要はありませんでした
次に
UE_4.26\Engine\Source\Runtime\Engine\Classes\GameFramework\Actor.h
の
protected:
/** Overridable native event for when play begins for this actor. */
virtual void BeginPlay();
をコピーして
ShooterAIController.hにペーストしてオーバーライドします
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "AIController.h"
#include "ShooterAIController.generated.h"
/**
*
*/
UCLASS()
class SIMPLESHOOTERCP2_API AShooterAIController : public AAIController
{
GENERATED_BODY()
protected:
virtual void BeginPlay() override;
};
C:\Program Files\Epic Games\UE_4.26\Engine\Source\Runtime\Engine\Classes\Kismet\GameplayStatics.h
の
/** 指定されたプレーヤーインデックスのプレーヤーポーンを返します */
UFUNCTION(BlueprintPure, Category="Game", meta=(WorldContext="WorldContextObject", UnsafeDuringActorConstruction="true"))
static class APawn* GetPlayerPawn(const UObject* WorldContextObject, int32 PlayerIndex);
をみると指定されたプレーヤーインデックスのプレーヤーポーンを返しますので
// Fill out your copyright notice in the Description page of Project Settings.
#include "ShooterAIController.h"
#include "Kismet\GameplayStatics.h"
void AShooterAIController::BeginPlay()
{
Super::BeginPlay();
APawn* PlayerPawn= UGameplayStatics::GetPlayerPawn(GetWorld(),0);
SetFocus(PlayerPawn);
}
できたのがこれ