公司上个仿真项目使用了cryengine3来制作,所以有机会接触和分析世界顶尖的引擎。作为一个通用引擎,那么必须具备很好的扩展性,让用户能够自定义开发,其中脚本是不可缺少的一个模块,与unreal engine 3的专用脚本不同,ce3使用了lua脚本,因wow而出名。由于lua是一个独立的脚本语言,所以可以集成任何引擎,而分析ce3可以学习顶尖引擎是如何设计和集成脚本的。
      首先谈下自己对脚本模块的看法,脚本的好处是即时修改,不用重新编译并运行exe程序,基于这个好处,可以把可能会经常修改调整的逻辑用脚本来实现,而引擎只负责基本不变的逻辑。但变与不变具有相对性,对专用引擎来说,因为需要定制很多功能,所以经常 变的主要是这些功能的配置等逻辑,而对通用引擎来说,理论上用户可以自定义开发各种各样的游戏,所以整个游戏逻辑都属于会变的,应该可以由脚本来实现,当然完全独立出来是不现实的,因为有些逻辑跟引擎结合很紧或脚本实现效率太低。
      现在回到ce3,ce3确实尽量把很多游戏逻辑独立出来,比较深入用过ce3的编辑器sandbox的人应该有所体会,sandbox里面有很多entity对象,这些对象都有脚本文件,实际上这些对象都是由自己的脚本文件创建出来的,用户可以通过创建脚本来创建自己的entity和entity的游戏逻辑,下面分析下ce3里面entity的lua脚本集成做法,只记录下实现思想,不涉及具体代码。
1、用lua表现一个entity对象
     在c++中要表现一个对象最常用的就是类(类包含数据和函数),lua中没有类,但使用的技术可以变相实现相同的效果,lua通过table、 meta table、__index、__newindex来实现c++类中的基类和派生类,ce3中entity对象都是以table来定义的,对象的属性和函数都是table中的数据。
2、引擎和脚本的交互
     一个lua对象定义好后,那么需要和引擎就需要进行交互,如:创建一个实例、修改实例属性、调用实例的函数等。
     ce3在引擎脚本模块初始化时会扫描entity的资源,把每个entity对象(table)加载到lua中,然后c++内保存的lua中的引用,这个entity对象或者说table对象是被实例所共享。

当加载关卡或sandbox编辑时一个entity对象可能会产生多个实例,每个实例的属性可以不同,游戏过程中可以调用实例的函数或事件进行交互。这一过程中引擎内部的实际操作是这样的:实例创建的实际操作是创建了两个lua内的table,一个是实例,一个是属性,然后将上面提到的共享的对象中的属性表(以字符串"properties"命名)复制到实例的属性,这些值对于编辑时新加的实例是默认值,关卡加载时这些值则会被编辑时编辑后的值覆盖,最后属性(表)会放到实例(表)中,然后共享的对象表作为实例的__index,这样实例就"继承了"entity的函数。

当引擎调用entity的函数时,将实例(一个lua table)作为第一个参数传给实例的函数,这样函数内访问的值就是实例的值而不是共享对象的值。

由于引擎对脚本的定义是一无所知的,所以所有属性和函数都是用字符串作为关键字来访问的,也预设了一些关键字,如上面提到的属性表名为"properties"还有一些函数名,函数调用参数个数在引擎内部也是预先定义好多个参数的模板。除了一些预设的函数,比如实例的初始化,引擎一般不会调用实例的函数(也不知道entity有那些函数),这些函数通常由用户定义的逻辑来调用,如flowgraph、ai、trackview等。

笔记比较凌乱,主要用于记录自己理解一些思想,要实现完整的脚本模块还有非常多的细节需要考虑和完善。

cryengine3中lua脚本模块集成笔记相关推荐

  1. Redis 中 Lua 脚本的应用和实践

    引言 前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重.后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还 ...

  2. SOMv3.3.3二次开发中LUA脚本对机基础操作指南

    前言 先感谢亲爱的学长,没有他们,我一个人根本无法完成这篇博客 顿首,顿首,再顿首!!! 本篇博客属于实验记录,由于LUA脚本较为简单,所以本博客不多做深入探讨,基本上是把官方的用法更为详细地记录一下 ...

  3. lua table insert_超详细的sysbench oltp-数据库性能测试中lua脚本解剖

    概述 在sysbench0.4的后期版本中sysbench已经取消了test中的oltp模式,换而代之的是oltp的lua脚本.这一改变大大的提升了sysbench的灵活性.用户可以结合业务来定制lu ...

  4. hiredis中lua脚本调用

    想要直接用hiredis调用lua脚本,研究了好久发现hiredis源码好像不支持调用eval,因为hiredis中是用空格来分割各个参数的,但是lua的return和结果之间一定会有空格. 改了一下 ...

  5. 深入理解redis中的lua脚本

    本文来说下redis中的lua脚本 文章目录 概述 Lua简介 使用Lua脚本的好处 Redis+Lua实现限流 本文小结 概述 今天讲一些redis和lua脚本的相关的东西,lua这个脚本是一个好东 ...

  6. 第二十三篇:在SOUI中使用LUA脚本开发界面

    像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑. ...

  7. redis中的事务、lua脚本和管道的使用场景

    https://blog.csdn.net/fangjian1204/article/details/50585080 事务 redis中的事务并不像mysql中那么完美,只是简单的保证了原子性.re ...

  8. Redis学习笔记 - Lua脚本(2) - Lua脚本的实现

    参考:<<Redis设计与实现>> 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异 Redis中Lua脚本相关命令介绍以及简单使用,参考博客:https://b ...

  9. 添加lua_非关系型数据库Redis之Lua脚本

    [本文详细介绍了非关系型数据库Redis中Lua脚本的基本概念和使用方法,欢迎读者朋友们阅读.转发和收藏!] 1 Lua 简介 Lua 是一个小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用 ...

最新文章

  1. php的环境怎么配置文件,php环境下所有的配置文件以及作用
  2. python每日一类(3):os和sys
  3. c将字符串拆分,并存入结构体
  4. C++ leetCode 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个
  5. SpringMVC整合MongoDB
  6. canal mysql5.6_超详细的Canal入门,看这篇就够了!
  7. linux-文件管理-不完整版
  8. ab flash player 8_八年级上册英语同步练测考和AB卷听力链接(福建版)
  9. 过来人经验告诉你,如何从小菜B晋升为月薪过万的软件测试工程师?
  10. verilog语法实例学习(3)
  11. 2月26 ubuntu系统备份还原到相同电脑、另一台电脑
  12. citrix服务器共享文件夹,如何使用citrix XenApp 发布远程共享文件夹,及其故障解决...
  13. rsync下同步inotify实时同步
  14. 上月和本月对比叫什么_环比增长率怎么算月度(本周比上周是同比还是环比)...
  15. 【2020/05/29 开庭】韦东山:闲鱼与盗版更配,坚决打击盗版,起诉到底绝不和解!
  16. linux里hba状态_Linux下查看FC HBA信息
  17. latex beamer 空一行_Beamer——基于LaTex的Slides制作
  18. cacti监控java_cacti监控windows服务器
  19. CentOS 6.9下安装PostgreSQL
  20. php获取证书编号没有serialNumberHex只有serialNumber处理方法

热门文章

  1. 内网ip映射到外网(路由器是tp-link)
  2. 《重构》经典句子摘录,程序员读过后一定有收获
  3. caj转换word转换器怎么操作?
  4. 傅里叶变换短时傅里叶变换小波变换
  5. 令人惊叹的、不起眼的硅片
  6. Fedora下的应用软件大集合
  7. 自动关机及取消代码,bat文件代码
  8. Java+freemarker 导出Word文档的实现(包括word for Mac 插入域的方法)-静态数据,动态表格list
  9. Android自动化测试框架uiautomator2详解
  10. Android开发之全局异常捕获