阶段性合并:动画重定向、碎裂共享库、第三人称玩法、编辑器面板与 vendored ufbx
- 动画:HumanoidRig 三层架构(standard 标准槽 / dialects 方言映射 / mapper 配对), 指/趾统一走世界增量两遍式烘焙;AnimationAttach 拆为纯算法 + facade;修正 HumanoidBasis 行走基朝向与跨骨架去重、根运动通道 - 物理:CharacterController 角色互碰撞 / shapeOffset / 接触事件;PhysicsWorld 接触合成与 字符冲量判定 - 渲染与材质:Model 多材质按材质拆子 mesh 与贴图路径解析、DDS 直传、GLB 内嵌纹理落盘、 不透明通道 alpha 固定 1.0、glTF FlipUVs 对齐;SceneSerializer 支持 meshIndex 与材质覆盖 - 脚本:FractureLib 抽为共享库(HostView 桥接)、WallFracture 参数直绑、新增 ThirdPersonCamera / Follower / WASDMove 玩法;移除 GameDirector / PlayerController / Target - 编辑器:新增 GamepadPanel、LogPanel(LogRing),改进 Inspector / 材质 / 统计 / 视口面板 - 依赖:vendored ufbx(FBX 5.x/6.x/7.x 全版本解析,替代 assimp 对 FBX 6.1 的拒读)
This commit is contained in:
+20
-35
@@ -1,16 +1,11 @@
|
||||
//
|
||||
// TestShoot.cpp:射击脚本(发射源 = 绑定实体位姿,挂谁从谁发)。
|
||||
//
|
||||
// 正确用法:挂到场景 primary 相机实体(CameraComponent.primary=true)
|
||||
// 上——PIE/游戏形态渲染源就是它(SceneRenderer::BuildFrame 分派),
|
||||
// 实体朝向即准星,实体位置 + MuzzleOffset 即枪口。配 PlayerController
|
||||
// (FPS 转向/移动/鼠标捕捉)即完整第一人称射击。
|
||||
// TestShoot.cpp:阶段1 验收脚本——脚本侧 spawn/destroy 底座 + 碰撞事件
|
||||
// 转发的端到端链路。
|
||||
//
|
||||
// 三个脚本协作(放一个文件方便对照):
|
||||
// TestShoot(挂相机实体):
|
||||
// 光标捕捉态下鼠标左键上升沿 → 从绑定实体沿视线 spawn 子弹实体
|
||||
// (Dynamic 球刚体 + Bullet 脚本项,枪口初速经参数传入);
|
||||
// 未捕捉(编辑器交互中)不射——防点 UI 误发
|
||||
// TestShoot(挂任意实体,如相机实体):
|
||||
// 鼠标左键上升沿 → 从编辑器相机沿视线 spawn 子弹实体
|
||||
// (Dynamic 球刚体 + Bullet 脚本项,枪口初速经参数传入)
|
||||
// Bullet(子弹实体,由 TestShoot 运行时装配):
|
||||
// OnCreate 施加枪口初速(body 已由当帧 Step 对账建好);
|
||||
// OnCollisionEnter → 命中点 spawn ImpactFx + 自毁;
|
||||
@@ -18,11 +13,6 @@
|
||||
// ImpactFx(特效实体,由 Bullet 运行时装配,空实体 + 调试点标):
|
||||
// 扩张十字 + 白→红渐隐,寿命尽自毁——占位特效
|
||||
//
|
||||
// 历史注:早期版本从编辑器相机(EditorCamera)发射——那是视口 UI
|
||||
// 状态,不是场景实体,PIE 渲染根本不用它(渲染源 = primary 相机
|
||||
// 实体),子弹会从视口外飞出。已改为绑定实体位姿(Unity 组件语义:
|
||||
// 挂谁从谁发)。
|
||||
//
|
||||
// 覆盖的引擎设施:
|
||||
// - Spawn()/Destroy():ScriptBehavior 实体底座(Scene::CreateEntity/
|
||||
// DestroyEntity 延迟队列)
|
||||
@@ -31,9 +21,8 @@
|
||||
// - OnCollisionEnter/Exit:PhysicsWorld::GetEvents → ScriptRuntime
|
||||
// 帧首派发
|
||||
//
|
||||
// 验收步骤:primary 相机实体挂 PlayerController + 本脚本 → Play →
|
||||
// 鼠标转视角 → 左键射击:弹道点飞出 → 撞击瞬间原地绽放十字特效、
|
||||
// 子弹消失。
|
||||
// 验收步骤:编辑器给任意实体挂 TestShoot → Play → RMB 飞行视角瞄准
|
||||
// 墙体 → 左键射击:弹道点飞出 → 撞墙瞬间原地绽放十字特效、子弹消失。
|
||||
//
|
||||
|
||||
#include <Engine/Scripting/Script.h>
|
||||
@@ -41,6 +30,8 @@
|
||||
#include <Engine/Core/Input.h>
|
||||
#include <Engine/Physics/PhysicsWorld.h>
|
||||
#include <Engine/Debug/DebugDraw.h>
|
||||
#include <Engine/Renderer/Renderer.h>
|
||||
#include <Engine/Renderer/EditorCamera.h>
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
@@ -148,7 +139,7 @@ namespace {
|
||||
f32 m_Age = 0.0f;
|
||||
};
|
||||
|
||||
// ---- 枪口脚本(挂谁从谁发:位姿取绑定实体,正挂 primary 相机)----
|
||||
// ---- 枪口脚本(验收主体:挂到任意实体,位置/朝向取编辑器相机)----
|
||||
class TestShoot final : public Engine::Scripting::ScriptBehavior {
|
||||
public:
|
||||
const char* Name() const override { return "TestShoot"; }
|
||||
@@ -167,18 +158,10 @@ namespace {
|
||||
void OnUpdate(f32 dt) override {
|
||||
m_Cooldown -= dt;
|
||||
|
||||
const bool down =
|
||||
Input::IsMouseButtonDown(Input::MouseButton::Left);
|
||||
|
||||
// 捕捉态门控:光标未捕捉 = 用户在跟编辑器 UI 交互,不射
|
||||
// (m_FireWasDown 照常对账,重捕按下的那一下不误发)
|
||||
if (!Input::IsCursorCaptured()) {
|
||||
m_FireWasDown = down;
|
||||
return;
|
||||
}
|
||||
|
||||
// 左键上升沿触发(电平查询 + 上帧状态对比,Unity
|
||||
// GetMouseButtonDown 边沿语义的手工等价物)
|
||||
const bool down =
|
||||
Input::IsMouseButtonDown(Input::MouseButton::Left);
|
||||
const bool fire = down && !m_FireWasDown &&
|
||||
m_Cooldown <= 0.0f;
|
||||
m_FireWasDown = down;
|
||||
@@ -190,18 +173,20 @@ namespace {
|
||||
|
||||
private:
|
||||
void SpawnBullet() {
|
||||
// 枪口 = 绑定实体视线前方(挂 primary 相机实体 = 第一人称
|
||||
// 射击;PIE 渲染源就是这台相机,所见即所射)
|
||||
const glm::quat rot = Transform().GetWorldRotationQuat();
|
||||
const glm::vec3 fwd = rot * glm::vec3(0.0f, 0.0f, -1.0f);
|
||||
// 枪口 = 编辑器相机视线前方(编辑形态 RMB 飞行瞄准;
|
||||
// 与 WASDMove 的朝向来源一致)
|
||||
const auto& cam =
|
||||
App().GetRenderer().GetEditorCamera().GetTransform();
|
||||
const glm::vec3 fwd =
|
||||
cam.GetRotationQuat() * glm::vec3(0.0f, 0.0f, -1.0f);
|
||||
const glm::vec3 muzzle =
|
||||
Transform().GetWorldPosition() + fwd * m_MuzzleOffset;
|
||||
cam.GetWorldPosition() + fwd * m_MuzzleOffset;
|
||||
|
||||
// ---- 子弹实体装配(spawn 底座 + 组件运行时装配演示)----
|
||||
auto bullet = Spawn("bullet");
|
||||
auto& tr = bullet.GetComponent<Engine::ECS::TransformComponent>();
|
||||
tr.SetPosition(muzzle);
|
||||
tr.SetRotationQuat(rot);
|
||||
tr.SetRotationQuat(cam.GetRotationQuat());
|
||||
|
||||
// Dynamic 球刚体:参数给默认档(轻质量/低弹性,命中即停)
|
||||
auto& rb = bullet.AddComponent<Engine::ECS::RigidBodyComponent>();
|
||||
|
||||
Reference in New Issue
Block a user