相机抖动未激活不真实的C++; 我试图用虚幻的C++来为我的角色设置一个相机抖动。

相机抖动未激活不真实的C++; 我试图用虚幻的C++来为我的角色设置一个相机抖动。,c++,unreal-engine4,C++,Unreal Engine4,目前,我在头类中声明实例变量 使用日志输出,代码到达OnFire()函数中的正确位置,这意味着所有指针都不为null。但是相机抖动不起作用 UPROPERTY(EditAnywhere) UCameraShake* CShake; //我是这样称呼它的 void AZombieCharacter::BeginPlay(){ SetUpCameraShake(); } ... void AZombieCharacter::OnFire() { ... auto CTRLR

目前,我在头类中声明实例变量

使用日志输出,代码到达OnFire()函数中的正确位置,这意味着所有指针都不为null。但是相机抖动不起作用

UPROPERTY(EditAnywhere)
UCameraShake* CShake;
//我是这样称呼它的

void AZombieCharacter::BeginPlay(){
    SetUpCameraShake();
}


...

void AZombieCharacter::OnFire() {

...
    auto CTRLR = UGameplayStatics::GetPlayerController(GetWorld(), 0);

    if (CTRLR) {
        auto CM = CTRLR->PlayerCameraManager;
        if (CM) {
            CM->PlayCameraShake(CShake->GetClass(), 1.0f);
        }
        else {
            UE_LOG(LogTemp, Warning, TEXT("CANNOT FIND CM"));
        }
    }
    else {
        UE_LOG(LogTemp, Warning, TEXT("CANNOT FIND CTRLR"));
    }
}
...
void AZombieCharacter::SetUpCameraShake() {


    CShake = UCameraShake::StaticClass()->GetDefaultObject<UCameraShake>();

    CShake->OscillationDuration = 4.f;
    CShake->OscillationBlendInTime = 0.5f;
    CShake->OscillationBlendOutTime = 0.5f;

    CShake->RotOscillation.Pitch.Amplitude = FMath::RandRange(5.0f, 10.0f);
    CShake->RotOscillation.Pitch.Frequency = FMath::RandRange(25.0f, 35.0f);

    CShake->RotOscillation.Yaw.Amplitude = FMath::RandRange(5.0f, 10.0f);
    CShake->RotOscillation.Yaw.Frequency = FMath::RandRange(25.0f, 35.0f);
}
void AZombieCharacter::BeginPlay(){
SetUpCameraShake();
}
...
void AZombieCharacter::OnFire(){
...
auto-CTRLR=ugameplaystics::GetPlayerController(GetWorld(),0);
如果(CTRLR){
自动CM=CTRLR->PlayerCameraManager;
如果(厘米){
CM->PlayCameraShake(CShake->GetClass(),1.0f);
}
否则{
UE_日志(日志温度、警告、文本(“找不到CM”);
}
}
否则{
UE_日志(日志温度、警告、文本(“找不到CTRLR”);
}
}
...
void AZombieCharacter::SetUpCameraShake(){
CShake=UCameraShake::StaticClass()->GetDefaultObject();
CShake->振荡持续时间=4.f;
CShake->振荡blendTime=0.5f;
CShake->振荡blendotime=0.5f;
CShake->RotOscillation.Pitch.Amplium=FMath::RandRange(5.0f,10.0f);
CShake->rotsolation.Pitch.Frequency=FMath::RandRange(25.0f,35.0f);
CShake->RotOscillation.Yaw.Amplium=FMath::RandRange(5.0f,10.0f);
CShake->RotOscillation.Yaw.Frequency=FMath::RandRange(25.0f,35.0f);
}

谢谢。

Play Camera Shake接受一个
UClass
/
TSubClassOf
知道这会让我们认为该函数最终会构造一个新对象,并忽略默认对象选项

我建议对
UCameraShake
类进行子类化,并使用
tsubclasssof
来存储类类型,而不是像
CShake
这样的指针。因为它可能是在你不知道的情况下收集的,谁知道呢

这是UCAMASASHAKE的C++教程。


没有播放抖动的原因可能是没有实际参数传递给抖动。仅默认值尽管您尝试设置默认值,但对于新创建的对象,它似乎没有将其考虑在内。

感谢您的回复。我确实看过那个教程,但我正在尝试不创建一个全新的类,就像他们在教程中做的那样。有什么建议吗?正如ue4文档所说,您不应该使用此功能。返回的ptr是不可变的(您不能真正更改希望以这种方式更改的对象的值)。您必须创建自己的类来覆盖默认设置afaikUCameraShake const*const ShakeCDO=GetDefault(ShakeClass)在摄影机修改器类中以这种方式使用shake类这可能会给您一些提示