Как мне проверить совпадение с порожденными участниками? UE4 C

#c #unreal-engine4

#c #unreal-движок4

Вопрос:

Я совсем новичок в C и UE4. Я создаю базовую игру snake в UE4, и я не могу заставить snake запускать событие перекрытия, когда оно перекрывается с фруктами, которые съест змея. Плод создается при начале воспроизведения в случайных координатах при каждом запуске.

Я тестировал перекрытие с актерами, которые не порождены (т. Е. С актерами, Которые уже находятся в сцене), и это работает нормально. Похоже, что существует проблема с тестированием на перекрытие порожденного актера. Я использую IsOverlappingActor() функцию.

Я думаю, что с указателем что-то не так Fruit . Я не уверен, что именно, потому что, когда я извлекаю во время воспроизведения и нажимаю на порожденный плод, в разделе сведений Fruit указатель, по-видимому, инициализируется с помощью схемы элементов fruit.

Это мой порожденный код:

 void ASnake::SpawnFruit()
{
    if(!FruitClass)
    {
        UE_LOG(LogTemp, Error, TEXT("FoodClass NOT ASSIGNED"));
        return;
    }
    if(FruitClass)
    {
        const float RandX = FMath::RandRange(0.0f, 2000.0f);
        const float RandY = FMath::RandRange(0.0f, 2000.0f);
        
        const FVector SpawnLocation = FVector(RandX, RandY, 50.0f);
        const FRotator SpawnRotation = SnakeHead->GetComponentRotation();

        Fruit = GetWorld()->SpawnActor<AFruit>(FruitClass, SpawnLocation, SpawnRotation);
        Fruit->SetOwner(this);
    }

    // TODO: Delete and spawn new food when overlap with snake
    // TODO: Spawn snake segments when overlap with food
}
 

Это код в галочке:

 if(Snake->IsOverlappingActor(Fruit))
{
    UE_LOG(LogTemp, Warning, TEXT("OVERLAP OCCURED"));
}
 

Ответ №1:

Вместо того, чтобы вызывать эту функцию при Tick, вы должны вместо этого создать USphereComponent или UBoxComponent на вашем Snake в качестве триггерного тома, на который затем вы можете подписаться на его делегатов OnBeginOverlap и OnEndOverlap для проверки перекрытий участников Fruit.

 // .h
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true"))
UBoxComponent* Volume;

// .cpp
ASnake::ASnake()
{
    Volume = CreateDefaultSubobject<UBoxComponent>(TEXT("Volume"));
    Volume->SetupAttachment(GetRootComponent());
    Volume->InitBoxExtent(FVector(1000.f, 1000.f, 1000.f));
    Volume->SetCollisionResponseToAllChannels(ECR_Overlap);
}

void ASnake::PostInitializeComponents()
{
    Super::PostInitializeComponents();

    Volume->OnComponentBeginOverlap.AddDynamic(this, amp;ASnake::OnVolumeBeginOverlap);
    Volume->OnComponentEndOverlap.AddDynamic(this, amp;ASnake::OnVolumeEndOverlap);
}

void ASnake::OnVolumeBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResultamp; SweepResult)
{
    if (Cast<AFruit>(OtherActor))
    {
        // Do something to the Fruit.
    }
}

void ASnake::OnVolumeEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
    if (Cast<AFruit>(OtherActor))
    {
        // Do something to the Fruit.
    }
}
 

Также убедитесь, что в вашем компоненте столкновения Fruit Blueprint включена функция GenerateOverlaps.

Комментарии:

1. Привет, спасибо за ваш ответ. Я реализовал предложенный вами код, но у меня все та же проблема. Я могу запустить код в OnVolumeBeginOverlap to, если я изменю оператор if на if (Cast<AFruit>(Fruit)) , но это срабатывает, как только я запускаю игру, а не когда это предполагается. …. Чтобы уточнить, Fruit это указатель на созданный план Fruit.

2. Итак, я протестировал OnVolumeBeginOverlap функцию без оператора if и с сообщением UE_Log, и, похоже, она запускается, как только я нажимаю play.

3. Ну, очевидно, что если вы приведете объект Fruit к Fruit, он вернет True. Идея заключается в том, что вы приводите любой объект, объем которого будет перекрываться, к фрукту, чтобы вы могли проверить, действительно ли этот объект является фруктом.

4. Вы должны распечатать имя объекта, который вы перекрываете, чтобы вы могли видеть, что его вызывает, либо это, либо использовать точку останова для приостановки выполнения вашего кода, чтобы вы могли проверить, каково его значение.

5. Я создал массив OverlappingActors и распечатал их в журнале вывода, используя Volume->GetOverlappingActors(OUT OverlappingActors); . Согласно выходному журналу, два участника Volume , с которыми они перекрываются, — это the Board и the Snake . Однако, когда я перекрываюсь с порожденным плодом, вывод в журнал отсутствует. Таким образом, он явно не распознает, что объем перекрывается с актером fruit, когда я перекрываю fruit. Я убедился, что генерация событий перекрытия включена как в коде, так и в схеме, а также во время воспроизведения.