城市天际线mod怎么用装 MOD使用方法详解

城市天际线mod大全
《城市天际线》是一个非常专业的城市经营模拟类游戏,玩家需要运用你的智慧来从各个方面建造并打理你的城市,另外城市天际线游戏还有许多实用性的mod来提高游戏的可玩性以及创新性,小编在这里整理了许多城市天际线的实用还有充满创意的mod做成城市天际线mod大全给大家分享。
城市天际线mod大全推荐
城市天际线无锡地图mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到一张无锡的地图,制作也非常的精美,喜欢的玩家可以下载来试试吧。
城市天际线湖南长沙地图mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到湖南长沙的一张高还原地图,根据实际地理制作,做工精细,喜欢的玩家可以下载来自己打造长沙市。
城市天际线超级公园mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你的公园娱乐变为7/5,范围更加扩大了,变成7/5,公园变得更加热闹。
城市天际线道路换色MOD是一款专门为喜欢折腾游戏《城市天际线》的朋友准备的,能够改变游戏里的城市道路颜色的mod补丁。
城市天际线信标大厦mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到一个非常有个性的建筑信标大厦,高耸入云,绝对是城市的一大亮点。
城市天际线堡垒公交Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到得到一个懒人的立交交通,跟堡垒一样,大大缓解了路阻的情况。
城市天际线熊猫公园mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod是论坛大神分享的,让你得到一座别致的熊猫公园,公园中间是着名的功夫熊猫阿宝,喜欢的可以下载来放到你的城市里面。
城市天际线画面帧数mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你在游戏中看到实时的fps画面帧数,这样就能即使知道自己的电脑吃得消吃不消啦。
城市天际线gtm办公室Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到一个gtm办公室,这样上班的地方就多了,提高就业率。
城市天际线去除红绿灯mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,红绿灯有时候会影响你城市的交通,造成大范围的堵车,这个去除红绿灯的mod就会让你的交通顿时变得顺畅无比。
城市天际线中国汽车mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到多辆符合中国特色的车辆比如公交车和私家车,让你的游戏更加的中国化。
城市天际线东京铁塔Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到日本的东京铁塔,虽然有点小,但是丝毫不影响美观。
城市天际线玛雅金字塔mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到着名的玛雅金字塔,非常的雄伟,这么一座金字塔放在你城市一定很显眼。
城市天际线世博会中国馆Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这mod完美的还原了上海世博会中国国家馆,国家馆放在你的城市里绝对很气派。
城市天际线石狮Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,石狮是中国建筑的特色,这个Mod让你得到这个精致的石狮子。
城市天际线诊所mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让游戏中的诊所容量大了一倍,可以同时容纳200人候诊,另外救护车也增加到了15辆,有效缓解了看病的压力。
城市天际线昼夜更替Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你可以让你的游戏场景做到昼夜更替,从而更加的真实,但是夜晚的灯光效果不是很理想。
城市天际线操场小学MOD是一款游戏《城市天际线》的mod补丁,玩家可以通过该mod在游戏中建造带操场的小学,喜欢这款的游戏的玩家可以下载尝试一下!
城市天际线千针石林Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,魔兽世界的老玩家肯定会知道千针石林,这个地图还原了魔兽世界大灾变后的千针石林,非常的壮观。
城市天际线市民追踪mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个Mod可以让你定点追踪某个市民,方便寻找,让你了解市民的生活目的。
城市天际线天鹅堡mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到一个漂亮的城堡,叫天鹅堡,犹如童话故事里的城堡一样,非常的好看。
城市天际线武汉地图MOD是一款由玩家自制的地图mod补丁,主要适用于游戏《城市:天际线》,该地图完全按照武汉地理特征而制作,最明显的莫过于长江标识了!
城市天际线韩国釜山地图mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个是韩国的大城市釜山,临海,非常的漂亮,喜欢的就下载过来亲手打造吧。
城市天际线巴黎圣母院mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod别致的还原了巴黎圣母院,将圣母院放到的游戏中还是很不错的。
城市天际线周黑鸭Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,周黑鸭是着名的卤味鸭脖,吃货们肯定是知道的,这个建筑在的城市里肯定是增添了一道靓丽的风景线。
城市天际线棒球公园mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个Mod让你获得一个大型的棒球公园,非常的好看,这样丰富的城市居民的娱乐活动。
城市天际线不堵车Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,城市堵车是玩家一个头疼的问题,这个Mod就能减少城市里的私家车,所有市民都可以快速到达目的地,非常的实用mod。
城市天际线大连mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到辽宁大连的地图,山清水秀,值得你去打造。
城市天际线滨海小镇Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个地图是一个临近海冰的城市,周围还有几个小岛等你开发,风景优美,希望你能喜欢。
城市天际线执法站mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到一个执法站,城市太大了,有些小地方警力覆盖不到所以用这个小建筑就可以搞定,非常的有用。
城市天际线北京天坛mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到得到故宫的天坛,非常的好看,配合北京的地图mod可以让你打造个性北京城。
城市天际线福建土楼mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到得到福建的土楼,非常的好看,非常适合放到乡下的场所,不然显得在高楼大厦之间显得格格不入。
城市天际线大雁塔mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你的得到西安的着名建筑大雁塔,非常的真实让你的城市更加的多彩。
城市天际线火箭Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你一个火箭发射器,非常的霸气,为你的城市增添光彩。
城市天际线河流平原mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个地图是一个多河流的平原地图,风景秀丽,非常适合建造城市。
城市天际线超大墓地mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,城市里墓地数量很少,如果赶上老龄化的话,墓地更是供不应求,这个mod将墓地的半径设了有、尸体最大设了10000,死在多人墓地也不会爆满了啊。
城市天际线教堂mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到一栋天使报喜教堂,非常的高端,喜欢的就把它放在你的城市之中吧。
城市天际线如家酒店mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod可以让你得到一家经济实惠的酒店,叫如家酒店,建模非常的细致。
城市天际线太原mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod可以山西太原的高仿地形地图,喜欢的就下载来试试建造吧。
城市天际线去除雾mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod可以去除城市里的雾气,给你一个没有雾霾城市。
城市天际线超级大学mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让城市里的大学资金耗费只有1/10,处理容量10倍,效率6/5,服务范围5倍,很牛逼。
城市天际线盆地mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到一个盆地地形,中间穿插河流,风景很秀丽。
城市天际线伊瓜苏瀑布地图MOD是一款同名下的游戏mod工具。城市天际线是一款模拟类游戏,玩家可以通过mod来得到伊瓜苏瀑布地图,让你轻松玩游戏。
城市天际线消防局Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod可以让城市的消防局的范围扩大,同时增加消防车数量以及效率,这样就大大降低了你城市的消防隐患。
城市天际线初号机Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,相信很多玩家都知道EVA里的初号机,这个Mod就是高仿还原了初号机模型,这么一个模型摆在你的城市里还是很霸气的。
城市天际线帝国大厦mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让你得到纽约的帝国大厦建筑,非常的气派。
城市天际线超大火葬场mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让火葬场的容量增大,这样死多少人都不用排队火葬了。
城市天际线超大垃圾场Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个mod让垃圾场的容量增大,很是给力,这样你就不用担心城市太大垃圾太多了。
城市天际线广岛地图Mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个地图取材于日本的广岛地图,有兴趣的可以试着建造自己的广岛地图。
城市天际线超级风力发电机mod是一款同名下的游戏mod工具。城市天际线是一款模拟经营类游戏,这个超级发电可以让资金消耗只需要十分之一,生产能力3倍,生产容量3倍,污染只有1/5,是城市中必备发电厂。
城市天际线世界贸易中心MOD是同名游戏的一款mod工具,它能够为玩家提供一个超拉风的世界贸易中心大楼,喜欢的玩家可以下载挑战下。
热门专题推荐
Copyright (C)
.All rights reserved.当前位置:&&>&&>&&&&城市天际线MOD怎么用
《城市天际线》游戏的MOD相信会是这款游戏后续发力点,同时更多的MOD也将让这款游戏充满了非常大的体验潜力,以下分享全地图区域数量解锁及怎么用。使用说明:1.解压缩2.复制文件夹到游戏MOD目录3.开始游戏游戏MOD目录参考:游侠版:C:\Users\&User Name&\AppData\Local\Colossal Order\Cities_Skylines\Addons\ModsMOD说明:解除区域数量限制使用本MOD后可以将区域数量上限从9提升到25,当然随之对内存的要求也提高了,内存低于8G的玩家请谨慎使用!免费解锁全部区域使用本MOD后就是免费解锁,买的时候不用花钱。下载地址: & & &
与天际线,游戏,区域,解锁,这款,城市天际线相关的文章
一周排行榜查看: 2987|回复: 5
【转载】《都市:天际线》MOD开发教程
本帖最后由 zhousiyuan 于
09:52 编辑
想着以前SC4时的繁荣 现在越来越死气沉沉了
一直想写这篇文章,但是总觉得写出来也没几个人人能看得懂,太过于小众,就算看得懂,又能有几个人耐得住性子去调代码呢,所以就拖啊拖啊到现在。但是,中国人做的mod实在是太少了(当然整个工坊也就200来个=.=),咬咬牙还是写吧,希望能多看到点国人做的mod,我也有个能交流的朋友是不。
本文主要阐述天际线AI类MOD开发的基础,包括天际线概念框架体系、基本API、进阶开发以及注意事项,希望能抛砖引玉,给有编程基础的朋友一个入门的方向。更多的造化就看您的努力了。本文将以公交增容MOD的源码为例进行讲解。
需要阅读者必须具备基本的面向对象基础,可使用vs studio进行开发及调试。另外由于本人主要从事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),和众多的相关衍生类。
当然这也只是一个最基本的分类,最深的继承关系可达7层,由于此图是在是太大,所以我在下图仅以市民AI举例说明:
在天际线中,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+,所以大家不用担心人多了显卡“画”不动
二、基本API解读
官方给出了一个基本的API文档。但是。。真的是太基本了,基本什么也做不了。但是给的这些API又确实非常基础,无论你做什么MOD,这几个API还确实是很常用的。所以还是要大体上说一下的。
1、IUserMod
最简单,最常用的interface,没有之一。就是定义MOD的名称和描述。基本没其他作用。
namespace SuperBigTransport
& & public class Mod : IUserMod
& && &&&public const int unit_number = 16;
& && &&&public string Name
& && && && &get
& && && && &{
& && && && && & return &【SB】超级客运&+ unit_number * 5 + &人版 | SuperBigTransport &+ unit_number * 5;
& && && && &}
& && &&&public string Description
& && && && &get
& && && && &{
& && && && && & return&&&公交车容量改为&+ unit_number * 5 + &,火车改为& + unit_number * 5 * 8+ &,地铁改为& + unit_number * 5 * 6;
& && && && &}
要注意的是namespace的定义。有些同学说我的mod怎么冲突了,其实就是这个namespace重名了。所以,不同的mod必须要起不同的namespace,即使类名不同也不行。所以推荐跟你的mod名称对应。
其他应该很简单吧。。。我觉得好像没什么要解释的。。。unit_number这个问题我后面再说。
2、LoadingExtensionBase
这个抽象类是在游戏存档加载时生效的(包括新建游戏)。
4个方法,create、release是单例创建和销毁时触发的,这个貌似很少用
比较常用的是load和unload方法,就是存档加载和退出时的方法。
using System.Collections.G
using ColossalF
using UObject = UnityEngine.O
namespace SuperBigTransport
& && &&&public class LoadingExtension : LoadingExtensionBase
& && && && && & public override void OnLevelLoaded(LoadMode mode)
& && && && && & {//游戏加载开始。
& && && && && && && && && & ForEachPrefab((VehicleInfo i) =&//在读取所有车辆信息时,对每一个车辆信息进行处理。主意这里不是每一辆车,是每一类车,注意是Info类
& && && && && && && && && & {
& && && && && && && && && && &&&ReplaceVehicleAI&BusAI, BigBusAI&(i); //替换BusAI类为我们自定义的AI类
& && && && && && && && && && &&&ReplaceVehicleAI&PassengerTrainAI, BigPassengerTrainAI&(i);//替换客运火车类AI。游戏里的地铁和客运火车是不同的AI,但是他们都继承自这个PassengerTrainAI,并且也仅有这两个AI继承这个类,所以我直接替换了他们的基类
& && && && && && && && && & });
& && && && && && &&&//游戏加载结束
& && && && && & }
& && && && && & static void ReplaceVehicleAI&TOldAI, TNewAI&(VehicleInfo i)//这个就是替换AI用的方法
& && && && && && && && && & where TOldAI : VehicleAI
& && && && && && && && &&&where TNewAI : VehicleAI, IAIReplacement&TOldAI&, new()
& && && && && & {
& && && && && && && && && & var oldAI = i.gameObject.GetComponent&TOldAI&();
& && && && && && && && && & if (oldAI == null)
& && && && && && && && && && &&&
& && && && && && && && && & i.gameObject.AddComponent&TNewAI&();//必须先把新的AI注册进去,再取出来。。好奇怪的写法,但是不这么写不行
& && && && && && && && && & var newAI = i.gameObject.GetComponent&TNewAI&();
& && && && && && && && && & newAI.CopyFrom(oldAI);//AI也有属性,如果要替换,必须把原有的属性也全部对拷,否则就会出现各种奇怪的情况
& && && && && && && && && & i.m_vehicleAI = newAI;
& && && && && && && && && & UObject.Destroy(oldAI);
& && && && && && && && && & newAI.InitializeAI();
& && && && && & }
& && && && && & static void ForEachPrefab&T&(Action&T& f) where T : PrefabInfo
& && && && && & {
& && && && && && && && &for (var i = 0u; i & PrefabCollection&T&.LoadedCount(); i++)
& && && && && && && && && && &&&f(PrefabCollection&T&.GetLoaded(i));
& && && && && & }
& && &&&interface IAIReplacement&in T&
& && && && && & void CopyFrom(T ai);
3、ThreadingExtensionBase
这个类其实也还算是常用的,就是在游戏画面(frame)每次刷新时,触发的地方。只是在公交增容这个mod里我没用到。需要注意的是,这个类中的update()方法,触发的频率非常高,不要试图在这个方法里做很复杂的事情,基本判断个bool值,或者是算个简单地数字就好了,指望这里进行复杂的对象操作,或者是打印日志什么的,只有一个下场,就是游戏永远处于加载状态,cpu飙升。
一般如果你要做界面什么的,才会用到这个类。
到这里基本结束。剩下的几个官方接口,我觉得都是很好理解的,没什么要特别说的了,而且公交增容这个mod也没用到。我觉得一般大家看看也就能理解了。
所以呢,大家会感觉到,啊?这就是官方接口?怎么没见你写什么代码来让公交增容啊?恩,就是这样的,所以我才说,官方给的API,基本什么也做不了。
三、进阶篇
然后就是我们的hack时间了。这部分没有任何官方说明,出现的bug也只能靠我们自己解决,出现任何奇怪的事情都是正常的。然后我们继续。
要替换官方的BusAI,最简单的方法我相信大家已经猜到了,就是继承官方的AI,然后仅仅修改我们需要修改的部分就好了。那么,我也是这么干的。
using ColossalF
using UnityE
namespace SuperBigTransport
& && &&&class BigBusAI : BusAI, IAIReplacement&BusAI&//继承官方的BusAI
& && && && && & public void CopyFrom(BusAI ai)//我们自己定义的接口,主要用于两个AI的属性对拷
& && && && && & {
& && && && && && && && && & m_passengerCapacity = Mod.unit_number * 5;//这里是公交的容量,但是这个数字仅仅是显示用的,实际上,能上多少人不已这里为准。窃以为,这是官方代码的bug
& && && && && && && && && & m_ticketPrice = ai.m_ticketP//车票多少钱,这个我没改过,不知道是不是只改这里就是增加车票收入,有兴趣的同学可以试试。
& && && && && && && && &m_info = ai.m_//info,就是bus的基本信息,busInfo,前面提到过的,忘了的话自己回去看。但是不管它是什么,拷过来就好了
& && && && && & }
& && &&&public override bool ArriveAtDestination(ushort vehicleID, ref Vehicle vehicleData)//复写官方的车辆到站后的处理逻辑。官方的方法里,车到站以后有很多的判定步骤,要判断该下多少人,能上多少人,是否是终点站,等等一大堆。我没把握能全部写好,而能上多少人这个方法它又是private的(日),所以,只能改这个,并且最后一步还的调用base的方法。
& && && && &var citizenManager = Singleton&CitizenManager&.//OK这里就是调用各种Manager单例的方法,前面欠大家的代码这里补上了。
& && && && &var unitId = vehicleData.m_citizenU//好了,这里涉及到另一件事情,是citizen所特有的概念,citizenUnit,前面的public const int unit_number = 16;就是跟这个相关的。这里呢,每个citizenUnit里面能装5个citizen,一个citizen可以被装在多个citizenUnit里,装的也仅仅是引用。citizenUnit是一个链表结构,citizenUnit有一个属性是nextUnit,就是下一个citizenUnit的引用,如果没有下一个,就是0,说明链表结束。那么这个citizenUnit用在哪里呢?这么说,所有能装人的地方,本质上就是这个citizenUnit有多长的结构。每辆车、每个建筑物,都有一个citizenUnit的引用,指向的是第一个citizenUnit的位置。所以,我们要增容,就是扩展这个citizenUnit。
& && && && &var cu = citizenManager.m_units.m_buffer[unitId];//这行代码说明,citizenUnit也是由CitizenManager来统一管理的
& && && && &int i = 1;
& && && && &while (cu.m_nextUnit&0) {//判一下当前的容量数是多少
& && && && && & i++;
& && && && && & cu = citizenManager.m_units.m_buffer[cu.m_nextUnit];
& && && && &}
& && && && &if (i != Mod.unit_number) {//如果不等于预期,就改
& && && && && & uint firstId;
& && && && && & var random = new ColossalFramework.Math.Randomizer();
& && && && && & citizenManager.CreateUnits(out firstId, ref random, 0, vehicleID, 0, 0, 0, Mod.unit_number * 5, 0);//citizenUnit既然是由CitizenManager来统一管理的,那么创建肯定也是由CitizenManager来统一做的。我们简单的在这里创建了一个符合我们预期长度的citizenUnit
& && && && && & vehicleData.m_citizenUnits = firstId;//然后粗暴的直接替换
& && && && && & //citizenManager.ReleaseUnits(unitId);//这里不能释放,释放了市民就找不到路了。释放了有什么效果请自行观察。
& && && && &}
& && && && &return&&base.ArriveAtDestination(vehicleID, ref vehicleData);
好了,这里就是我们增容的核心代码了。那么现在有一个bug,就是公交会闪。在这里我表示我非常的冤枉,跟我真的没啥关系。。。。我没动frame..我只是替换了个数组。。。。
所以,这个替换是非常生硬的,直接的后果就是会导致存档发生变化。即使关闭了mod,也无法改变已经客观存在的链表结构。所以我说嘛。。官方偷懒。。不好好的调用那个容积属性进行判断。。非要搞数组,还是链表结构的。。。真是无语。
然后,上面只是公交车的,下面是地铁和客运火车的。我直接贴代码了,因为结构差不多,我就不解释了。有一个小bug,会导致一个不合理的现象,但是很隐蔽,不知道大家能发现么?
using ColossalF
using System.Collections.G
namespace SuperBigTransport
& & class BigPassengerTrainAI : PassengerTrainAI, IAIReplacement&PassengerTrainAI&
& && &&&public void CopyFrom(PassengerTrainAI ai)
& && && && &m_passengerCapacity = Mod.unit_number * 5;
& && && && &m_ticketPrice = ai.m_ticketP
& && && && &m_info = ai.m_
& && && && &m_arriveEffect = ai.m_arriveE
& && && && &m_transportInfo = ai.m_transportI
& && &&&CitizenManager citizenManager = Singleton&CitizenManager&.
& && &&&public override bool ArriveAtDestination(ushort vehicleID, ref Vehicle vehicleData)
& && && && &var unitId = vehicleData.m_citizenU
& && && && &var cu = citizenManager.m_units.m_buffer[unitId];
& && && && &int i = 1;
& && && && &while (cu.m_nextUnit & 0)
& && && && &{
& && && && && & i++;
& && && && && & cu = citizenManager.m_units.m_buffer[cu.m_nextUnit];
& && && && &}
& && && && &uint firstId;
& && && && &
& && && && &if (i & Mod.unit_number)
& && && && &{
& && && && && & var random = new ColossalFramework.Math.Randomizer();
& && && && && & if (vehicleData.m_transferType==39)//metro
& && && && && & {
& && && && && && &&&n = (Mod.unit_number-i) * 5*6 + 30;
& && && && && && &&&citizenManager.CreateUnits(out firstId, ref random, 0, vehicleData.GetFirstVehicle(vehicleID), 0, 0, 0, n, 0);
& && && && && & }else
& && && && && & {
& && && && && && &&&n = (Mod.unit_number-i) * 5 *8 + 30;
& && && && && && &&&citizenManager.CreateUnits(out firstId, ref random, 0, vehicleData.GetFirstVehicle(vehicleID), 0, 0, 0, n, 0);
& && && && && & }
& && && && && & vehicleData.m_citizenUnits = firstId;
& && && && && & //citizenManager.ReleaseUnits(unitId);
& && && && &}
& && && && &else if (i & Mod.unit_number)
& && && && &{
& && && && && & var random = new ColossalFramework.Math.Randomizer();
& && && && && & if (vehicleData.m_transferType == 39)//metro
& && && && && & {
& && && && && && &&&firstId = citizenManager.m_units.m_buffer[unitId].m_nextU
& && && && && && &&&citizenManager.ReleaseUnits(unitId);
& && && && && && &&&vehicleData.m_citizenUnits = firstId;
& && && && && && &&&n = (Mod.unit_number - 6) * 5 * 6 + 30;
& && && && && & }
& && && && && & else
& && && && && & {
& && && && && && &&&firstId = citizenManager.m_units.m_buffer[unitId].m_nextU
& && && && && && &&&citizenManager.ReleaseUnits(unitId);
& && && && && && &&&vehicleData.m_citizenUnits = firstId;
& && && && && && &&&n = (Mod.unit_number - 6) * 5 * 8 + 30;
& && && && && & }
& && && && && & citizenManager.CreateUnits(out firstId, ref random, 0, vehicleData.GetFirstVehicle(vehicleID), 0, 0, 0, n, 0);
& && && && && & vehicleData.m_citizenUnits = firstId;
& && && && &}
& && && && &return base.ArriveAtDestination(vehicleID, ref vehicleData);
四:其他要交代的
打印调试语句:
DebugOutputPanel.AddMessage(MessageType.Message,&output something&);
进入游戏后按F7,即可调出控制台
替换官方AI会导致跟其他mod冲突的概率大大加大,换句话说,如果其他mod也试图跟你替换同一个AI,那么一定最后只会有一个成功。所以,后来我基本不再写替换官方AI的MOD了。做的那个出乎我自己意料的、大家很喜欢的、停车收费降居民需求的MOD,其实就是我替换自己建筑物的AI,从理论上讲,基本不会跟别人冲突掉。
另外,这个游戏是使用的UnityEngine引擎。其中大量的模拟了物理方面的规则。所以,在改代码的时候,时刻要牢记一定要符合物理规则。比如,把车辆速度调快,确实车速会增加的,但是,拐弯的时候也会翻车的,很真实,符合物理规则。
顶!C#语言好评!
写的太棒了,我一句都看不懂
一点要支持一下,,好好学习争取早日看懂!m m
写的太棒了,我一句都看不懂
Powered by

我要回帖

更多关于 城市天际线mod怎么用 的文章

 

随机推荐