ue 获取动画参数数据

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;

}
相关推荐
憧憬成为java架构高手的小白7 小时前
docker学习笔记(基于b站多个视频学习)【未完结】
笔记·学习
辰海Coding8 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
RainCity8 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
闫记康8 小时前
Linux学习day5
linux·chrome·学习
一楼的猫9 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作
東隅已逝,桑榆非晚9 小时前
字符函数和字符串函数
c语言·笔记
他们叫我阿冠9 小时前
实习前自我培训-Day1学习
学习
Upsy-Daisy10 小时前
AI Agent 项目学习笔记(七):RAG 高级扩展——过滤检索、PgVector 与云知识库
人工智能·笔记·学习
柿柿快乐10 小时前
Redis 入门第一课:全局命令、内部编码与单线程模型
redis·学习·缓存·基础教学
智者知已应修善业11 小时前
【51单片机LED闪烁10次数码管显示0-9】2023-12-14
c++·经验分享·笔记·算法·51单片机