USkeletalMeshComponent
cpp
void AMyActor::read_q(USkeletalMeshComponent* CurrentMesh)
{
// Create a JSON object
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
// Set fields for the JSON object
JsonObject->SetNumberField(TEXT("start"), 0.0f);
JsonObject->SetNumberField(TEXT("end"), 5.0f);
// Serialize JSON object to string
FString JsonStr_w;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&JsonStr_w);
if (FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer))
{
JsonQueue.Enqueue(JsonStr_w);
UE_LOG(LogTemp, Log, TEXT("Simulated message added to queue: %s"), *JsonStr_w);
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Failed to serialize JSON"));
}
if (!CurrentMesh || JsonQueue.IsEmpty())
{
bIsPlayingSegment = false;
return;
}
FString JsonStr;
JsonQueue.Dequeue(JsonStr);
//TSharedPtr<FJsonObject> JsonObject;
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonStr);
if (!FJsonSerializer::Deserialize(Reader, JsonObject) || !JsonObject.IsValid())
{
UE_LOG(LogTemp, Warning, TEXT("Invalid JSON message, skipping"));
return;
}
float Start = JsonObject->GetNumberField(TEXT("start"));
float End = JsonObject->GetNumberField(TEXT("end"));
if (End <= Start)
{
UE_LOG(LogTemp, Warning, TEXT("Invalid start/end times"));
return;
}
UE_LOG(LogTemp, Warning, TEXT("Start: %f, End: %f"), Start, End);
bIsPlayingSegment = true;
/*CurrentMesh->GlobalAnimRateScale = 0.6f;
CurrentMesh->SetAnimationMode(EAnimationMode::AnimationSingleNode);
CurrentMesh->PlayAnimation(TalkSeq, true);
CurrentMesh->SetPosition(Start, false);*/
float PlayLength = End - Start;
if (CurrentMesh)
{
// 获取当前的 AnimInstance
UAnimInstance* AnimInstance = CurrentMesh->GetAnimInstance();
if (AnimInstance)
{
/*FName CurrentState = AnimInstance->GetCurrentStateName();
UE_LOG(LogTemp, Warning, TEXT("Current Animation State: %s"), *CurrentState.ToString());
*/
// 获取曲线值(例如 Ctrl_L_Mouth_Corner_Pull)
float MouthCornerPull = AnimInstance->GetCurveValue(FName("Jaw Open Alpha"));
float Mouth_Corner = AnimInstance->GetCurveValue(FName("Ctrl_L_Mouth_Corner_Pull"));
// 打印值到屏幕
if (GEngine)
{
FString DebugMessage = FString::Printf(TEXT("Mouth Corner Pull: %f %f"), MouthCornerPull, Mouth_Corner);
GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Green, DebugMessage);
}
// 或者打印到日志
UE_LOG(LogTemp, Warning, TEXT("Mouth Corner Pull: %f %f"), MouthCornerPull, Mouth_Corner);
}
}
bIsPlayingSegment = false;
}