现在,假设我们有两个marine

这两个marine会具有一些相同的属性:

最大生命值都为40点、武器伤害为6点、生产需要50ore等等

与此同时,他们也会有一些不同的属性:

在地图上的位置(坐标)、当前生命值、正在攻击的目标等等

说到这里,聪明的你可能已经发现,游戏可以精准的区分每一个marine的不同之处

但在触发里,我们修改了某些属性却会导致所有marine的这个属性都发生改变,这不是我们的本意

现在,其中一个marine的血量降低了10点,即30/40(当前/最大),而另一个marine却还是满血

显然,“当前生命值”这个属性是基于每个单位独立的属性,而非属于“marine”这个整体的属性

这样基于每个单位独立存在的属性,我们把他叫做Structure offset,直译为结构偏移量,也叫作Cunit

Cunit包含了单位的当前生命值、在地图上的地图坐标、单位所属的玩家、当前的状态等等一系列信息

众做周知,在游戏中同时最多存在1700个单位(重制版可以扩展到3400),每一个单位都会有Cunit

Cunit本质上其实是一个指针,而1700个单位的Cunit会形成一个链表

显然地图上的每一个单位都会在这个链表中存在一个唯一确定的序号,即单位索引

而基于单位索引,就可以确定每个单位的Cunit

这样的好处我们可以举一个例子来说明

例如某个单位的索引是240号,则我们只需要在链表中找到240号单位,我们就可以知道该单位的Cunit起始地址

基于该地址我们就可以很方便的读取我们想要的信息

我们只需要规定每一个独立属性的偏移地址,即可通过单位索引很方便的找到某个具体单位的某个属性的地址

例如我们规定0x08这个偏移量用于存储单位的当前生命值,数据类型为s32(有符号32位数据)

那么我们通过单位链表知道240号单位的地址为D,则可以顺理成章的知道D+0x008地址则存储了这个单位的当前生命值

修改这个值我们就能修改这个单位的当前生命

显然,这就可以做出一些基础触发没有的功能,例如我们可以让某个marine每秒自动回血

而不是通过基础触发中的ModifyUnitHitPoints修改所有机枪兵的当前生命值