emin2045

Unreal MVP
23 Haz 2020
144
1
60
28
26
(20) Denizli
www.youtube.com
AI controller yaparken şu içine aldığım kısmı yazmamıştım. Yazmadığım için BeginPlay kısmındaki SetFocus çalışmadı. Tam olarak sebebi oturmadı kafama. Bu Super keywordunu hep, -her zaman- override ettiğimiz zaman mı kullanıyoruz?
Kod:
#include "ShooterAIController.h"
#include "Kismet/GameplayStatics.h"

void AShooterAIController::BeginPlay() 
{
    Super::BeginPlay();
    
    APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(),0); // Normalde bu ikisi burada. Tick içinde ben aldım.
    SetFocus(PlayerPawn);
}

void AShooterAIController::Tick(float DeltaSeconds) 
{
    Super::Tick(DeltaSeconds);

    APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(),0);
    MoveToActor(PlayerPawn, 200);
}

------------------------Çözüldü

Bknz 2. yorum
 
emin2045' Alıntı:
AI controller yaparken şu içine aldığım kısmı yazmamıştım. Yazmadığım için BeginPlay kısmındaki SetFocus çalışmadı. Tam olarak sebebi oturmadı kafama. Bu Super keywordunu hep, -her zaman- override ettiğimiz zaman mı kullanıyoruz?

#include "ShooterAIController.h"
#include "Kismet/GameplayStatics.h"

void AShooterAIController::BeginPlay() 
{
    Super::BeginPlay();
    
    APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(),0); // Normalde bu ikisi burada. Tick içinde ben aldım.
    SetFocus(PlayerPawn);
}

void AShooterAIController::Tick(float DeltaSeconds) 
{
    Super::Tick(DeltaSeconds);                

    APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(),0);
    MoveToActor(PlayerPawn, 200);
}
    

  Evet öyle diyebiliriz. Super "Benim üst sınıfım" demektir. Mesela senin durumda üst sınıf AIController class ı bu yazdığın controller ın üst class ı. Eğer BeginPlay() Tick() vb. gibi engine tarafından direk kullanılan fonksiyon yazıyorsak %99.9 Super:: versiyonunu da çağırmalıyız. Çağırmazsak engine buna göre dizayn edilmiş değil ve bir sıkıntı çıkar. Geriye kalan %1 durumda da büyük ihtimalle bir sıkıntı yaratmaz. 
  Mesela yine senin durumda BeginPlay de SetFocus() fonksiyonunu kullanmışsın. Bu belirttiğin actor e FocalPoint atamak için kullanılıyor. Sonra Tick() te MoveToActor() kullanmışsın. Bu da o an ki focalpoint e göre actorun belirli bir yere gitmesini sağlıyor. Sen Super::  versiyonunu yani AAIController::Tick() i çağırmadığında dolaylı olarak kendi super yani ata class ı olan AController::tick i çağıramıyor. O da AActor un tick ini çalıştıramıyor ve bu böylece UObject e kadar gidiyor.
   Zaten AAIController::Tick() e baktığın zaman şöyle diyor:
Kod:
void AAIController::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	UpdateControlRotation(DeltaTime);
}

UpdateControlRotation neye rotation ı ayarlıyor. FocalPoint  e göre ayarlıyor. Dolayısı ile sistem bir yerinden patlak veriyor.

 Sonuç, BeginPlay() , Tick()  Constructor vb. tüm temel engine fonksiyonlarında mutlaka Super:: i çağırıyoruz. Şu an yazmamamız gereken bir zaman aklıma gelmiyor.


Kolay gelsin.