Repository navigation
CSharp Structure
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Почніть з вибору формату: .csx підходить для невеликого ігрового скрипта, .cs — для звичайного коду C#, а .csproj об’єднує файли й залежності в проєкт. У C# using дозволяє записувати назви типів із простору імен коротше; namespace об’єднує типи під спільною назвою. Клас містить дані й методи. Тіло методу записують у { }, а прості інструкції зазвичай завершують знаком ;.
Збережіть цей приклад окремо як Example.csx. Запускайте його незалежно від інших прикладів на сторінці.
Example.csx:
UO.Print("Ready");
await WaitAsync(10);
UO.Print("Done");Результат:
Ready
Done
Збережіть цей приклад окремо як Program.cs. Запускайте його незалежно від інших прикладів на сторінці.
Program.cs:
// PROJECT-EXAMPLE
System.Console.WriteLine("Ready");Minimal.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup><Compile Include="Program.cs" /></ItemGroup>
</Project>dotnet run --project Minimal.csprojРезультат (Minimal.csproj):
Ready
У файлі .csx уже доступні UO, Args, Cancellation і WaitAsync. Інструкції виконуються зверху донизу. Клас Program не потрібен. У цьому прикладі скрипт пише повідомлення, чекає 100 мілісекунд і показує координати персонажа.
string message = "Script started";
UO.Print(message);
await WaitAsync(100);
UO.Print($"X={UO.GetX()}, Y={UO.GetY()}");Оголошення функції описує, що вона робить. Тіло функції виконується лише після виклику. Тут ReportPosition() викликається двічі, з очікуванням між викликами.
void ReportPosition()
{
int x = UO.GetX();
int y = UO.GetY();
UO.Print($"Position: {x}, {y}");
}
ReportPosition();
await WaitAsync(100);
ReportPosition();У звичайній програмі виконання починається з методу Main або верхньорівневих інструкцій. Приклад нижче показує класичну структуру: простір імен, клас Program і метод Main. Console.WriteLine пише в консоль; для повідомлення в грі використовуйте API ігрової сесії.
// PROJECT-EXAMPLE
using System;
namespace UserTools;
internal static class Program
{
private static int Main(string[] args)
{
Console.WriteLine(args.Length > 0 ? args[0] : "Ready");
return 0;
}
}Файл .csproj визначає цільову платформу .NET, вихідні файли, залежності та параметри компіляції. Код зберігається у файлах .cs. Скрипт .csx має інший спосіб запуску: просте перейменування файлу не додає потрібного класу чи точки входу.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>У невеликому проєкті поруч лежать MyScript.csproj і Program.cs; додаткові класи можна розмістити в папках Models/ та Services/. Для короткого ігрового скрипта достатньо одного .csx. У звичайному класі ігровий API передають через параметр або поле: глобальний UO зі скрипта не з’являється у довільному проєкті автоматично.
Офіційна документація: Структура програми та скрипта - Microsoft Learn.
У звичайному .cs або .csproj точка входу Main чи верхньорівневий код має пріоритет, навіть якщо збірка також містить ICSharpScript. Якщо виконуваної точки входу немає, потрібен один відкритий, не абстрактний клас ICSharpScript із відкритим конструктором без параметрів. Ігровий API у звичайному коді доступний через переданий контекст або CSharpScriptContext.Current, а не через неоголошену глобальну змінну UO.
ClassicUO — Bad Newbie & C# Scripts IDE