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;

}
相关推荐
silvamux_8 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
蒸蒸yyyyzwd9 小时前
kafka、redis、mysql不熟悉问题总结
笔记·八股
hgy89699 小时前
深度学习(小白笔记)——迁徙
人工智能·笔记·深度学习
摇滚侠9 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
辣知10 小时前
辣知·化智93 被历史尘封的鬻子
学习
每天题库11 小时前
西藏安全员 A 证备考真题题库 强化重点知识刷题提升通过率
学习·安全·考试·题库·考证
Be for thing12 小时前
PyTorch基础|Tensor张量详解,张量创建、数据类型与常用操作
pytorch·学习·1024程序员节
前进的李工12 小时前
Agent 学习笔记 02:Harness 与工作流怎么理解
笔记·学习·agent·工作流·harness
m4Rk_13 小时前
【论文阅读】Agent记忆机制(114):MemoryTax——当 Agent 能自主搜索历史,专门的记忆系统还划算吗?
论文阅读·人工智能·学习·开源·github
海鸥-w14 小时前
数据库冗余字段设计笔记
java·数据库·笔记·oracle