package system import ( "fmt" "github.com/yohamta/donburi/component" "github.com/yohamta/donburi/filter" "joylink.club/ecs" "joylink.club/rtsssimulation/umi" ) // EntityIdentity 实体身份定义 type EntityIdentity struct { Id string } // EntityIdentityComponent 实体身份组件 var EntityIdentityComponent = ecs.NewComponentType[EntityIdentity]() func FindEntityById(world ecs.World, id string) *ecs.Entry { query := ecs.NewQuery(filter.Contains(EntityIdentityComponent)) return QueryEntityById(world, query, id) } func QueryEntityById(world ecs.World, q *ecs.Query, id string) *ecs.Entry { var entry *ecs.Entry = nil func() { defer simpleRecover() q.Each(world, func(e *ecs.Entry) { if id == EntityIdentityComponent.Get(e).Id { entry = e panic(fmt.Sprintf("找到实体[%s],结束查找", id)) } }) }() // return entry } var modelStorageQuery = ecs.NewQuery(filter.Contains(ModelStorageComponent)) // FindModelStorage 获取模型仓库 func FindModelStorage(world ecs.World) umi.IModelManager { e, _ := modelStorageQuery.First(world) return ModelStorageComponent.Get(e).ModelManager } // 捕获panic并恢复执行 func simpleRecover() { recover() } ///////////////////////////////////////////////////////// // 实体标签 type EntityTag = component.IComponentType type EntityTagHandler struct { Tag EntityTag } ///////////////////////////////////////////////////////// // 模型仓库引用 // 用于world内使用,查询模型 type ModelStorageRef struct { ModelManager umi.IModelManager } // 模型仓库组件 var ModelStorageComponent = ecs.NewComponentType[ModelStorageRef]()