Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create GettingStarted-KR #2580

Merged
merged 7 commits into from
May 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
214 changes: 214 additions & 0 deletions Localization/GettingStarted-KR.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
# Exiled 저수준 문서
*(Written by [KadeDev](https://github.com/KadeDev) for the community) (번역: [Cocoa](https://github.com/Cocoa2219))*

## 시작하기
### 개요
Exiled는 불필요한 부분 없이 게임에서 함수를 직접적으로 호출 할 수 있는 저수준 API입니다.

이 덕분에 Exiled는 업데이트가 상당히 쉽고, 게다가 게임이 업데이트하기도 전에 Exiled가 업데이트될 수 있습니다.

또한 이것은 플러그인 개발자들이 SCP:SL 또는 Exiled의 업데이트마다 코드를 바꿀 필요가 없다는 것을 나타냅니다.

이 문서는 Exiled 플러그인을 만들기 위한 가장 기본적인 부분을 설명하고 있습니다. 여기서부터 Exiled와 함께 당신의 창의력으로 무엇이든지 만들어보세요!

### 플러그인 예제
이 [플러그인 예제](https://github.com/galaxy119/EXILED/tree/master/Exiled.Example)는 이벤트를 사용하는 방법과 기본적인 구조를 설정하는 방법을 잘 나타내고 있습니다. 이것을 통해 Exiled를 제대로 사용하는 방법을 알 수 있으며, 이 플러그인 예제 안에는 몇 가지의 중요한 부분이 있습니다. 한번 볼까요?

#### OnEnable + OnDisable 동적 업데이트
Exiled는 **Reload** 명령어를 통해 원래 있던 모든 플러그인과 새 플러그인들을 리로드 할 수 있습니다. 이 말은 여러분이 여러분들의 플러그인을 **동적으로 업데이트** 할 수 있게 만들어야 한다는 뜻입니다. 모든 변수, 이벤트, 코루틴 등등은 *무조건* 활성화되었을 때 할당되고 비활성화되었을 때 null이 되어야 합니다. **OnEnable** 메소드는 모든 것들을 활성화시켜야 하고, **OnDisable** 메소드는 모든 것을 비활성화시켜야 합니다. 그러면 **OnReload**는 뭘까요? 정적인 변수들은 리로드 될 때 지워지지 않으므로, 이 메소드는 변수들을 지워지게 놔두고 싶지 않을 때 사용합니다. 예를 들어:
```csharp
// 이 정적 변수는 리로딩될 때 지워지지 않습니다
public static int StaticCount = 0;

// 이 변수는 리로딩될 때 초기화됩니다
public int counter = 0;

// 플러그인 활성화
public override void OnEnable()
{
// StaticCount에서 저장된 값 가져오기
counter = StaticCount;
counter++;
Info(counter);
}

// 플러그인 비활성화
public override void OnDisable()
{
counter++;
Info(counter);
}

// 플러그인 리로드
public override void OnReload()
{
// counter는 초기화되니 리로딩 되어도 초기화되지 않는 정적 변수에 저장
StaticCount = counter;
}
```

출력값은: (가독성을 위해 출력만 보이게 간소화했습니다)
```bash
# OnEnable 호출
1
# Reload 명령어 사용
# OnDisable 호출
2
# OnReload 호출
# 다시 OnEnable 호출
3

```

이렇게 하지 않으면 리로딩 될 때 counter가 1에서 2로 갔다가 변수가 초기화됩니다.

### 플레이어 + 이벤트
이제 플러그인을 **동적 업데이트**가 가능하게 하는 작업이 끝났습니다! 이제 플레이어와 이벤트를 통해 상호작용하는 방법을 알아봅시다.

이벤트는 SCP:SL이 Exiled와 통신하고, Exiled가 다시 모든 플러그인과 통신할 수 있게 합니다.

메인 플러그인 소스 코드의 맨 위에 이런 줄을 추가함으로서 이벤트를 처리할 수 있습니다:
```csharp
using EXILED;
```
그리고 실제로 이벤트를 사용하기 위해 `Exiled.Events.dll` 파일을 참조해야 합니다.

이벤트를 사용하기 위해 "EventHandlers"라는 새로운 클래스를 만들겠습니다.

OnEnable과 OnDisable에서 다음과 같이 이벤트를 구독하고 구독 취소할 수 있습니다:

`MainClass.cs`
```csharp
using Player = Exiled.Events.Handlers.Player;

public EventHandlers EventHandler;

public override OnEnable()
{
// EventHandlers 클래스를 하나 생성하고
EventHandler = new EventHandlers();
// 이벤트 신호를 받을 수 있게 이벤트에 메소드를 구독하세요
Player.Verified += EventHandler.PlayerVerified;
}

public override OnDisable()
{
// 동적 업데이트가 가능하게 만들기 위해 이벤트에서 구독 취소하고 (모든 이벤트에서 구독 취소해야 합니다)
Player.Verified -= EventHandler.PlayerVerified;
// EventHandler를 해제하세요
EventHandler = null;
}
```

그리고 EventHandlers 클래스에서는:

```csharp
public class EventHandlers
{
public void PlayerVerified(VerifiedEventArgs ev)
{

}
}
```

이제 (플레이어가 서버에 들어오고 나서 인증 후 호출되는) Verified 이벤트가 호출될 때 우리의 코드를 실행할 수 있습니다! 모든 이벤트는 각각의 이벤트 인수가 있고, 각각의 인수는 각각 다른 속성이 있다는 것에 주의하세요. (VerifiedEventArgs 안에는 접속한 플레이어가 담겨있는 것에 반해, HurtingEventArgs 같은 다른 인수는 공격자, 피해자, 데미지 양 등 다른 속성이 있습니다.)

Exiled는 플레이어에게 자막을 띄울 수 있는 함수가 미리 준비되어 있으므로 사용해 봅시다:

```csharp
public class EventHandlers
{
public void PlayerVerified(VerifiedEventArgs ev)
{
// 자막(또는 힌트)은 유니티 TextMeshPro의 리치 텍스트를 사용할 수 있습니다
// 자세한 내용은 https://docs.unity3d.com/Packages/com.unity.textmeshpro@4.0/manual/RichText.html (영문)을 참고하세요
ev.Player.Broadcast(5, "<color=lime>제 멋진 서버에 온 것을 환영해요!</color>");
}
}
```

위에서 설명했듯이, 모든 이벤드는 각각 다른 인수가 있습니다. 아래 코드는 NTF 진영에 한해 테슬라 작동을 중지시키는 코드입니다.

`MainClass.cs`
```csharp
using Player = Exiled.Events.Handlers.Player;

public EventHandlers EventHandler;

public override OnEnable()
{
EventHandler = new EventHandlers();
Player.TriggeringTesla += EventHandler.TriggeringTesla;
}

public override OnDisable()
{

Player.TriggeringTesla -= EventHandler.TriggeringTesla;
EventHandler = null;
}
```

`EventHandlers.cs`
```csharp
public class EventHandlers
{
public void TriggeringTesla(TriggeringTeslaEventArgs ev)
{
// 만약 플레이어의 팀이 Mtf 진영이라면
if (ev.Player.Role.Side == Side.Mtf) {
// 테슬라 트리거를 비활성화 합니다.
ev.IsTriggerable = false;
}
}
}
```


### 설정
Exiled 플러그인의 대부분은 설정이 포함되어 있다는 것입니다. 설정으로 서버 유지관리자가 플러그인을 입맛에 맞게 (물론 플러그인 개발자가 제공하는 부분에 한하여) 바꿀 수 있습니다.

일단 `Config` 클래스를 만들고, 메인 플러그인 클래의 상속을 `Plugin<>`에서 `Plugin<Config>` 로 바꾸세요.

이제 `Config` 클래스가 `IConfig`으로부터 상속받아야 합니다. `IConfig`을 상속하고 난 후, `IsEnabled`와 `Debug` 2개의 속성을 클래스 안에 추가하세요. 당신의 설정 클래스는 이제 이렇게 보여야 합니다:

```csharp
public class Config : IConfig
{
public bool IsEnabled { get; set; }
public bool Debug { get; set; }
}
```

설정 옵션을 설정 클래스 안에 넣고 다음과 같이 불러올 수 있습니다:

`Config.cs`
```csharp
public class Config : IConfig
{
public bool IsEnabled { get; set; }
public bool Debug { get; set; }

// 개발자가 추가한 설정값
public string TextThatINeed { get; set; } = "this is the default";
}
```

`MainClass.cs`
```csharp
public override OnEnabled()
{
// 불러온 설정 출력
Log.Info(Config.TextThatINeed);
}
```

이제 축하합니다! 첫 Exiled 플러그인을 만드셨군요! 아, 그리고 모든 플러그인은 **무조건** IsEnabled 옵션이 있어야 한다는 것을 꼭 기억하세요. 이 옵션은 서버 유지관리자가 플러그인을 상황에 맞게 활성화하거나 비활성화 할 수 있게 할 때 꼭 필요합니다. IsEnabled 옵션은 Exiled를 불러올 때 로더가 읽을 것입니다 (`IsEnabled == true` 등 IsEnabled가 참인지 조건을 확인하지 않아도 됩니다).

### 다음으론?
더 많은 정보를 얻고 싶으시다면 [디스코드](https://discord.gg/PyUkWTg)에 가입해보세요!

#resources 채널에 들어가 유용한 정보들을 찾을 수 있으며, 여러분의 플러그인 개발을 기꺼이 도와줄 Exiled 기여자분들 또는 플러그인 개발자분들이 준비되어 있습니다.

...아니면 현재 존재하는 이벤트를 모두 읽고 싶으시다면 [여기](https://github.com/galaxy119/EXILED/tree/master/Exiled.Events/EventArgs)를 클릭해주세요!
3 changes: 2 additions & 1 deletion Localization/README-KR.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ public IEnumerator<float> MyCoroutine()
}
```

MEC과 익숙치 않거나, 더 배우고 싶거나, 조언을 좀 받고 싶고나, 도움이 필요하다면 구글링을 좀 하거나 디스코드에서 물어보는 것이 **_매우_** 추천됩니다. 질문들은 얼마나 '수준 낮은지' 와 상관없이, 플러그인 개발자분들에게 추진력을 실어주기 위해 항상 최대한 호의적이고 깔끔하게 답변될 것입니다. 더 좋은 코드는 모두에게 좋은 것이니까요!
MEC과 익숙치 않거나, 더 배우고 싶거나, 조언을 좀 받고 싶나, 도움이 필요하다면 구글링을 좀 하거나 디스코드에서 물어보는 것이 **_매우_** 추천됩니다. 질문들은 얼마나 '수준 낮은지' 와 상관없이, 플러그인 개발자분들에게 추진력을 실어주기 위해 항상 최대한 호의적이고 깔끔하게 답변될 것입니다. 더 좋은 코드는 모두에게 좋은 것이니까요!

### 동적 리로드

Expand Down Expand Up @@ -176,3 +176,4 @@ _새로운_ 어셈블리들이라는 것에 주목해주세요. 만약 똑같은

모든 플러그인이 동적 리로딩을 지원하지 않아도 됩니다. 만약 동적 리로딩을 지원하지 않기로 생각했다면, 진짜 괜찮아요. :)
플러그인의 어셈블리 버전을 바꾸는 것을 피하시고, 서버 주인분들에게 플러그인을 업데이트하기 위해 서버를 재시작하라고 요청하세요.

Loading