콘텐츠로 이동

빠른 시작

10분 만에 첫 플러그인을 만듭니다. 이 플러그인은 두 가지를 더합니다.

종류이름하는 일
메뉴 항목도구 › 선택 블록 세기선택 상자 안의 블록 수를 알림으로 보여 줍니다.
빠른 추가「추가」 › 프리셋 › 3×3 기둥마우스 아래 칸에 돌벽돌 기둥(3×3, 높이 6)을 놓습니다.

준비물은 .NET 8 SDK 와 설치된 NP Editor 입니다. 개요의 준비물 표를 먼저 확인합니다.

폴더 하나에 파일 세 개를 만듭니다.

my_first_plugin/
├─ MyFirstPlugin.csproj
├─ Plugin.cs
└─ plugin.json
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<!-- 에디터 설치 폴더의 SDK dll 을 참조합니다. 설치 폴더를 바꿨으면 이 경로도 바꿉니다. -->
<Reference Include="NP.Editor.Sdk">
<HintPath>$(LOCALAPPDATA)\Programs\NP Editor\data_NPEditor_windows_x86_64\NP.Editor.Sdk.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="plugin.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
</Project>
설정왜
EnableDynamicLoading플러그인을 끌 때 메모리에서 내릴 수 있게 합니다.
Private=falseSDK dll 을 출력 폴더에 복사하지 않습니다. 에디터가 가진 SDK 를 씁니다.
ImplicitUsingsSystem.Linq · System.IO 같은 기본 using 을 자동으로 넣습니다.
plugin.json 복사빌드 출력 폴더에 plugin.json 이 함께 생깁니다.
using NP.Editor.Sdk;
namespace MyFirstPlugin;
public sealed class Plugin : INpEditorPlugin
{
public void Register(INpEditorHost host)
{
// 도구 › 선택 블록 세기
host.AddMenuItem(new NpMenuItem("count", "도구", "선택 블록 세기", () =>
{
if (host.World.Selection is not { } box) { host.Message("먼저 영역을 고르세요"); return; }
int n = host.World.Blocks(box).Count();
host.Message($"선택 안 블록 {n:N0}개");
}));
// 추가 › 프리셋 › 3×3 기둥 (마우스 아래 칸에 놓음)
host.AddQuickAddItem(new NpQuickAdd("pillar", "3×3 기둥", "프리셋", ctx =>
ctx.World.Edit("3×3 기둥", e => // Edit 한 번 = 되돌리기 1단계
{
for (int y = 0; y < 6; y++)
for (int x = 0; x < 3; x++)
for (int z = 0; z < 3; z++)
e.Set(ctx.Place.X + x, ctx.Place.Y + y, ctx.Place.Z + z, "minecraft:stone_bricks");
}),
Keywords: "pillar column 기둥", Icon: "prefab", IconState: "minecraft:stone_bricks"));
host.Log("준비됨");
}
}
  • 진입 클래스는 INpEditorPlugin 을 구현합니다. 인자 없는 public 생성자가 있어야 합니다.
  • 기능은 Register 안에서 host.Add… 로 붙입니다.
  • Register 에서 예외가 나면 아무것도 등록되지 않고 플러그인이 꺼집니다.
{
"id": "my_first_plugin",
"name": "내 첫 플러그인",
"version": "0.1.0",
"sdk": "^1.0",
"dll": "MyFirstPlugin.dll",
"entry": "MyFirstPlugin.Plugin",
"description": "선택 블록 세기 + 3×3 기둥",
"author": "내 이름"
}

이 플러그인은 SDK 1.0 기능만 씁니다. 그래서 "sdk": "^1.0" 입니다. 칸 설명은 plugin.json에 있습니다.

dotnet build -c Release

출력 폴더(bin\Release\net8.0\)에 MyFirstPlugin.dll 과 plugin.json 이 생깁니다.

  1. 에디터에서 도구 › 플러그인 폴더 열기 를 누릅니다. %APPDATA%\NPEditor\plugins\ 가 열립니다.
  2. 그 안에 my_first_plugin 폴더를 만듭니다.
  3. MyFirstPlugin.dll 과 plugin.json 을 복사합니다. NP.Editor.Sdk.dll 은 넣지 않습니다.
  4. 디버그하려면 MyFirstPlugin.pdb 도 같이 넣습니다.
  1. 도구 › 플러그인 관리자… 를 엽니다.
  2. 「다시 훑기」를 누릅니다.
  3. 처음 한 번은 보안 경고가 나옵니다. 「믿을 수 있음 — 불러오기」를 누릅니다.
  4. 목록에 「내 첫 플러그인」이 「켜짐」으로 보이면 됩니다.
어디서보여야 하는 것
출력 로그[my_first_plugin] 준비됨
플러그인 관리자 「등록」 칸메뉴 1 · 빠른 추가 1
메뉴 막대도구 › 선택 블록 세기
메인 툴바 「추가」분류 「프리셋」 안의 「3×3 기둥」(검색 「기둥」)
  1. 블록 몇 개를 놓고 영역을 고른 뒤 도구 › 선택 블록 세기 를 누릅니다. 블록 수 알림이 나옵니다.
  2. 「추가」 › 3×3 기둥 을 누릅니다. 기둥이 생깁니다.
  3. Ctrl+Z 한 번으로 기둥 전체가 사라집니다.

에디터는 dll 파일을 잠그지 않습니다. 에디터를 켠 채로 다시 빌드할 수 있습니다.

  1. 코드를 고치고 다시 빌드합니다.
  2. 새 dll 을 플러그인 폴더에 덮어씁니다.
  3. 플러그인 관리자에서 그 줄을 고르고 「다시 읽기(선택)」를 누릅니다.

콘솔에서 plugins 를 입력하면 플러그인 목록과 상태가 나옵니다. plugins reload 는 폴더를 다시 훑습니다.