如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...
前置说明:这是2016年在开发 CreateX Engine 2 时写的文章,这个专栏也开了两年,一直空着,最近有时间慢慢填写内容,两年多过去了,对于引擎的理念也有了一些变化,可能会不一致,甚至是颠覆的改变,以后再逐渐修正,慢慢修改吧。
为了复用引擎对象系统的组件管理、空间结构管理、序列化等机制,也为了更高的性能(在C++中组件更新、层次结构更新,而非在脚本中),脚本类对象需要创建为CxObject体系的对象,所以每个脚本类对象本质上是脚本化的 CxObject 的实例化对象,也就是 lua userdata 类型,而非 lua table。当脚本类实例化时,实际上是创建了 CxObject 或者其派生类的对象,并且 Attach 一个 Script Component。
脚本类基类ScriptObject 中默认创建的是 CxObject,此类具有组件化功能,但没有空间结构管理功能。如需空间结构管理功能,需要创建具有层次化结构管理功能的CxTransformComponent 或其派生类对象。
给脚本对象增加组件:有两种类型组件,1.纯C++类组件,2.脚本类组件,这两种组件都是通过 CreateObject 函数创建,区别在于第一种不需要脚本化(AttachScript)。
对象的生命周期管理:
1. 脚本类对象虽然是脚本化的 C++ Object,但依然处于 lua 的内存管理之下,借用 lua GC 机制,当没有任何引用时会自动回收脚本类对象,这样就实现了游戏对象的自动垃圾回收功能,无需手动管理对象生命周期。
2. 组件对象则不同,由于组件已经在 CxObject 内部管理并负责其生命周期,所以不能使用 lua 来管理。
创建脚本类时可以指定C++ 父类,如果不指定则默认是 CxObject 类,根据C++父类创建对应的C++ Object。
脚本类实例化:有两种脚本类实例化情况,一种是做为对象实例化,一种是做为其他对象的组件实例化。差别在于生命周期的管理机制不同。
Ø 对象实例化:对象的生命周期由 lua 负责,直接调用C++类的构造函数并脚本化(AttachScript)即可。
Ø 组件实例化:组件的生命周期由其所在的对象负责,通过 CreateObject 创建 C++ 对象并脚本化。
可视化脚本类编辑器会自动生成对象实例化函数 New 以及组件实例化函数NewAsComponent,在这两个函数内部根据上述情况创建对象并返回。
优势:
1. 任意脚本类都可以做为组件加入到对象中(包括自身类),同时也能将C++类做为组件。
2. 利用引擎自身的对象系统实现组件机制、空间管理、序列化,提高了功能复用性
3. 脚本类对象本质上是C++对象,并在C++内部完成上述功能,完全可以保证运行时性能。
4. 统一的方式访问对象成员,无论是C++类成员还是脚本类成员,都以相同方式访问,无需使用者增加额外的间接处理。
5. 自动的垃圾回收,借助Lua管理对象生命周期,无需手动释放游戏对象。
劣势:
由于实例化时需要创建Script Component实现访问脚本类成员,所以每个实例化对象内部至少有一个组件对象,也就是说每个实例化的脚本对象对应2个引擎对象(ScriptComponent 也是从 CxObject继承),这样会导致对象过多。但如果以组合方式实现对象功能的角度考虑,脚本组件是游戏对象必须的组成部分,实际上任何基于组件组合方式实现游戏对象功能的引擎都无法避免这个问题。
如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...相关推荐
- java实现一个电梯模拟器_基于Java的捎带电梯系统
一.思路 写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路: 电梯有最高层和最低层,输入数字选择正确楼层数 输入数字大于当前楼层,则为上行:小于当前楼层,则为下行 每次输入数字的时候,需要 ...
- unity在脚本中获取游戏对象有三种_Unity3D中用于删除当前脚本所在游戏对象的代码是:_学小易找答案...
[单选题]297 . 乙醇的颜色为 [单选题]219 . 下列物质中含有极性共价键的是 [单选题]OnWillCreatAsset( string path) 上面命令的作用是: [填空题]针对单个或 ...
- 基于linux的贪吃蛇游戏设计_基于ECS的游戏引擎架构设计「译」
摘要 游戏编程设计和组织是困难而复杂的,为了简化开发进程,会使用被称为游戏引擎的游戏框架(framework),该框架包含了一组实用工具.本项的目的是探索游戏引擎设计和开发一个模块化和可扩展的游戏引擎 ...
- 【Unity3D入门教程】使用C#脚本控制游戏对象
前言 使用C#脚本控制游戏对象,是一项必备的基本技能.Unity3D可以使用的脚本有C#和javascript等.我们主要讲注意力集中在C#上.本文将会介绍怎样使用脚本控制场景中的游戏对象. 1 创建 ...
- react学习笔记(4)组件的生命周期(运行阶段和销毁阶段)以及事件处理函数
1.组件的生命周期 接着(2)中的组件生命周期 1.运行阶段 运行阶段有5个步骤: componentWillReceiveProps: 父组件修改属性触发,可以修改新属性,修改状态. shouldC ...
- 基于c#实现游戏装备系统(基础篇)
基于c#实现游戏装备系统(基础篇) 摘要 作为游戏中的重要组成部分,装备是重中之重,那么装备系统的代码应该怎么实现呢? 基础 我们先定义一个类,作为我们所定义的人物: class People {pu ...
- unity获取游戏对象及修改游戏对象的属性,对于游戏对象的基本操作
一:unity获取游戏对象 1直接获取 2通过路径获取 3创建函数体 4根目录开始获取.先上后先获取 1.GameObject.Find只能发现激活的对象 2.transform.Find可以发现未激 ...
- ncverilog脚本_基于脚本和test bench的ncverilog ASIC仿真实例分析
基于脚本和 test bench 的 ncverilog ASIC 仿真实例分析 本文以一个虚拟的 xlab 项目为例,基于 linux OS 平台,详细分析了通过 testbench 和仿 真模型等 ...
- java创建医生的对象_基于安卓Android的作物医生App设计开发(MySQL)(含录像)
基于安卓Android的作物医生App设计开发(MySQL)(含录像)(毕业论文14000字,PHP程序代码,MySQL数据库) 本系统使用软件工程方法进行一系列的分析.设计.实现与测试.使用面向对象 ...
最新文章
- 每年颁发两个图灵奖?
- 所有你要知道的 BERT 模型压缩方法,都在这里!
- 【跃迁之路】【658天】程序员高效学习方法论探索系列(实验阶段415-2018.12.02)...
- 904. 水果成篮(滑动窗口)模板题
- MySql中的运算符
- Android Studio 运行模拟器时提示 “/dev/kvm device: permission denied”
- DNN 汉化中的问题????
- ArcEngine开发体验(附许可)
- 【j360-boot】Spring-boot系列三(崩溃模式,不是你崩就是电脑崩)
- CTL_CODE说明
- PHP关键字可以作变量名吗,在PHP中定义了很多关键字,这些关键字不能当做变量名。...
- 运行 sudo 时会发生什么?
- 关于jquery你不得不知的小知识
- struts2 action 返回类型分析
- 关于C#中的get与set函数
- Android Studio 修改 Java 语言版本到 1.8
- react 命名规范 书写顺序
- java图片改变分辨率并保存
- 中国大地保险的大数据应用架构演进之路
- 信息技术与计算科学(二)信息的度量
热门文章
- flink报错;IllegalArgumentException: requirement failed The class xx$3 is an instance class, mean
- Flink 上传的Jar包去哪里了
- 【hue】 There are currently no roles defined
- GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
- Using Apache Solr‘s boost query function with Spring in Java
- 快速排序的两种实现方法(js)
- C语言中结构体内存存储方式
- [转载]oracle函数listagg的使用说明
- 开源joda-time使用demo
- VMware 11安装Mac OS X 10.10