Difference between revisions of "Tutorial:Creating your first module"

From Kerbal Space Program Wiki
Jump to: navigation, search
(Common Problems: Compilation failed on my Linux box because these assemblies were not mentioned in the setup guide. So I added them there, and am putting a small note here.)
m (Wrong key combination for debug menu. ALT-F12 works, not ALt-F2)
Line 139: Line 139:
 
Load the game, we can see something silly in our KSP_Data/output_log.txt! On MacOS, the output is instead saved to ~/Library/Logs/Unity/Player.log
 
Load the game, we can see something silly in our KSP_Data/output_log.txt! On MacOS, the output is instead saved to ~/Library/Logs/Unity/Player.log
  
Alternatively, press ALT+F2 to bring up the ingame debug console.
+
Alternatively, press ALT+F12 to bring up the ingame debug console.
  
 
== Common Problems ==
 
== Common Problems ==

Revision as of 04:50, 7 March 2017

So you've got your IDE all set up. Now what?

The next step involves coding your first PartModule class. Quit shaking, it's actually very simple to add things to KSP, and won't take you very long to complete.

This tutorial assumes you're using Visual Studio 2010, but any IDE will do; Adapt accordingly!

First Things First

You've managed to slog through Setting up Visual Studio (for Windows) or Setting up MonoDevelop (for Windows/Linux/Mac), and you've got an empty class open in front of you with a pretty uncreative name.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace MyKSPProject
{
    public class Class1
    {
    }
}

We're going to rename the class to something nice and creative, like HelloKerbinMod. As a matter of good practices, remember to rename the file the class is in! (In VS2010, right-click the file and choose Rename.)

After compulsively re-indenting (VS2010: CTRL+E, D) it looks like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace MyKSPProject
{
    public class HelloKerbinMod
    {
    }
}

Awesome, now we can move on to the good stuff.

The Good Stuff

Extending PartModule

Part Modules all have one thing in common: They extend the PartModule class. The PartModule class defines a bunch of easy to use and intuitive methods and properties which you must override to do things with your module.

So, let's go ahead and extend PartModule. You don't need to add any using directives; It's in the global namespace as long as you have your KSP DLLs referenced correctly. However, you will need to add a using directive for the UnityEngine namespace in order to access debug functionality. Note that, again, compulsive cleanup was done.

DO NOT ADD A CONSTRUCTOR, Unity (and, by extension, KSP) DOESN'T LIKE CONSTRUCTORS!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
 
namespace MyKSPProject
{
    public class HelloKerbinMod : PartModule
    {
    }
}

Showing Up to Class

When a part module is first loaded, PartModule.OnStart(StartState state) is called. Here, we can set up low-level things like icons.

So, let's go ahead and override OnStart. You don't need the base.OnStart() stuff, so let's toss that and add some documentation like good programmers do. The override modifier isn't necessary, but it's good practice and will throw compile errors in case HarvesteR moves things around.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
 
namespace MyKSPProject
{
    /// <summary>
    /// My first part!
    /// </summary>
    public class HelloKerbinMod : PartModule
    {
        /// <summary>
        /// Called when the part is started by Unity.
        /// </summary>
        public override void OnStart(StartState state)
        {
        }
    }
}

So we've got a method now, but it doesn't really do anything. So, let's just print something silly to the log.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using UnityEngine;
 
namespace MyKSPProject
{
    /// <summary>
    /// My first part!
    /// </summary>
    public class HelloKerbinMod : PartModule
    {
        /// <summary>
        /// Called when the part is started by Unity.
        /// </summary>
        public override void OnStart(StartState state)
        {
            // Add stuff to the log
            print("Hello, Kerbin!");
        }
    }
}

Cool! Now when we compile the DLL (which you can find in Visual Studio 2010/YourSolution/YourProject/bin/Debug) and toss it into Plugins/

Adding to a Part

  • Because we're just making a simple test part, make a copy of the "RCS block" directory and edit part.cfg. (As of 0.20, located in GameData\Squad\Parts\Utility)
  • Now, change part.cfg so that MODULE { name = ModuleRCS becomes MODULE { name = HelloKerbinMod.
  • Our part needs a name. Change the name = at the top of the file from RCSBlock to something like MyUselessPart.

Save the .cfg file. When you load the game, you'll discover that the RCS block is indeed there. And it doesn't do anything.

Build and Test

Load the game, we can see something silly in our KSP_Data/output_log.txt! On MacOS, the output is instead saved to ~/Library/Logs/Unity/Player.log

Alternatively, press ALT+F12 to bring up the ingame debug console.

Common Problems

Verify your project targets .NET 3.5 - many newer compilers and IDEs target 4.0.

Linux systems may be missing the PCL assembly libraries, which will cause compilation to fail due to their absence. Check the Setting up MonoDevelop page for more information.

Continuing the Legacy

Now it's your turn. Try overriding various methods in PartUpdate, like onUpdate. Over the coming weeks, more information can be found at Plugins.