首页>单机游戏
城市天际线 MOD基础开发教程
时间:2016-09-28 作者:Fledgling

  《城市:天际线》中MOD模型是游戏的热点之一,MOD模型如何开发调试?,今天小编为大家带来《城市:天际线》MOD进阶教程,希望对大家有帮助,一起来看吧。

城市天际线 MOD基础开发教程

  一直想写这篇文章,但是总觉得写出来也没几个人人能看得懂,太过于小众,就算看得懂,又能有几个人耐得住性子去调代码呢,所以就拖啊拖啊到现在。但是,中国人做的mod实在是太少了(当然整个工坊也就200来个=.=),咬咬牙还是写吧,希望能多看到点国人做的mod,我也有个能交流的朋友是不。

  本文主要阐述天际线AI类MOD开发的基础,包括天际线概念框架体系、基本API、进阶开发以及注意事项,希望能抛砖引玉,给有编程基础的朋友一个入门的方向。更多的造化就看您的努力了。本文将以公交增容MOD的源码为例进行讲解。

  需要阅读者必须具备基本的面向对象基础,可使用vsstudio进行开发及调试。另外由于本人主要从事java开发工作,c#纯属自学,所以有关概念表述的不一定十分准确,各位看客要自行甄别

  如何搭建开发环境我在这里就不再废话了(我只提一句,是library类工程),如果你不知道怎么搭建开发环境,基本也看不懂我这篇文章。对了,按照官方的说法,你只要把c#代码写好,扔到mod文件夹下面就好了,他们会编译这些代码。但是我没有成功,我是在vs里面直接build成dll后扔到mod里的,效果一样。

  一、首先是天际线的基本概念体系,以及AI在其中所起的作用。

  游戏里有很多的建筑物、人、车等事物。这些东西都有自己的属性,比如位置在哪?颜色?是生老病死,还是3级5级?移动速度?等等,描述的是物体的客观状态。还有一类,就是这些事物的行为方式:例如小人是去买东西,还是去上班?出门是坐公交还是自己开车?公交车下一站往哪开?建筑物是升级还是废弃?这些基本都是由各个物件自己决定的,那么这个决策部分,就称之为AI,用面向对象来说,就是行为/方法(method)

  比如市民,市民是一个类,名字、男女、年龄、教育程度、健康状况、是否在开车等等,是属性。但是市民有几十万,每一个市民都有自己不同的属性,有几十万的对象,在内存里都要占用相应的位置,但是他们的AI是一致的,AI只有一个。修改了这个AI,所有市民的行为方式都会相应变化。

  然后是天际线中跟AI相关的有如下常见类名后缀:

  AI、Manager、Info(当然还有很多与UI相关的,我就不再列举了,跟本文关系不大)

  AI毫无疑问就是AI类的了,CitizenAI就是市民AI(这里我简单化了,后面我会详细讲到,这个CitizenAI其实不是“居民AI”)

  Manager是所有相关对象引用的管理类,比如CitizenManager就是管理所有市民的管理器,无论是创建一个市民,还是查询所有生病的市民,都要通过这个管理器

  Info是一类对象的“模板”。这里我用建筑物来解释。比如警察总局,就是一个BuildingInfo类的对象。里面定义了这个物件的名称叫“警察总局”,所有警察总局的属性,比如造价、维护费用、占地大小等等,都是在这里的,警察总局的AI,也是在这里有一个引用(AI是另外一个类)。不管你在游戏中建几个“警察总局”,这个BuildingInfo对象都会只有一个,但是不同位置的警察总局,会有多个不同的Building对象(其实是struct)来表达,比如具体的xz位置(y在天际线里是高度轴),或者你给他改名叫“天下第一警察总局”,那么名字也是存在这里的。

  接着,是跟AI相关的横向概念。

  天际线里AI总共分4类:建筑物(Building)、车辆(Vehicle)、市民(Citizen)、路网(Net)。

  每类都会有一个上述英文名称的struct来表达数据,以及配套的前述3个类(AI、Manager、Info),和众多的相关衍生类。

  在天际线中,CitizenAI其实应该翻译成是“生物AI”好点。它有2个子类:动物AI和人类AI。也就是说,你在游戏中看到的鸟啊,宠物狗啊什么的,其实都是算作是Citizen,都用Citizen这个struct来存储数据的,占用那104万上限。动物AI就不说了。人类AI中又分为服务人员AI(就是消防队那个灭火的小人、灵车抬尸体的小人等)、旅游者AI和居民AI。这里最多的就是居民了,104万的上限,我看有人达到了101万。

  那么,这所有的104万的Citizen,全部都是由CitizenManager来管理的。CitizenManager中有创建市民的方法,销毁的方法,查询的方法等。当前市民数量、Citizen集合的引用等信息,都是这个类的变量,市民的总数上限啊、市民出行开车的概率啊、生孩子的概率啊、成为gay的概率啊等等常量,也都在这里。这个CitizenManager是单例的,你不能显式的去创建这个对象,调用单例的方法后面的代码里有。

  另外还要提一句,市民上限是100万多点,但是不代表所有的市民都会被显卡“画出来”,只有被实例化(Instance)的市民,才会交给frame,去具体的在界面上画出来。Instance的上限,我记得是65000+,所以大家不用担心人多了显卡“画”不动

  [page]

  二、基本API解读

  官方给出了一个基本的API文档。但是。真的是太基本了,基本什么也做不了。但是给的这些API又确实非常基础,无论你做什么MOD,这几个API还确实是很常用的。所以还是要大体上说一下的。

  1、IUserMod

  最简单,最常用的interface,没有之一。就是定义MOD的名称和描述。基本没其他作用。

  要注意的是namespace的定义。有些同学说我的mod怎么冲突了,其实就是这个namespace重名了。所以,不同的mod必须要起不同的namespace,即使类名不同也不行。所以推荐跟你的mod名称对应。

  其他应该很简单吧。我觉得好像没什么要解释的。unit_number这个问题我后面再说。

  2、LoadingExtensionBase

  这个抽象类是在游戏存档加载时生效的(包括新建游戏)。

  4个方法,create、release是单例创建和销毁时触发的,这个貌似很少用

  比较常用的是load和unload方法,就是存档加载和退出时的方法。

  3、ThreadingExtensionBase

  这个类其实也还算是常用的,就是在游戏画面(frame)每次刷新时,触发的地方。只是在公交增容这个mod里我没用到。需要注意的是,这个类中的update()方法,触发的频率非常高,不要试图在这个方法里做很复杂的事情,基本判断个bool值,或者是算个简单地数字就好了,指望这里进行复杂的对象操作,或者是打印日志什么的,只有一个下场,就是游戏永远处于加载状态,cpu飙升。

  一般如果你要做界面什么的,才会用到这个类。

  到这里基本结束。剩下的几个官方接口,我觉得都是很好理解的,没什么要特别说的了,而且公交增容这个mod也没用到。我觉得一般大家看看也就能理解了。

  所以呢,大家会感觉到,啊?这就是官方接口?怎么没见你写什么代码来让公交增容啊?恩,就是这样的,所以我才说,官方给的API,基本什么也做不了。

  三、进阶篇

  然后就是我们的hack时间了。这部分没有任何官方说明,出现的bug也只能靠我们自己解决,出现任何奇怪的事情都是正常的。然后我们继续。

  要替换官方的BusAI,最简单的方法我相信大家已经猜到了,就是继承官方的AI,然后仅仅修改我们需要修改的部分就好了。那么,我也是这么干的。

  好了,这里就是我们增容的核心代码了。那么现在有一个bug,就是公交会闪。在这里我表示我非常的冤枉,跟我真的没啥关系。我没动frame..我只是替换了个数组。

  所以,这个替换是非常生硬的,直接的后果就是会导致存档发生变化。即使关闭了mod,也无法改变已经客观存在的链表结构。所以我说嘛。官方偷懒。不好好的调用那个容积属性进行判断。非要搞数组,还是链表结构的。真是无语。

  四:其他要交代的

  打印调试语句:

  DebugOutputPanel.AddMessage(MessageType.Message,"outputsomething");

  进入游戏后按F7,即可调出控制台

  替换官方AI会导致跟其他mod冲突的概率大大加大,换句话说,如果其他mod也试图跟你替换同一个AI,那么一定最后只会有一个成功。所以,后来我基本不再写替换官方AI的MOD了。做的那个出乎我自己意料的、大家很喜欢的、停车收费降居民需求的MOD,其实就是我替换自己建筑物的AI,从理论上讲,基本不会跟别人冲突掉。

  另外,这个游戏是使用的UnityEngine引擎。其中大量的模拟了物理方面的规则。所以,在改代码的时候,时刻要牢记一定要符合物理规则。比如,把车辆速度调快,确实车速会增加的,但是,拐弯的时候也会翻车的,很真实,符合物理规则。

上一篇:古剑奇谭2 战斗中四选项说明
下一篇:古剑奇谭2 五行材料对应任务一览
相关文章
相关游戏