网站首页 单机图文攻略 单机视频攻略 单机游戏攻略 单机游戏问答 游戏常见问题 游戏心得体会 手游图文攻略 手游视频攻略 手游图鉴攻略 手游软件教程 手游攻略问题 网游图文攻略 网游综合攻略 网游游戏问答
当前位置:欢乐游戏吧 > 单机游戏攻略 > 

二、基本API解读 城市:天际线 MOD制作教程 MOD源码解析及开发指南

栏目: 单机游戏攻略 / 发布于: / 人气:2.74W

二、基本API解读

二、基本API解读 城市:天际线 MOD制作教程 MOD源码解析及开发指南

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

1、IUserMod

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

代码:

using ICities;

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;

using System.Collections.Generic;

using ColossalFramework;

using ICities;

using UObject = UnityEngine.Object;

namespace SuperBigTransport

{

public class LoadingExtension : LoadingExtensionBase

{

public override void OnLevelLoaded(LoadMode mode)

{//游戏加载开始。

ForEachPrefab((VehicleInfo i) =>//在读取所有车辆信息时,对每一个车辆信息进行处理。主意这里不是每一辆车,是每一类车,注意是Info类

{

ReplaceVehicleAI

ReplaceVehicleAI

});

//游戏加载结束

}

static void ReplaceVehicleAI

where TOldAI : VehicleAI

where TNewAI : VehicleAI, IAIReplacement, new()

{

var oldAI = i.gameObject.GetComponent();

if (oldAI == null)

return;

i.gameObject.AddComponent();//必须先把新的AI注册进去,再取出来。。好奇怪的写法,但是不这么写不行

var newAI = i.gameObject.GetComponent();

newAI.CopyFrom(oldAI);//AI也有属性,如果要替换,必须把原有的属性也全部对拷,否则就会出现各种奇怪的情况

i.m_vehicleAI = newAI;

UObject.Destroy(oldAI);

newAI.InitializeAI();

}

static void ForEachPrefab(Action f) where T : PrefabInfo

{

for (var i = 0u; i < PrefabCollection.LoadedCount(); i++)

f(PrefabCollection.GetLoaded(i));

}

}

interface IAIReplacement

{

void CopyFrom(T ai);

}

}

3、ThreadingExtensionBase

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

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

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

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