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;

}
相关推荐
嵌入式小企鹅1 小时前
CPU供需趋紧、DeepSeek V4全链适配、小米开源万亿模型
人工智能·学习·开源·嵌入式·小米·算力·昇腾
三品吉他手会点灯6 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
kobesdu6 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
sakiko_6 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
生信碱移7 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业7 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
星幻元宇VR9 小时前
VR航空航天科普设备【VR时空直升机】
科技·学习·安全·生活·vr
_李小白9 小时前
【android opencv学习笔记】Day 2: Mat类(图片数据结构体)
android·opencv·学习
智者知已应修善业9 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
JasmineX-110 小时前
数据结构(笔记)——双向链表
c语言·数据结构·笔记·链表