ブロック定義についてのあれこれ

Last-modified: 2015-10-12 (月) 23:59:00

このページではMOD作成を補助するための基本的な事項を解説していきます。

1.ブロックを構成する要素について

ゲーム内で設置できるブロックや機械、または宇宙空間を漂うコンポーネントから資材・アステロイドなどなど…
これらは以下の要素によって構成されています。

  • 見た目を定義する3Dモデル及びテクスチャ
  • ブロックの特性を定義するコンフィグファイル(SEでは.sbcという拡張子で定義されています)
    以上2つの要素から成り立っています

定義とは…パソコンさんに色々と教える行為だと思っておいてください。
(ただし、パソコンさんはウルトラアスペなので言ったことをまさに文字通りにしか理解できない)

このうち3Dモデルとテクスチャにおいては使い回しが可能です。
では、具体的にsbcファイルの中身を見ていきましょう。

2.ブロックの性質を定義する

sbcファイルは複数あり、それぞれが必要不可欠な独自の役割を持っています。
まずはブロックの性質を定義する『CubeBlocks.sbc』の役割と中身を見ていきます。
メモ帳などの文章編集ソフトを使ってCubeBlocks.sbcファイルを開きましょう。
(筆者はVisualStudioを利用してます。置き換えや開いてるドキュメントの一括検索機能が便利!)

 

クリックで展開

Definition>

     <Id>
       <TypeId>CubeBlock</TypeId>
       <SubtypeId>LargeBlockArmorBlock</SubtypeId>
     </Id>
     <DisplayName>DisplayName_Block_LightArmorBlock</DisplayName>
     <Icon>Textures\GUI\Icons\Cubes\light_armor_cube.dds</Icon>
     <CubeSize>Large</CubeSize>
     <BlockTopology>Cube</BlockTopology>
     <Size x="1" y="1" z="1" />
     <ModelOffset x="0" y="0" z="0" />
     <CubeDefinition>
       <CubeTopology>Box</CubeTopology>
       <ShowEdges>true</ShowEdges>
       <Sides>
         <Side Model="Models\Cubes\Large\Armor\SquarePlate.mwm" PatternWidth="4" PatternHeight="2" />
         <Side Model="Models\Cubes\Large\Armor\SquarePlate.mwm" PatternWidth="4" PatternHeight="2" />
         <Side Model="Models\Cubes\Large\Armor\SquarePlate.mwm" PatternWidth="4" PatternHeight="2" />
         <Side Model="Models\Cubes\Large\Armor\SquarePlate.mwm" PatternWidth="4" PatternHeight="2" />
         <Side Model="Models\Cubes\Large\Armor\SquarePlate.mwm" PatternWidth="4" PatternHeight="2" />
         <Side Model="Models\Cubes\Large\Armor\SquarePlate.mwm" PatternWidth="4" PatternHeight="2" />
       </Sides>
     </CubeDefinition>
     <Components>
       <Component Subtype="SteelPlate" Count="20" />
       <Component Subtype="SteelPlate" Count="5" />
     </Components>
     <CriticalComponent Subtype="SteelPlate" Index="0" />
     <Variants>
       <Variant Color="Red" Suffix="_red" />
       <Variant Color="Yellow" Suffix="_yellow" />
       <Variant Color="Blue" Suffix="_blue" />
       <Variant Color="Green" Suffix="_green" />
       <Variant Color="Black" Suffix="_black" />
       <Variant Color="White" Suffix="_white" />
     </Variants>
     <BuildProgressModels>
       <Model BuildPercentUpperBound="0.33" File="Models\Cubes\Large\Armor\SquarePlateConstruction_1.mwm" />
       <Model BuildPercentUpperBound="0.66" File="Models\Cubes\Large\Armor\SquarePlateConstruction_2.mwm" RandomOrientation="true" />
       <Model BuildPercentUpperBound="1.00" File="Models\Cubes\Large\Armor\SquarePlateConstruction_3.mwm" RandomOrientation="true" />
     </BuildProgressModels>
     <Skeleton>
       <BoneInfo>
         <BonePosition x="0" y="0" z="0" />
         <BoneOffset x="127" y="127" z="127" />
~省略~
     </Skeleton>
     <BlockPairName>LightArmorBlock</BlockPairName>
     <EdgeType>Light</EdgeType>
     <BuildTimeSeconds>8</BuildTimeSeconds>
     <DisassembleRatio>2.5</DisassembleRatio>
     <NavigationDefinition>Default</NavigationDefinition>
   </Definition>
 

これはCubeBlock.sbcの中で大型船用のライトアーマーブロックを定義している部分です

<Definition>というカギカッコで囲まれたこの一文は「ここから定義を始めるぞ!」とパソコンに教え、

</Definition>と、スラッシュがついた一文で「定義はここまでだぞ!」と宣言するものです。

宣言とは…パソコンさんが理解できるようにプログラム言語を使って話しかける行為のことです。

さて、この「定義するぞ!」から「定義はここまで!」の間に「これはこうだよあれはああだよ」と書いていくのが「定義する」という行為になります。
上から順番に見ていきましょう。

<Id>という宣言がでてきました。
これは</Id>が出てくるまでブロックIDに関して決めますよ。という合図です。
この合図でパソコンさんはブロックIDに関しての話を聞く準備をします。

<TypeId>「このブロックの所属は…」
CubeBlock「CubeBlock組…」
</TypeId>「で…」
<SubtypeId>「もっと詳しくいえば…」
LargeBlockArmorBlock「LargeBlockArmorBlockグループに…」
</SubtypeId>「入れることにします」

・・・とまあこんな感じのやり取りを何回か繰り返すわけです。
それではやり取りは省略してそれぞれの定義について見ていきましょう。

機能を持たない建築・装甲ブロックの定義

さてこの定義についてですが、我々が手軽にいじれるsbcファイルより更に深いところ。
つまりゲームの基幹部分。ここにも定義が存在します。
これらのゲームの基礎を定義する部分はexeやdllファイルなどに収納されていて、編集するのは困難です。
しかしこれは気にする必要はありません。
いじる必要がないorいじってはいけない部分がほとんどで触る機会は全く無いと言っていいでしょう。
(ここをいじるレベルとなると新しくゲームが作れちゃうくらいなので)
ではなぜこの話をしたかと言うとsbcファイルで定義できる項目はあらかじめいくつかに決められていて、その項目を決めているのはどこ?
というとその基幹にある部分で定義してるからです。
(新しい機能を持つマシーンブロックなどを作りたいときにModAPIをいじるので絶対に触らないというわけではありませんが、今はいいでしょう)

さて、装甲ブロックに要求される定義はほかのものに比べて少ないと言えます。
IDの定義までは上に書いたので続きを見ていきましょう。

<DisplayName>
ゲーム内での名前を定義する部分です。
DisplayName_Block_XXX
XXXがゲーム内のGUIなどで表示される名前になります。

<Icon>
アイコンの画像ファイルの場所をここで指定します。

<CubeSize>
このブロックが大型船/ステーション用なのか小型船用なのかを指定します。
大型、小型両用の場合もそれぞれ別々にDefinitionを用意しなければならないのでLarge/Smallどちらか一つのみ指定します。

<BlockTopology>
ブロックの構造を定義します。・・・とだけ言ってもよくわからないですね?
ここは長くなるのでまた後ほど解説します。

<size>
ブロックの寸法を指定します。

<ModelOffset>
3Dモデルの表示座標とかを調整する部分だと思います(あまりよくわからんです。知ってる人が居たら教えてくり~)

<CubeDefinition>~</CubeDefinition>の間
ここは先ほど言及した<BlockTopology>に関係する部分なので、後でまとめてやります。

<Components>
さて、ここからはみんなが気になる部分が続々と出てきます。
まず、この箇所で必要な資材(コンポーネント)の種類と必要数を指定します。
このアーマーブロックのを見ると鉄板(SteelPlate)が20枚と5枚の2つに分けて指定されています。

<CriticalComponent ○○○○ />
先ほど必要資材が2つに分かれていましたが、それはこの部分で使います。
まずSubtype="SteelPlate"で特定資材を指定し、次のIndex="0"で順番を指定します。
この部分ではブロックの完成に必要な最低限の資材を指定します。
先ほどの<Components>の部分で必要な資材を順番に並べた後、CriticalComponentで完成するラインを指定するというわけです。
ちなみにこのIndexというのは「指定資材の中で上から何番目」というのを指定するものであり、一番最初のやつは「0番目」ですので注意してください。

	<Component Subtype="SteelPlate" Count="20" />
	<Component Subtype="Conputer" Count="1" />
	<Component Subtype="SteelPlate" Count="5" />
	<Component Subtype="Conputer" Count="1" />←☆
	<Component Subtype="SteelPlate" Count="5" />

☆マークのついた資材を完成に必要な最後の資材として指定するには

<CriticalComponent Subtype="Conputer" Index="1" />
と書けばよいわけです。
コンピューターの中では2番目ですので「Index=1」です。2ではないので気をつけましょう。

<Variants>
カラーバリエーションを追加する部分です。
Colorで色を指定しSuffixで接尾後を指定するのですが、基本的に使うことの無い部分なのでいじらなくてOKです。

<BuildProgressModels>
ブロックを建造中のモデルを指定します。(溶接してるときに出てくる骨組み)
BuildPercentUpperBound="0.33"の部分で「何パーセントまでそのモデルを表示するのか」を指定します。
RandomOrientation="true"ではモデルの向き表示をランダムにするか否かを指定します。
ブロックのような回転させても形が変わらないブロックはtrueにしておくと見た目にバリエーションが増えて良いでしょう。