« 2015年5月 | トップページ | 2016年3月 »

2015年7月

2015年7月18日 (土)

Kerbal Space ProgramのパーツMODを作る 8

とりあえずx, y, zそれぞれの軸について拡大縮小可能なパーツを作ることはできた。

KSPFieldでVector3型を使う場合、cfgファイルにはカンマ区切りで書けばよい。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace JustFitStructures
{
    public class JustFit : PartModule
    {
        [KSPField(isPersistant = true, guiActiveEditor = true)]
        public Vector3 Size = new Vector3(1, 1, 1);
        [KSPField(isPersistant = true, guiActiveEditor = false)]
        public Vector3 SizeMax = new Vector3(5, 5, 5);
        [KSPField(isPersistant = true, guiActiveEditor = false)]
        public Vector3 SizeMin = new Vector3(1, 1, 1);
        [KSPField(isPersistant = true, guiActiveEditor = false)]
        public Vector3 SizeStep = new Vector3(1, 1, 1);
        [KSPField(isPersistant = true, guiActiveEditor = false)]
        public string FitY = "Independent";
        [KSPField(isPersistant = true, guiActiveEditor = false)]
        public string FitZ = "Independent";
        public override void OnStart(PartModule.StartState state)
        {
            base.OnStart(state);
            if (FitY == "FollowX" || FitY == "FollowZ")
                Events["IncreaseY"].active = Events["DecreaseY"].active = false;
            if (FitZ == "FollowX" || FitZ == "FollowY")
                Events["IncreaseZ"].active = Events["DecreaseZ"].active = false;
            FitPart();
        }
        [KSPEvent(active = true, guiActiveEditor = true)]
        public void IncreaseX()
        {
            Size.x = Math.Min(SizeMax.x, Size.x + SizeStep.x);
            FitPart();
        }
        [KSPEvent(active = true, guiActiveEditor = true)]
        public void DecreaseX()
        {
            Size.x = Math.Max(SizeMin.x, Size.x - SizeStep.x);
            FitPart();
        }
        [KSPEvent(active = true, guiActiveEditor = true)]
        public void IncreaseY()
        {
            Size.y = Math.Min(SizeMax.y, Size.y + SizeStep.y);
            FitPart();
        }
        [KSPEvent(active = true, guiActiveEditor = true)]
        public void DecreaseY()
        {
            Size.y = Math.Max(SizeMin.y, Size.y - SizeStep.y);
            FitPart();
        }
        [KSPEvent(active = true, guiActiveEditor = true)]
        public void IncreaseZ()
        {
            Size.z = Math.Min(SizeMax.z, Size.z + SizeStep.z);
            FitPart();
        }
        [KSPEvent(active = true, guiActiveEditor = true)]
        public void DecreaseZ()
        {
            Size.z = Math.Max(SizeMin.z, Size.z - SizeStep.z);
            FitPart();
        }
        private void FitPart()
        {
            transform.localScale = Size;
        }
    }
}
現状の問題点。
  • サイズ変更をしたときに親パーツの位置が変わらない
  • 子パーツを付けた状態でサイズ変更すると、子パーツのサイズも変更される
  • サイズ変更してもコストや質量が変わらない
PartModule直下のtransform.localScaleを書き換えるだけではダメだ。

Screenshot8

2015年7月15日 (水)

Kerbal Space ProgramのパーツMODを作る 7

今日読んだページの中で役に立ったもの。

Kerbal Space ProgramのパーツMODを作る 6

transformを変更するだけなら、可変サイズのパーツを作ることは簡単だ。この方向で行こう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace KSPFieldTest1
{
    public class KSPFieldTest : PartModule
    {
        public override void OnStart(PartModule.StartState state)
        {
            Debug.Log("KSPFieldTest OnStart");
            base.OnStart(state);
        }
        [KSPField(isPersistant = true, guiActive = false, guiActiveEditor = true)]
        public float length;
        [KSPEvent(active = true, guiActive = false, guiActiveEditor = true)]
        public void IncreaseLength()
        {
            length += 1;
            transform.localScale = new Vector3(1, length, 1);
        }
        [KSPEvent(active = true, guiActive = false, guiActiveEditor = true)]
        public void DecreaseLength()
        {
            length -= 1;
            transform.localScale = new Vector3(1, length, 1);
        }
    }
}

Screenshot13

Kerbal Space ProgramのパーツMODを作る 5

KSPFieldは勝手に*.cfgファイルから読み込んでくれる。

Class1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace KSPFieldTest1
{
    public class KSPFieldTest : PartModule
    {
        public override void OnStart(PartModule.StartState state)
        {
            Debug.Log("KSPFieldTest OnStart");
            base.OnStart(state);
        }
        [KSPField(isPersistant = true, guiActive = false, guiActiveEditor = true)]
        public float length;
        [KSPEvent(active = true, guiActive = false, guiActiveEditor = true)]
        public void IncreaseLength()
        {
            length += 1;
        }
        [KSPEvent(active = true, guiActive = false, guiActiveEditor = true)]
        public void DecreaseLength()
        {
            length -= 1;
        }
    }
}
NewModel.cfg
PART
{
 name = NewModelRightClick
 module = Part
 author = nishina
 mesh = NewModel.mu
 rescaleFactor = 1
 node_stack_bottom = 0.0, 0.5, 0.0, 0.0, -1.0, 0.0, 1
 node_stack_top = 0.0, -0.5, 0.0, 0.0, 1.0, 0.0, 1
 node_attach = 0.0, -0.5, 0.0, 0.0, -1.0, 0.0
 TechRequired = start
 entryCost = 0
 cost = 1
 category = Structural
 subcategory = 0
 title = MODTestRightClick
 manufacturer = nishina
 description = modtest
 attachRules = 1,1,1,1,0
 mass = 0.1
 dragModelType = default
 maximum_drag = 0.2
 minimum_drag = 0.2
 angularDrag = 1
 crashTolerance = 80
 breakingForce = 200
 breakingTorque = 200
 maxTemp = 2000 // = 5000
 bulkheadProfiles = size1, srf
 MODULE
 {
 name=KSPFieldTest
 length = 3
 }
}
パーツを新規設置した時点でlengthが3になっている。

Screenshot11

2015年7月14日 (火)

Kerbal Space ProgramのパーツMODを作る 4

パーツにモジュールとして機能を追加するプログラム。KSPEventとKSPActionを使うことには成功した。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace PartModule1
{
    public class RightClickPart : PartModule
    {
        public override void OnStart(StartState state)
        {
            Debug.Log("RightClickPart OnStart");
        }
        [KSPEvent(guiActive = true, guiName = "Activate")]
        public void Activate()
        {
            ScreenMessages.PostScreenMessage("RightClickPart Activated", 5.0f, ScreenMessageStyle.UPPER_CENTER);
            Debug.Log("RightClickPart Activated!");
        }
        [KSPAction("ActivateAction")]
        public void ActivateAction(KSPActionParam param)
        {
            Activate();
        }
    }
}

Screenshot10

次回はKSPFieldに挑戦予定。

Kerbal Space ProgramのパーツMODを作る 3

パーツの振る舞いをバニラとは変えたいので、コードを書かなければならない。

KSPのMODはUnityが提供するMonoBehaviourを継承する必要がある。
Microsoftが「Visual Studio Tools for Unity」というツールを提供しており、これを使えばUnityからVisual Studioを呼び出せるようだ。しかし、Unityは重いから使いたくない。どうせデバッグはKSPでするのだし。
ということでUnityに乗っからず開発する方法を試してみる。
Visual C#でC:\Program Files\Unity\Editor\Data\PlaybackEngines\windowsstandalonesupport\Variations\win64_nondevelopment_mono\Data\Managed\UnityEngine.dllを参照に追加することでMonoBehaviourを継承できるようになった。
クラスにKSPAddon属性を追加する必要があるのだが、これはC:\Program Files (x86)\Steam\SteamApps\common\Kerbal Space Program\KSP_Data\Managed\Assembly-CSharp.dllを参照に追加すればよい。
コード:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace ClassLibrary1
{
    [KSPAddon(KSPAddon.Startup.Flight, false)]
    public class Class1 : MonoBehaviour
    {
        void Awake()
        {
            Debug.Log("Hello World!");
        }
    }
}
LaunchしたときのKSP.log:
[LOG 19:50:57.695] Hello World!
フォーラムにMOD開発に関するリンクがたくさんあるが、NoAttach tagは使いそう。
CFG File Documentationも役に立つ。

Kerbal Space ProgramのパーツMODを作る 2

参考リンク

こんなC#プログラムをUnityで実行してオブジェクトを生成。
using UnityEngine;
using System.Collections;
public class makemesh : MonoBehaviour {
 private const int DIV = 15;
 private const float diameter = 0.625f;
 private const float flamewidth = 0.05f;
 private Mesh getMeshTopOfSemicircle( float y)
 {
 Mesh meshTopOfSemicircle = new Mesh ();
 Vector3[] vertices = new Vector3[(DIV + 1) * 2];
 Vector2[] UV = new Vector2[(DIV + 1) * 2];
 int[] triangles = new int[DIV*2*3];
 for (int i=0; i<DIV*2; i+=2) {
 vertices[i]   = new Vector3(  diameter/2            *Mathf.Cos ( Mathf.PI*i/DIV/2), y,  diameter/2            *Mathf.Sin (Mathf.PI*i/DIV/2));
 vertices[i+1] = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI*i/DIV/2), y, (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI*i/DIV/2));
 
 UV[i]   = new Vector2( ((float)i)/DIV, 0.0f);
 UV[i+1] = new Vector2( ((float)i)/DIV, 1.0f);
 
 triangles[i*3]   = i+2;
 triangles[i*3+1] = i+1;
 triangles[i*3+2] = i;
 
 triangles[i*3+3] = i+1;
 triangles[i*3+4] = i+2;
 triangles[i*3+5] = i+3;
 }
 vertices[DIV*2]   = new Vector3(  diameter/2            *Mathf.Cos ( Mathf.PI), y,  diameter/2            *Mathf.Sin (Mathf.PI));
 vertices[DIV*2+1] = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI), y, (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI));
 UV[DIV*2]   = new Vector2( 1.0f, 0.0f);
 UV[DIV*2+1] = new Vector2( 1.0f, 1.0f);
 meshTopOfSemicircle.vertices  = vertices;
 meshTopOfSemicircle.uv        = UV;
 meshTopOfSemicircle.triangles = triangles;
 return meshTopOfSemicircle;
 }
 private Mesh getMeshBottomOfSemicircle( float y)
 {
 Mesh meshBottomOfSemicircle = new Mesh ();
 
 Vector3[] vertices = new Vector3[(DIV + 1) * 2];
 Vector2[] UV = new Vector2[(DIV + 1) * 2];
 int[] triangles = new int[DIV*2*3];
 
 for (int i=0; i<DIV*2; i+=2) {
 vertices[i]   = new Vector3(  diameter/2            *Mathf.Cos ( Mathf.PI*i/DIV/2), y,  diameter/2            *Mathf.Sin (Mathf.PI*i/DIV/2));
 vertices[i+1] = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI*i/DIV/2), y, (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI*i/DIV/2));
 
 UV[i]   = new Vector2( ((float)i)/DIV, 0.0f);
 UV[i+1] = new Vector2( ((float)i)/DIV, 1.0f);
 
 triangles[i*3]   = i;
 triangles[i*3+1] = i+1;
 triangles[i*3+2] = i+2;
 
 triangles[i*3+3] = i+3;
 triangles[i*3+4] = i+2;
 triangles[i*3+5] = i+1;
 }
 vertices[DIV*2]   = new Vector3(  diameter/2            *Mathf.Cos ( Mathf.PI), y,  diameter/2            *Mathf.Sin (Mathf.PI));
 vertices[DIV*2+1] = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI), y, (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI));
 
 UV[DIV*2]   = new Vector2( 1.0f, 0.0f);
 UV[DIV*2+1] = new Vector2( 1.0f, 1.0f);
 
 meshBottomOfSemicircle.vertices  = vertices;
 meshBottomOfSemicircle.uv        = UV;
 meshBottomOfSemicircle.triangles = triangles;
 
 return meshBottomOfSemicircle;
 }
 private Mesh getMeshOuterOfSemicircle( float y)
 {
 Mesh meshOuterOfSemicircle = new Mesh ();
 
 Vector3[] vertices = new Vector3[(DIV + 1) * 2];
 Vector2[] UV = new Vector2[(DIV + 1) * 2];
 int[] triangles = new int[DIV*2*3];
 
 for (int i=0; i<DIV*2; i+=2) {
 vertices[i]   = new Vector3( diameter/2*Mathf.Cos ( Mathf.PI*i/DIV/2), y           , diameter/2*Mathf.Sin (Mathf.PI*i/DIV/2));
 vertices[i+1] = new Vector3( diameter/2*Mathf.Cos ( Mathf.PI*i/DIV/2), y+flamewidth, diameter/2*Mathf.Sin (Mathf.PI*i/DIV/2));
 UV[i]   = new Vector2( ((float)i)/DIV, 0.0f);
 UV[i+1] = new Vector2( ((float)i)/DIV, 1.0f);
 
 triangles[i*3]   = i;
 triangles[i*3+1] = i+1;
 triangles[i*3+2] = i+2;
 
 triangles[i*3+3] = i+3;
 triangles[i*3+4] = i+2;
 triangles[i*3+5] = i+1;
 }
 vertices[DIV*2]   = new Vector3( diameter/2*Mathf.Cos ( Mathf.PI), y           , diameter/2*Mathf.Sin (Mathf.PI));
 vertices[DIV*2+1] = new Vector3( diameter/2*Mathf.Cos ( Mathf.PI), y+flamewidth, diameter/2*Mathf.Sin (Mathf.PI));
 UV[DIV*2]   = new Vector2( 1.0f, 0.0f);
 UV[DIV*2+1] = new Vector2( 1.0f, 1.0f);
 
 meshOuterOfSemicircle.vertices  = vertices;
 meshOuterOfSemicircle.uv        = UV;
 meshOuterOfSemicircle.triangles = triangles;
 
 return meshOuterOfSemicircle;
 }
 private Mesh getMeshInnerOfSemicircle( float y)
 {
 Mesh meshInnerOfSemicircle = new Mesh ();
 
 Vector3[] vertices = new Vector3[(DIV + 1) * 2];
 Vector2[] UV = new Vector2[(DIV + 1) * 2];
 int[] triangles = new int[DIV*2*3];
 
 for (int i=0; i<DIV*2; i+=2) {
 vertices[i]   = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI*i/DIV/2), y           , (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI*i/DIV/2));
 vertices[i+1] = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI*i/DIV/2), y+flamewidth, (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI*i/DIV/2));
 
 UV[i]   = new Vector2( ((float)i)/DIV, 0.0f);
 UV[i+1] = new Vector2( ((float)i)/DIV, 1.0f);
 
 triangles[i*3]   = i+2;
 triangles[i*3+1] = i+1;
 triangles[i*3+2] = i;
 
 triangles[i*3+3] = i+1;
 triangles[i*3+4] = i+2;
 triangles[i*3+5] = i+3;
 }
 vertices[DIV*2]   = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI), y           , (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI));
 vertices[DIV*2+1] = new Vector3( (diameter/2-flamewidth)*Mathf.Cos ( Mathf.PI), y+flamewidth, (diameter/2-flamewidth)*Mathf.Sin (Mathf.PI));
 
 UV[DIV*2]   = new Vector2( 1.0f, 0.0f);
 UV[DIV*2+1] = new Vector2( 1.0f, 1.0f);
 
 meshInnerOfSemicircle.vertices  = vertices;
 meshInnerOfSemicircle.uv        = UV;
 meshInnerOfSemicircle.triangles = triangles;
 
 return meshInnerOfSemicircle;
 }
 private Mesh getMeshFaceOfSemicircle( float x, float y, float z)
 {
 Mesh meshFaceOfSemicircle = new Mesh ();
 
 Vector3[] vertices = new Vector3[4];
 Vector2[] UV = new Vector2[4];
 int[] triangles = new int[6];
 vertices [0] = new Vector3 (x, y, z);
 vertices [1] = new Vector3 (x + flamewidth, y, z);
 vertices [2] = new Vector3 (x + flamewidth, y + flamewidth, z);
 vertices [3] = new Vector3 (x, y + flamewidth, z);
 UV [0] = new Vector2 (0f, 0f);
 UV [1] = new Vector2 (1f, 0f);
 UV [2] = new Vector2 (1f, 1f);
 UV [3] = new Vector2 (0f, 1f);
 triangles [0] = 3;
 triangles [1] = 1;
 triangles [2] = 0;
 triangles [3] = 3;
 triangles [4] = 2;
 triangles [5] = 1;
 meshFaceOfSemicircle.vertices  = vertices;
 meshFaceOfSemicircle.uv        = UV;
 meshFaceOfSemicircle.triangles = triangles;
 
 return meshFaceOfSemicircle;
 }
 private Mesh getMeshOfPole()
 {
 Mesh meshOfPole = new Mesh ();
 
 Vector3[] vertices = new Vector3[8];
 Vector2[] UV = new Vector2[8];
 int[] triangles = new int[36];
 
 vertices [0] = new Vector3 (flamewidth/2, 0.5f, diameter/2);
 vertices [1] = new Vector3 (flamewidth/2, -0.5f, diameter/2);
 vertices [2] = new Vector3 (-flamewidth/2, -0.5f, diameter/2);
 vertices [3] = new Vector3 (-flamewidth/2, 0.5f, diameter/2);
 vertices [4] = new Vector3 (flamewidth/2, 0.5f, diameter/2-flamewidth);
 vertices [5] = new Vector3 (flamewidth/2, -0.5f, diameter/2-flamewidth);
 vertices [6] = new Vector3 (-flamewidth/2, -0.5f, diameter/2-flamewidth);
 vertices [7] = new Vector3 (-flamewidth/2, 0.5f, diameter/2-flamewidth);
 UV [0] = new Vector2 (0f, 0f);
 UV [1] = new Vector2 (0f, 0f);
 UV [2] = new Vector2 (0f, 0f);
 UV [3] = new Vector2 (0f, 0f);
 UV [4] = new Vector2 (0f, 0f);
 UV [5] = new Vector2 (0f, 0f);
 UV [6] = new Vector2 (0f, 0f);
 UV [7] = new Vector2 (0f, 0f);
 triangles [0] = 3;
 triangles [1] = 2;
 triangles [2] = 1;
 triangles [3] = 1;
 triangles [4] = 0;
 triangles [5] = 3;
 triangles [6] = 4;
 triangles [7] = 5;
 triangles [8] = 6;
 triangles [9] = 6;
 triangles [10] = 7;
 triangles [11] = 4;
 triangles [12] = 3;
 triangles [13] = 0;
 triangles [14] = 4;
 triangles [15] = 4;
 triangles [16] = 7;
 triangles [17] = 3;
 triangles [18] = 1;
 triangles [19] = 2;
 triangles [20] = 6;
 triangles [21] = 6;
 triangles [22] = 5;
 triangles [23] = 1;
 triangles [24] = 0;
 triangles [25] = 1;
 triangles [26] = 5;
 triangles [27] = 5;
 triangles [28] = 4;
 triangles [29] = 0;
 triangles [30] = 2;
 triangles [31] = 3;
 triangles [32] = 7;
 triangles [33] = 7;
 triangles [34] = 6;
 triangles [35] = 2;
 meshOfPole.vertices  = vertices;
 meshOfPole.uv        = UV;
 meshOfPole.triangles = triangles;
 
 return meshOfPole;
 }
 void Start () {
 CombineInstance [] combine = new CombineInstance[13];
 combine [0].mesh = getMeshTopOfSemicircle (-0.5f);
 combine [1].mesh = getMeshBottomOfSemicircle (-0.5f+flamewidth);
 combine [2].mesh = getMeshTopOfSemicircle (0.5f-flamewidth);
 combine [3].mesh = getMeshBottomOfSemicircle (0.5f);
 combine [4].mesh = getMeshOuterOfSemicircle (-0.5f);
 combine [5].mesh = getMeshOuterOfSemicircle (0.5f - flamewidth);
 combine [6].mesh = getMeshInnerOfSemicircle (-0.5f);
 combine [7].mesh = getMeshInnerOfSemicircle (0.5f - flamewidth);
 combine [8].mesh = getMeshFaceOfSemicircle (-diameter/2 , -0.5f, 0);
 combine [9].mesh = getMeshFaceOfSemicircle (-diameter/2 , 0.5f-flamewidth, 0);
 combine [10].mesh = getMeshFaceOfSemicircle (diameter/2-flamewidth, -0.5f, 0);
 combine [11].mesh = getMeshFaceOfSemicircle (diameter/2-flamewidth, 0.5f-flamewidth, 0);
 combine [12].mesh = getMeshOfPole ();
 Mesh mesh = new Mesh ();
 mesh.CombineMeshes (combine, true, false);
 mesh.RecalculateNormals();
 mesh.RecalculateBounds();
 
 GetComponent<MeshFilter>().sharedMesh = mesh;
 GetComponent<MeshFilter>().sharedMesh.name = "myMesh";
 UnityEditor.AssetDatabase.CreateAsset (mesh, "Assets/mesh.asset");
 
 }
 
 void Update () {
 
 }
}
Kerbal Space Programでパーツを読み込めた。とりあえず今日は満足。

Screenshot9

2015年7月13日 (月)

Kerbal Space ProgramのパーツMODを作る 1

  1. Unityのアカウントを作ってダウンロード
  2. PartToolsをこのスレッドの#77からダウンロードして"\Program Files\Unity\Editor\Standard Assets"に置く
  3. Unityを起動
  4. Asset packagesでPartTools023xを追加して新規プロジェクトを作成
  5. UnityのメニューでGameObject→CreateEmpty
  6. UnityのメニューでGameObject→3D Object→Sphere
  7. 画面右のInspectorでAdd Component→KSP→Part Tools
  8. Part Tools(Script)の下にあるSet GameData directoryボタンを押す
  9. C:\Program Files (x86)\Steam\SteamApps\common\Kerbal Space Programを指定
  10. File URLにC:\Program Files (x86)\Steam\SteamApps\common\Kerbal Space Program\GameData\MODTESTを指定
  11. Writeボタンを押す
  12. C:\Program Files (x86)\Steam\SteamApps\common\Kerbal Space Program\GameData\MODTESTにNewModel.muができているはず
  13. C:\Program Files (x86)\Steam\SteamApps\common\Kerbal Space Program\GameData\Squad\Parts\Structural\trussGirderL\trussGirderL.cfgを参考に、NewModel.cfgを書く

PART

{

 name = NewModel

 module = Part

 author = nishina

 mesh = NewModel.mu

 rescaleFactor = 1

 node_stack_bottom = 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 1

 node_stack_top = 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 1

 node_attach = 0.0, -1.0, 0.0, 0.0, -1.0, 0.0

 TechRequired = start

 entryCost = 0

 cost = 1

 category = Structural

 subcategory = 0

 title = MODTest

 manufacturer = nishina

 description = modtest

 attachRules = 1,1,1,1,0

 mass = 0.1

 dragModelType = default

 maximum_drag = 0.2

 minimum_drag = 0.2

 angularDrag = 1

 crashTolerance = 80

 breakingForce = 200

 breakingTorque = 200

 maxTemp = 2000 // = 5000

 bulkheadProfiles = size1, srf

}


[Alt]+[F12]を押してMODを再読み込み。
取り付け位置がおかしいが、パーツを読み込めた。

Screenshot8

参考リンク:

« 2015年5月 | トップページ | 2016年3月 »