资产系统侧线第一波:ResolveProcedural 提为公共静态(键格式唯一定义点);Inspector 程序化模型入口;修 Prefab hover 误导性 not loaded;Content Browser 模型拖拽 → Outliner 创建实体
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#include "Engine/Physics/PhysicsWorld.h" // Apply Impulse 调试(GetPhysics 门面)
|
||||
#include "Engine/Scripting/Script.h" // 脚本下拉(ScriptRegistry::Names)
|
||||
#include "Engine/Scripting/ScriptRuntime.h" // 参数编辑 → RefreshParams
|
||||
#include "Engine/Serialization/SceneSerializer.h" // ResolveProcedural(程序化入口)
|
||||
#include "Engine/Core/Log.h" // Create Override 失败告警
|
||||
|
||||
#include <imgui.h>
|
||||
@@ -670,6 +671,67 @@ void InspectorPanel::Draw(const EditorContext& ctx, entt::entity selected)
|
||||
mr->materialOverrides.clear();
|
||||
}
|
||||
ImGui::Spacing();
|
||||
// 程序化模型入口:伪资产不在磁盘(下拉框列不到),由
|
||||
// 弹窗组键生成 → ResolveProcedural(与场景反解同一
|
||||
// 键格式唯一定义点;确定性键必然命中缓存)
|
||||
if (ImGui::SmallButton("Procedural..."))
|
||||
{
|
||||
ImGui::OpenPopup("##proc_model");
|
||||
}
|
||||
if (ImGui::BeginPopup("##proc_model"))
|
||||
{
|
||||
static int shape = 0; // 0=cube 1=plane 2=transparent plane
|
||||
static float half = 0.5f;
|
||||
static float col[3] = {0.55f, 0.36f, 0.28f};
|
||||
static float alpha = 0.5f;
|
||||
ImGui::RadioButton("Cube", &shape, 0);
|
||||
ImGui::SameLine();
|
||||
ImGui::RadioButton("Plane", &shape, 1);
|
||||
ImGui::SameLine();
|
||||
ImGui::RadioButton("Trans.Plane", &shape, 2);
|
||||
ImGui::SetNextItemWidth(-1.0f);
|
||||
ImGui::SliderFloat("half size", &half, 0.01f, 10.0f,
|
||||
"%.2f");
|
||||
ImGui::ColorEdit3("color", col);
|
||||
if (shape == 2)
|
||||
{
|
||||
ImGui::SetNextItemWidth(-1.0f);
|
||||
ImGui::SliderFloat("alpha", &alpha, 0.0f, 1.0f,
|
||||
"%.2f");
|
||||
}
|
||||
if (ImGui::Button("Create & Assign"))
|
||||
{
|
||||
const int r = int(col[0] * 255.0f + 0.5f);
|
||||
const int g = int(col[1] * 255.0f + 0.5f);
|
||||
const int b = int(col[2] * 255.0f + 0.5f);
|
||||
char key[96];
|
||||
if (shape == 2)
|
||||
{
|
||||
const int a = int(alpha * 255.0f + 0.5f);
|
||||
std::snprintf(
|
||||
key, sizeof(key),
|
||||
"procedural://transparent-plane/%.3g/%d,%d,%d,%d",
|
||||
half, r, g, b, a);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::snprintf(
|
||||
key, sizeof(key),
|
||||
"procedural://%s/%.3g/%d,%d,%d",
|
||||
shape == 0 ? "cube" : "plane", half, r, g, b);
|
||||
}
|
||||
if (auto ref = Engine::Serialization::
|
||||
SceneSerializer::ResolveProcedural(
|
||||
*ctx.assets, key);
|
||||
ref.Valid())
|
||||
{
|
||||
mr->model = ref;
|
||||
mr->materialOverrides.clear();
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
}
|
||||
// 无效句柄不进 GetModel(缓存对无效/悬空句柄 FATAL,是 bug 信号)
|
||||
if (mr->model.Valid())
|
||||
@@ -1951,6 +2013,10 @@ void InspectorPanel::Draw(const EditorContext& ctx, entt::entity selected)
|
||||
// CrossFade 与 Direct 的 crossfade 共用 fade)
|
||||
ImGui::SliderFloat("Speed", &anim->speed, -2.0f, 2.0f);
|
||||
ImGui::SliderFloat("Fade", &anim->fadeDuration, 0.0f, 1.0f);
|
||||
// 根运动(Unity Animator 同名开关):关 = 原地播放,
|
||||
// 位移归脚本/物理驱动(CharacterController 角色用)
|
||||
ImGui::Checkbox("Apply Root Motion",
|
||||
&anim->applyRootMotion);
|
||||
// 动画数据表:每个 clip 的时长与有效轨道数(attach 进来的
|
||||
// 外部动画在此核对骨骼匹配结果——轨道数明显偏少 = 骨骼
|
||||
// 命名不同源被跳过)
|
||||
|
||||
Reference in New Issue
Block a user