Hazel游戏引擎(077)介绍EnTT
文中若有代码、术语等错误,欢迎指正
文章目录
- 前言
- Entt融入到项目中
- 基本使用
前言
-
此节目的
使用测试Entt库提供ECS模式的API
-
Entt库
-
为什么使用它
-
自己写个ECS麻烦
-
Entt优秀
-
-
地址
点这
-
Entt融入到项目中
-
打开Entt地址
-
点开single_include

-
拷贝entt.hpp到项目中(注意路径)

-
在premake.lua文件里包含entt.hpp
IncludeDir["entt"] = "GameEngineLightWeight/vendor/entt/include" ...... includedirs{ ...... "%{IncludeDir.stb_image}", "%{IncludeDir.entt}" }
基本使用
#pragma once#include "entt.hpp"
namespace Hazel {class Scene{public:Scene();~Scene();private:entt::registry m_Registry;};
}#include "hzpch.h"
#include "Scene.h"
#include "glm/glm.hpp"
namespace Hazel {static void DoMath(const glm::mat4& transform) {}static void OnTransformConstruct(entt::registry& registry, entt::entity entity) {}Scene::Scene(){struct TransformComponent { // 不用继承Componentglm::mat4 Transform;TransformComponent() = default;TransformComponent(const TransformComponent&) = default;TransformComponent(const glm::mat4& transform): Transform(transform){}operator const glm::mat4& () { return Transform; }};struct MeshComponent {glm::mat4 Transform;MeshComponent() = default;MeshComponent(const MeshComponent&) = default;MeshComponent(const glm::mat4& transform): Transform(transform) {}operator const glm::mat4& () { return Transform; }};TransformComponent transform;// 测试DoMath(transform.Transform);DoMath(transform); // 因为有类型转换函数// 若没有类型转换函数DoMath(*(glm::mat4*)&transform);// 1.创建一个实体,返回整数 identt::entity entity = m_Registry.create(); // 是uint32_t// 2.实体放入TransformComponent组件.arg1:id,arg2:glm会转换为TransformComponentm_Registry.emplace<TransformComponent>(entity, glm::mat4(1.0f));// 3.判断实体是否有哦TransformComponent组件//if (m_Registry.has(entity)) // 代码报错不知道为什么 // 4.获取实体的TransformComponent组件,根据idTransformComponent& transform = m_Registry.get<TransformComponent>(entity);// 5.m_Registry已注册的所有TransformComponent组件auto view = m_Registry.view<TransformComponent>();for (auto entity : view) {TransformComponent& transform1 = m_Registry.get<TransformComponent>(entity); // view、m_Registry两个都行TransformComponent& transform2 = view.get<TransformComponent>(entity);}// 6.m_Registry获取既有Transform组件又有Mesh组件的实体auto group = m_Registry.group<TransformComponent>(entt::get<MeshComponent>);for (auto entity : group) {auto&[transform, mesh] = group.get<TransformComponent, MeshComponent>(entity);//Renderer::Submit(mesh, transform);}// 7.设置当实体添加TransformComponent组件时执行OnTransformConstruct方法m_Registry.on_construct<TransformComponent>().connect<&OnTransformConstruct>();}Scene::~Scene(){}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
