2025-05-18 01:04:31 +08:00

386 lines
7.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created : 2018-2-29
// Description : 游戏逻辑实体管理器对游戏中所有Entity提供创建移除和管理
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "EntityManager" company=""></copyright>
// <summary></summary>
// ***********************************************************************
namespace G
{
using System.Collections.Generic;
using F;
using F.Entity;
using F.ObjectPool;
using UnityEngine;
public partial class EntityManager : MonoBehaviour
{
public const string ASSET_POOL_NAME = "entities";
/// <summary>
/// 框架层提供管理
/// </summary>
private IEntityManager _entityManager;
/// <summary>
///
/// </summary>
private IEntityGroup<Entity> _defaultGroup;
/// <summary>
///
/// </summary>
private IEntityGroup<EntityEnemy> _bossGroup;
/// <summary>
///
/// </summary>
private IEntityGroup<EntityEnemy> _minionGroup;
/// <summary>
///
/// </summary>
private IEntityGroup<EntityProp> _propGroup;
private Transform defaultRoot
{
get => this.transform;
}
/// <summary>
///
/// </summary>
public List<GameObject> propPrefabs = new List<GameObject>(4);
/// <summary>
///
/// </summary>
public List<GameObject> cartPrefabs = new List<GameObject>(1);
/// <summary>
///
/// </summary>
public List<GameObject> dropPrefabs = new List<GameObject>(1);
#region Method
private static int _LocalGuid = 100000;
public static int GetLocalGuid()
{
return _LocalGuid++;
}
public void Initialize(System.Action completed)
{
_entityManager = KFramework.EntityManager;
_defaultGroup = this.AddEntityGroup<Entity>();
_bossGroup = this.AddEntityGroup<EntityEnemy>("b");
_minionGroup = this.AddEntityGroup<EntityEnemy>("m");
_propGroup = this.AddEntityGroup<EntityProp>();
completed?.Invoke();
}
private void OnInitialized()
{
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
private IEntityGroup<T> AddEntityGroup<T>(string sub = "") where T : Entity
{
var fullName = Utils.Text.GetFullName<T>(sub);
if (_entityManager.HasGroup(fullName))
return _entityManager.GetGroup<T>(fullName);
else
return _entityManager.AddGroup<T>(fullName);
}
/// <summary>
///
/// </summary>
/// <param name="entity"></param>
public void RemoveEntity(Entity entity)
{
if (entity != null)
{
_entityManager.RemoveEntity(entity.id);
entity.Dispose();
}
}
/// <summary>
///
/// </summary>
public void RemoveAllEntity()
{
//if (_mainPlayer != null)
// _mainPlayer.Dispose();
//
foreach (var entity in _defaultGroup.GetAllEntities())
{
entity.Dispose();
}
_defaultGroup.RemoveAll();
//
foreach (var entity in _bossGroup.GetAllEntities())
{
entity.Dispose();
}
_bossGroup.RemoveAll();
//
foreach (var entity in _minionGroup.GetAllEntities())
{
entity.Dispose();
}
_minionGroup.RemoveAll();
foreach (var entity in _propGroup.GetAllEntities())
{
entity.Dispose();
}
_propGroup.RemoveAll();
}
/// <summary>
///
/// </summary>
public void RemoveAllProp()
{
foreach (var entity in _propGroup.GetAllEntities())
{
entity.Dispose();
}
_propGroup.RemoveAll();
}
/// <summary>
///
/// </summary>
public void RemoveAllEnemy()
{
foreach (var entity in _bossGroup.GetAllEntities())
{
entity.Dispose();
}
_bossGroup.RemoveAll();
foreach (var entity in _minionGroup.GetAllEntities())
{
entity.Dispose();
}
_minionGroup.RemoveAll();
}
#endregion
#region
/// <summary>
/// 进入场景
/// </summary>
public void OnEnterScene()
{
AssetProxy.Instance.CreateReleasePool(ASSET_POOL_NAME);
this.CreateMainPlayer();
//EntityMainPlayer.Instance.OnEnterScene();
}
/// <summary>
/// 离开场景
/// </summary>
public void OnExitScene()
{
_entityManager.Clear();
AssetProxy.Instance.RemoveReleasePool(ASSET_POOL_NAME);
}
#endregion
#region
/// <summary>
/// 创建主角
/// </summary>
public void CreateMainPlayer()
{
}
/// <summary>
/// 创建Boss
/// </summary>
public void CreateBoss(EntityInfo info)
{
if (_bossGroup != null)
{
info.guid = GetLocalGuid();
var boss = new GameObject(info.name).AddComponent<EntityBoss>();
boss.transform.parent = defaultRoot;
boss.Init(info);
_bossGroup.AddEntity(boss);
}
}
/// <summary>
/// 创建小兵
/// </summary>
/// <param name="info"></param>
public void CreateMinion(EntityInfo info)
{
if (_minionGroup != null)
{
info.guid = GetLocalGuid();
var monster = new GameObject(info.name).AddComponent<EntityMinion>();
monster.transform.parent = defaultRoot;
monster.Init(info);
_minionGroup.AddEntity(monster);
}
}
/// <summary>
/// 创建掉落包
/// </summary>
public void CreateDropItem(EntityInfo info)
{
if (_defaultGroup != null && dropPrefabs.Count > 0)
{
info.guid = GetLocalGuid();
var dropGO = SpawnPool.Spawn(dropPrefabs[0]);
dropGO.transform.parent = defaultRoot;
var drop = dropGO.GetComponent<EntityDrop>();
drop.Init(info);
_defaultGroup.AddEntity(drop);
}
}
/// <summary>
/// 道具
/// </summary>
/// <param name="info"></param>
public void CreateProp(EntityInfo info)
{
if (_propGroup != null && info.itemId <= propPrefabs.Count)
{
var prefab = propPrefabs[info.itemId - 1];
if (prefab)
{
info.guid = GetLocalGuid();
var propGO = Object.Instantiate(prefab);
propGO.transform.parent = defaultRoot;
var prop = propGO.GetComponent<EntityProp>();
prop.Init(info);
_propGroup.AddEntity(prop);
}
}
}
/// <summary>
///
/// </summary>
/// <param name="info"></param>
public void CreateCart(EntityInfo info)
{
if (_defaultGroup != null && cartPrefabs.Count > 0)
{
info.guid = GetLocalGuid();
var cart = Object.Instantiate(cartPrefabs[0], defaultRoot).GetComponent<EntityCart>();
cart.Init(info);
//_defaultGroup.AddEntity(cart);
}
}
#endregion
#region
public Entity FindEntity(int id)
{
return _entityManager.GetEntity(id) as Entity;
}
public IReadOnlyCollection<EntityEnemy> FindAllBossInScene()
{
return _bossGroup.GetAllEntities();
}
public IReadOnlyCollection<EntityEnemy> FindAllMinionInScene()
{
return _minionGroup.GetAllEntities();
}
public IReadOnlyCollection<EntityProp> FindAllPropInScene()
{
return _propGroup.GetAllEntities();
}
#endregion
#region
public Entity GetParent(int id)
{
return _entityManager.GetEntityParent(id) as Entity;
}
public void SetParent(int id, int parentId)
{
_entityManager.SetParentEntity(id, parentId);
}
readonly List<IEntity> _childEntities = new List<IEntity>(8);
public bool GetChildren(int id, List<Entity> result)
{
if (result != null && _entityManager.GetEntityChildren(id, _childEntities))
{
foreach (var item in _childEntities)
{
result.Add(item as Entity);
}
return true;
}
return false;
}
#endregion
#region Unity
public static EntityManager Instance => _Instance;
private static EntityManager _Instance;
private void Awake()
{
if (_Instance)
{
Destroy(_Instance.gameObject);
}
_Instance = this;
this.Initialize(this.OnInitialized);
OnEnterScene();
}
private void OnDestroy()
{
OnExitScene();
}
#endregion
}
}