Unity Game FrameWork—组件扩展—Entity组件扩展

Entity功能扩展

前面写过一篇3DUI的扩展,与3DUI的扩展类似,都是为了使游戏对象脱离框架,作为场景中GameObject的子物体。
下面直接上代码,功能也很简单,场景中的物体组件调用ChangeGroupPos改变实体组的父物体。当场景切换,场景中的物体被销毁时,调用ReGroupPos将实体组再还给框架。

using GameFramework;
using GameFramework.Entity;
using GameFramework.ObjectPool;
using GameFramework.Resource;
using System;
using System.Collections.Generic;
using UnityEngine;


namespace UnityGameFramework.Runtime
{
    /// <summary>
    /// 实体组件。
    /// </summary>
    [DisallowMultipleComponent]
    [AddComponentMenu("Game Framework/EntityFree")]
    public class EntityFreeComponent : EntityComponent
    {
        private Dictionary<string, Transform> CustomEntityGroupHelpers;
        private float Scale = 1f;

        /// <summary>
        /// 游戏框架组件初始化。
        /// </summary>
        protected override void Awake()
        {
            base.Awake();
            CustomEntityGroupHelpers = new Dictionary<string, Transform>();
        }

        /// <summary>
        /// 增加实体组。
        /// </summary>
        /// <param name="entityGroupName">实体组名称。</param>
        /// <param name="instanceAutoReleaseInterval">实体实例对象池自动释放可释放对象的间隔秒数。</param>
        /// <param name="instanceCapacity">实体实例对象池容量。</param>
        /// <param name="instanceExpireTime">实体实例对象池对象过期秒数。</param>
        /// <param name="instancePriority">实体实例对象池的优先级。</param>
        /// <returns>是否增加实体组成功。</returns>
        public override bool AddEntityGroup(string entityGroupName, float instanceAutoReleaseInterval, int instanceCapacity, float instanceExpireTime, int instancePriority)
        {
            if (m_EntityManager.HasEntityGroup(entityGroupName))
            {
                return false;
            }

            EntityGroupHelperBase entityGroupHelper = Helper.CreateHelper(m_EntityGroupHelperTypeName, m_CustomEntityGroupHelper, EntityGroupCount);
            if (entityGroupHelper == null)
            {
                Log.Error("Can not create entity group helper.");
                return false;
            }

            entityGroupHelper.name = Utility.Text.Format("Entity Group - {0}", entityGroupName);
            Transform transform = entityGroupHelper.transform;
            transform.SetParent(m_InstanceRoot);
            transform.localPosition = Vector3.zero;
            transform.localEulerAngles = Vector3.zero;
            transform.localScale = Vector3.one * Scale;
            CustomEntityGroupHelpers.Add(entityGroupName, transform);
            return m_EntityManager.AddEntityGroup(entityGroupName, instanceAutoReleaseInterval, instanceCapacity, instanceExpireTime, instancePriority, entityGroupHelper);
        }
        /// <summary>
        /// 改变界面组坐标
        /// </summary>
        /// <param name="uiGroupName">界面组名称。</param>
        /// <param name="depth">界面组父物体。</param>
        public bool ChangeGroupPos(string EntityGroupName, Transform parents)
        {
            if (!m_EntityManager.HasEntityGroup(EntityGroupName))
            {
                return false;
            }
            Transform transform = CustomEntityGroupHelpers[EntityGroupName];
            if (transform == null)
            {
                Log.Error("Can not find entity group helper.");
                return false;
            }
            transform.SetParent(parents);
            transform.localPosition = Vector3.zero;
            transform.localEulerAngles = Vector3.zero;
            transform.localScale = Vector3.one * Scale;
            return true;
        }
        /// <summary>
        /// 恢复界面组层级
        /// </summary>
        /// <param name="uiGroupName">界面组名称。</param>
        /// <param name="depth">界面组父物体。</param>
        public bool ReGroupPos(string EntityGroupName)
        {
            if (!m_EntityManager.HasEntityGroup(EntityGroupName))
            {
                return false;
            }
            Transform transform = CustomEntityGroupHelpers[EntityGroupName];
            if (transform == null)
            {
                Log.Error("Can not find entity group helper.");
                return false;
            }
            transform.SetParent(m_InstanceRoot);
            transform.localPosition = Vector3.zero;
            transform.localEulerAngles = Vector3.zero;
            transform.localScale = Vector3.one;
            return true;
        }
    }
}

代码完成后,替换掉原来的Entity组件,代码里的注册逻辑对应也改成EntityFree。
GameEntry.Builtin

        /// <summary>
        /// 获取实体组件。
        /// </summary>
        public static EntityFreeComponent EntityFree
        {
            get;
            private set;
        }

在这里插入图片描述

GameFramework是一个面向Unity开发的游戏开发框架,它提供了一系列的工具和组件来简化游戏开发的过程。其中之一就是entity(实体)。 在GameFramework中,实体是游戏中的可操作物体,可以是角色、道具、敌人等等。实体具有一定的生命周期,并且可以添加和删除各种组件来修改其行为和外观。 使用entity可以实现游戏对象的逻辑和视觉分离,将游戏对象的各种功能和特性以组件的形式分开管理,更加灵活和可扩展。同时,entity还可以方便地实现对象的创建、销毁、重用等操作,提高游戏的性能和效率。 在GameFramework中,实体是通过实体组件Entity Component)来定义和管理的。每个实体可以包含多个组件,例如渲染组件、物理组件、输入组件等等。这些组件通过实体驱动来更新和绘制,形成一个完整的游戏对象。 GameFramework提供了丰富的功能来操作实体,例如实体的创建和销毁、获取和设置组件、发送消息等等。通过这些功能,我们可以很方便地实现各种游戏对象的创建和控制,提高开发的效率和质量。 总而言之,GameFramework中的entity是用于管理游戏对象的一种机制,它通过实体和组件的方式来定义和操作游戏对象,提供了一种更加灵活和可扩展的游戏开发方式。通过使用entity,我们可以更加方便地开发出高性能、高质量的游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值