AI камер 2, AIPerception точки, C++


https://youtube.com/live/iHBE1jmZkJY

Второй вариант AI камеры видеонаблюдения, более «честный». Как научить AIPerception размещаться и смотреть из нужных нам мест.

Код C++ который я использовал в своих решениях:
В файле «.h», после «public:» добавляем:

virtual void GetActorEyesViewPoint(FVector& OutLocation, FRotator& OutRotation) const override;

В файле «.cpp», в зависимости что нам нужно, добавляем все или некоторые из этих:

#include "Components/CapsuleComponent.h"
#include "Components/StaticMeshComponent.h"
#include "Engine/Engine.h"

Тут первое — если будем искать приклеплённые к капсуле компоненты, среди которых меш с нужным нам тегом «Eyes».
Второе — обязательно если ищем меш.
Третье — только если нужно будет выводить текст в движке подобно printstring.

А это общий код для файла «.cpp», содержащий закомментированные иные варианты, если понадобятся:

void ACPP_CamSurvBase::GetActorEyesViewPoint(FVector& OutLocation, FRotator& OutRotation) const
{
    //OutLocation = GetMesh()->GetSocketLocation("HeadSocket");
    //OutRotation = GetMesh()->GetSocketRotation("HeadSocket");
    OutLocation = GetRootComponent()->GetRelativeLocation();
    OutRotation = GetRootComponent()->GetRelativeRotation();
    //FRotator CurrentRotation = GetRootComponent()->GetRelativeRotation();
    //FRotator NewRotation = CurrentRotation + FRotator(-25.0f, 0.0f, 0.0f);
    //OutRotation = NewRotation;
    //const TArray<USceneComponent*> ChildComponents = GetRootComponent()->GetAttachChildren();
    const TArray<USceneComponent*> ChildComponents = GetCapsuleComponent()->GetAttachChildren();

    for (USceneComponent* Child : ChildComponents)
    {
        // Проверяем, является ли компонент StaticMesh и имеет ли тег "Eyes"
        if (UStaticMeshComponent* StaticMesh = Cast<UStaticMeshComponent>(Child))
        {
            if (StaticMesh->ComponentHasTag("Eyes"))
            {
                OutLocation = StaticMesh->GetComponentLocation();
                OutRotation = StaticMesh->GetComponentRotation();
                /*
                FString Message = FString::Printf(
                    TEXT("Found Mesh with Tag 'Eyes'! Location: %s, Rotation: %s"),
                    *OutLocation.ToString(), // Конвертируем FVector в строку
                    *OutRotation.ToString() // Конвертируем FRotator в строку
                );
                if (GEngine)
                {
                    GEngine->AddOnScreenDebugMessage(
                        -1, // ID сообщения (-1 означает, что сообщение уникально)
                        50.0f, // Время отображения сообщения в секундах
                        FColor::Green, // Цвет сообщения
                        Message  // Текст сообщения
                    );
                }
                */

                return; // Выходим из функции после нахождения первого совпадения
            }
        }
    }
}

В текущем виде он ищет меш с тэгом «Eyes» среди прикрелённых к капсуле, для замены класса Character(где есть капсула).
Если это нужно в простой pawn, то раскомментируйте строку:

const TArray<USceneComponent*> ChildComponents = GetRootComponent()->GetAttachChildren();

И закомментируйте следующую для капсулы:

const TArray<USceneComponent*> ChildComponents = GetCapsuleComponent()->GetAttachChildren();

Если нужно как для бота в следующем видео, чтобы зрение исходило из сокета «HeadSocket» прописанного в скелете бота, то нужно раскомментировать эти две строки и закомментировать всё остальное после них:

OutLocation = GetMesh()->GetSocketLocation("HeadSocket");
OutRotation = GetMesh()->GetSocketRotation("HeadSocket");

 

Во всём помогли и вдохновили видео:
Заменяем стандартную функцию определения точки зрения AIPerception на нужную нам, чтобы «зрение» происходило из нужных нам мест и углов — https://youtu.be/rDXGeXK-PNI

Делаем стекло, и учим AIPerception смотреть сквозь него — https://youtu.be/VCqg25Zxd7Y

Заставляем AIPerception следить за головой персонажа а не центром тушки — https://youtu.be/rYWoyz5Hwy8, или сокетами — https://youtu.be/J8UuAtDeR6M

Как удалить ранее созданные но уже не нужные C++ классы из проекта — https://youtu.be/kU9EXDHPJiQ

Простой гайд по AI с которого я начал — https://youtu.be/E-CfaDdjBic
Подробные уроки по AI из которых я узнал как научить роботов видеть(одно из видео) — https://youtu.be/cfizSLpfN64

Мои проекты:
Библиотека звуков — https://www.simpra.org/sound/

Мой ассет рыб — https://www.unrealengine.com/marketplace…

Моя игра — «Tear of Time: Lost memory»
Купить игру в Steam — https://store.steampowered.com/app/1802920/
Купить игру в VKPlay- https://vkplay.ru/play/game/tearoftime_lm/
Купить игру в Epic Games Store — https://store.epicgames.com/ru/p/tear-of-time-lost-memory-add761
Страница ранней демо-версии на itch.io — https://simpra-org.itch.io/tear-of-time-ep1-demo
Другие ссылки на раннюю демо-версию игры:
https://77.md/hata1-g
https://77.md/hata1-m

Добавить комментарий