废话
游戏中可重复使用的功能特性都被制作为组件,这些组件可以继承在各种各样的物体上,而想使用这些组件则只需要在xml文件中添加需要的组件就可以,很方便的为物体创造多样性。游戏中的comp组件与unity引擎中的component是两回事。
核心内容
1 comp组件
1.1 ThingWithComps
说到comp,不得不说一下ThingWithComps。ThingWithComps继承与Thing,所有的物体都继承与Thing,而带有组件功能的物体则会继承ThingWithComps。物体根据xml数据加载时添加对应的comp和properties,并执行comp的生命周期。
1.2 compProperties
compProperties是组件的属性,一般用于存一些设定上不变的数据,而需要储存的数据则写在comp中,并且需要实现序列化方法PostExposeData(),否则存档后加载就会失去这些数据,游戏状态会异常。
1.3 comp在xml中的使用方法
在thing的xml文件里有comps属性,可以添加组件。
没有属性compProperties的写法:
<li>
<compClass>CompQuality</compClass>
</li>
因为组件属性与组件是绑定关系,所以默认有属性的写法如下,省略的组件的class:
<li Class="CompProperties_Flickable"/>
如果需要修改组件中的属性:
<li Class="CompProperties_Art">
<nameMaker>NamerArtSculpture</nameMaker>
<descriptionMaker>ArtDescription_Sculpture</descriptionMaker>
<canBeEnjoyedAsArt>true</canBeEnjoyedAsArt>
</li>
如果自己继承了某个组件,但属性还用原来组件的属性:
<comps>
<li Class="CompProperties_Usable">
<compClass>SR.DA.Component.CompUsableElectrocutionChair</compClass>
<useJob>SR_ElectrocutionChair</useJob>
<useLabel>处刑</useLabel>
</li>
</comps>
如果属性和组件都重写的话,记得属性类也要加上命名空间。
<li Class="SR.DA.Component.CompProperties_PowerTraderUsable">
<compClass>SR.DA.Component.CompPowerTraderUsable</compClass>
<powerUsing>2000</powerUsing>
<basePowerConsumption>50</basePowerConsumption>
</li>
1.4 comp和compProperties的写法
继承某个组件的属性比较方便,如果是全新的组件属性则继承CompProperties
using RimWorld;
namespace SR.DA.Component
{
public class CompProperties_PowerTraderUsable : CompProperties_Power
{
public float powerUsing;//使用时消耗大量电量,造成电力负荷
public CompProperties_PowerTraderUsable() {
compClass = typeof(CompProperties_PowerTraderUsable);
}
}
}
组件类需要记得把属性强转成自己重写的类型,小写的props是读取xml时生成的父类指针,大写的则是我们要使用的类型,有新定义的数据。
using RimWorld;
namespace SR.DA.Component
{
public class CompPowerTraderUsable : CompPowerTrader
{
private new CompProperties_PowerTraderUsable Props=> (CompProperties_PowerTraderUsable)props;
}
}
剩下的就是丰富一些方法,在需要的时候调用thingwithcomps中的getComp()方法,然后做一些计算了。如果组件还有绘制层级之类的方法,则只需要改写对应的方法,这些方法的调用在thingwithcomps中设定好了。
如果这篇文章对你有帮助,点赞收藏支持一下呗!