vampire-like/Assets/GameFramework/Scripts/Runtime/Entity/Entity.cs

281 lines
8.7 KiB
C#

//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework;
using GameFramework.Entity;
using System;
using UnityEngine;
namespace UnityGameFramework.Runtime
{
/// <summary>
/// 实体。
/// </summary>
public sealed class Entity : MonoBehaviour, IEntity
{
private int m_Id;
private string m_EntityAssetName;
private IEntityGroup m_EntityGroup;
private EntityLogic m_EntityLogic;
/// <summary>
/// 获取实体编号。
/// </summary>
public int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取实体资源名称。
/// </summary>
public string EntityAssetName
{
get
{
return m_EntityAssetName;
}
}
/// <summary>
/// 获取实体实例。
/// </summary>
public object Handle
{
get
{
return gameObject;
}
}
/// <summary>
/// 获取实体所属的实体组。
/// </summary>
public IEntityGroup EntityGroup
{
get
{
return m_EntityGroup;
}
}
/// <summary>
/// 获取实体逻辑。
/// </summary>
public EntityLogic Logic
{
get
{
return m_EntityLogic;
}
}
/// <summary>
/// 实体初始化。
/// </summary>
/// <param name="entityId">实体编号。</param>
/// <param name="entityAssetName">实体资源名称。</param>
/// <param name="entityGroup">实体所属的实体组。</param>
/// <param name="isNewInstance">是否是新实例。</param>
/// <param name="userData">用户自定义数据。</param>
public void OnInit(int entityId, string entityAssetName, IEntityGroup entityGroup, bool isNewInstance, object userData)
{
m_Id = entityId;
m_EntityAssetName = entityAssetName;
if (isNewInstance)
{
m_EntityGroup = entityGroup;
}
else if (m_EntityGroup != entityGroup)
{
Log.Error("Entity group is inconsistent for non-new-instance entity.");
return;
}
ShowEntityInfo showEntityInfo = (ShowEntityInfo)userData;
Type entityLogicType = showEntityInfo.EntityLogicType;
if (entityLogicType == null)
{
Log.Error("Entity logic type is invalid.");
return;
}
if (m_EntityLogic != null)
{
if (m_EntityLogic.GetType() == entityLogicType)
{
m_EntityLogic.enabled = true;
return;
}
Destroy(m_EntityLogic);
m_EntityLogic = null;
}
m_EntityLogic = gameObject.AddComponent(entityLogicType) as EntityLogic;
if (m_EntityLogic == null)
{
Log.Error("Entity '{0}' can not add entity logic.", entityAssetName);
return;
}
try
{
m_EntityLogic.OnInit(showEntityInfo.UserData);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnInit with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
}
/// <summary>
/// 实体回收。
/// </summary>
public void OnRecycle()
{
try
{
m_EntityLogic.OnRecycle();
m_EntityLogic.enabled = false;
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnRecycle with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
m_Id = 0;
}
/// <summary>
/// 实体显示。
/// </summary>
/// <param name="userData">用户自定义数据。</param>
public void OnShow(object userData)
{
ShowEntityInfo showEntityInfo = (ShowEntityInfo)userData;
try
{
m_EntityLogic.OnShow(showEntityInfo.UserData);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnShow with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
}
/// <summary>
/// 实体隐藏。
/// </summary>
/// <param name="isShutdown">是否是关闭实体管理器时触发。</param>
/// <param name="userData">用户自定义数据。</param>
public void OnHide(bool isShutdown, object userData)
{
try
{
m_EntityLogic.OnHide(isShutdown, userData);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnHide with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
}
/// <summary>
/// 实体附加子实体。
/// </summary>
/// <param name="childEntity">附加的子实体。</param>
/// <param name="userData">用户自定义数据。</param>
public void OnAttached(IEntity childEntity, object userData)
{
AttachEntityInfo attachEntityInfo = (AttachEntityInfo)userData;
try
{
m_EntityLogic.OnAttached(((Entity)childEntity).Logic, attachEntityInfo.ParentTransform, attachEntityInfo.UserData);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnAttached with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
}
/// <summary>
/// 实体解除子实体。
/// </summary>
/// <param name="childEntity">解除的子实体。</param>
/// <param name="userData">用户自定义数据。</param>
public void OnDetached(IEntity childEntity, object userData)
{
try
{
m_EntityLogic.OnDetached(((Entity)childEntity).Logic, userData);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnDetached with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
}
/// <summary>
/// 实体附加子实体。
/// </summary>
/// <param name="parentEntity">被附加的父实体。</param>
/// <param name="userData">用户自定义数据。</param>
public void OnAttachTo(IEntity parentEntity, object userData)
{
AttachEntityInfo attachEntityInfo = (AttachEntityInfo)userData;
try
{
m_EntityLogic.OnAttachTo(((Entity)parentEntity).Logic, attachEntityInfo.ParentTransform, attachEntityInfo.UserData);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnAttachTo with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
ReferencePool.Release(attachEntityInfo);
}
/// <summary>
/// 实体解除子实体。
/// </summary>
/// <param name="parentEntity">被解除的父实体。</param>
/// <param name="userData">用户自定义数据。</param>
public void OnDetachFrom(IEntity parentEntity, object userData)
{
try
{
m_EntityLogic.OnDetachFrom(((Entity)parentEntity).Logic, userData);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnDetachFrom with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
}
/// <summary>
/// 实体轮询。
/// </summary>
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
public void OnUpdate(float elapseSeconds, float realElapseSeconds)
{
try
{
m_EntityLogic.OnUpdate(elapseSeconds, realElapseSeconds);
}
catch (Exception exception)
{
Log.Error("Entity '[{0}]{1}' OnUpdate with exception '{2}'.", m_Id, m_EntityAssetName, exception);
}
}
}
}