[뒤끝팁] 닉네임부터 길드 이름까지! 비속어 필터링 SDK - 뒤끝 블로그
오늘은 새롭게 추가된 뒤끝 비속어 필터링 SDK를 소개합니다. 비속어 필터링 SDK는 유저가 입력하는 모든 콘텐츠를 필터링할 수 있는 기능인데요! 지금부터 활용처부터 간단 사용 방법까지 함께
blog.thebackend.io
게임 서버 관리 시스템 "뒤끝"에서 제공하는 뒤끝 비속어 필터링 SDK를 활용하여 닉네임 비속어 필터링 기능을 구현했다.
TheBackend > ToolKit > InvalidFilter > Resources 폴더에 존재하는 InvalidString 파일에 필터링 되어야 할 비속어들이 9000라인이 넘게 저장되어 있다.
비속어 필터링을 사용한 닉네임 입력 기능 구조를 아래와 같이 잡아보았다.
닉네임을 입력받을 Input Field는 아래와 같이 배치했다.
10글자까지 입력 받은 닉네임은 InputField에서 플레이어의 Enter 버튼 입력을 받아 NickNameInputController로 전달되고, BadWordFilter 에서 비속어 검사를 수행한다.
비속어가 포함되지 않았을 경우, 플레이어 상태 창의 닉네임에 입력 값이 반영된다.
1. BadWordFilter |
뒤끝의 비속어 필터링 SDK를 사용하기 위해, TheBackend.ToolKit.InvalidFilter 네임 스페이스에 존재하는 FilterManager를 생성한다.
이후 SDK 초기화 여부를 확인하고, SDK에서 제공하는 IsFilteredString 함수를 사용하여 비속어 여부를 확인한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TheBackend;
using System.Runtime.InteropServices.WindowsRuntime;
public class BadWordFilter : MonoBehaviour
{
//뒤끝 developer의 비속어 필터링 sdk를 사용한 비속어 필터링 클래스
private TheBackend.ToolKit.InvalidFilter.FilterManager filterManager = new TheBackend.ToolKit.InvalidFilter.FilterManager();
private bool isInitialized = false;//sdk 초기화 상태 확인 플래그
void Start()
{
isInitialized = Init();
}
private bool Init()
{
// 비속어 필터링 SDK 초기화
if (filterManager.LoadInvalidString())
{
Debug.Log("성공했습니다.");
return true;
}
else
{
Debug.LogError("실패했습니다.");
return false;
}
}
public bool FilterFunc(string text)
{
if(filterManager.IsFilteredString(text))//비속어가 포함된 경우 true를 전달
{
Debug.Log("비속어가 포함된 닉네임입니다.");
return true;
}
else//비속어 필터링에 걸리지 않으면 false를 전달
{
Debug.Log("닉네임 사용이 가능합니다.");
return false;
}
}
public bool IsInitialized()//닉네임 인풋 컨트롤러에서 sdk초기화 여부 체크에 사용
{
return isInitialized;
}
}
2. NicknameInputController |
유저가 Input Field에 닉네임을 입력하고 Enter를 누르면 이벤트가 실행되도록 TMP_InputField 의 onSubmit 에 이벤트 리스너를 등록한다.
입력한 닉네임(string)을 BadWordFilter의 FilterFunt로 넘겨주어 비속어 체크를 수행한다.
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class NicknameInputController : MonoBehaviour
{
//닉네임을 입력 받으면 비속어 체크를 거쳐서 characterName을 업데이트 시키는 클래스
[SerializeField] TMP_InputField inputNickname;//인풋필드
[SerializeField] TextMeshProUGUI characterName;//background 캔버스에 위치한 캐릭터 이름 텍스트
[SerializeField] TextMeshProUGUI alertText;// 비속어 여부에 따라 경고 or 허용을 나타내는 텍스트
[SerializeField] GameObject selectWindowPanel;//닉네임 입력 종료 시 기존 패널들 비활성화 후 인게임 화면으로.
[SerializeField] private BadWordFilter badWordFilter;
[SerializeField] private InputFieldSetting inputFieldSetting;
void Start()
{
Init();
inputNickname.onSubmit.AddListener(OnNicknameSubmit);//인풋 필드에서 Enter 키 입력 시 비속어 체크 이벤트를 시작
}
private void Init()
{
if(badWordFilter==null)//badwordfilter컴포넌트 유무 체크
{
badWordFilter = gameObject.GetComponent<BadWordFilter>();
}
if(!badWordFilter.IsInitialized())//SDK 초기화 유무 체크
{
Debug.LogError("비속어 필터링 SDK가 초기화되지 않았습니다. 확인이 필요합니다.");
return;
}
}
private void OnNicknameSubmit(string text)//닉네임의 비속어 여부에 따라 submit할 것인지 결정. 인풋 필드에서 입력받은 inputNickname.text를 인자로 받는다.
{
if(IsBadWord(text))//비속어일 경우(isbadword=true)
{
ShowMessage("비속어는 사용할 수 없습니다.");//경고출력
ReActiveInputField();//인풋 필드 초기화. 다시 작성
}
else
{
ShowMessage("사용 가능한 닉네임 입니다.");
UpdateCharacterName(text);
GoToInGame();
}
}
private bool IsBadWord(string text)//닉네임의 비속어 여부를 확인
{
return badWordFilter.FilterFunc(text);//뒤끝 sdk의 비속어 필터 기능을 사용하여 비속어 여부를 확인한다. FilterFunc에서 비속어가 걸리면 true, 비속어가 없으면 false가 전달된다.
}
private void UpdateCharacterName(string text)
{
inputFieldSetting.UpdateFontSizeAndText(text);//캐릭터 이름을 인풋필드에 작성된 이름으로 업데이트
}
private void ShowMessage(string alertMessage)//비속어가 발견여부 메세지 출력
{
alertText.text = alertMessage;
}
private void GoToInGame()
{
selectWindowPanel.SetActive(false);
}
private void ReActiveInputField()
{
inputNickname.text = "";// 인풋 필드 텍스트 초기화
inputNickname.ActivateInputField();//인풋 필드 다시 활성화
}
}
3. InputFieldSetting |
입력받은 닉네임의 길이에 따라 동적으로 글자 크기를 조절하도록 했다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class InputFieldSetting : MonoBehaviour
{
//닉네임 입력창 셋팅 - 한글, 영문, 숫자 포함 최대 10글자이며, onValueChanged이벤트를 활용하여 입력된 문자 수에 따라 글자 크기와 캐릭터 리미트를 동적으로 조절하도록 함.
[SerializeField] TextMeshProUGUI characterNameText;//입력필드에서의 텍스트가 반영될 사용자 창의 닉네임 텍스트
[SerializeField] private TMP_InputField inputNickname;//닉네임을 입력받을 입력필드
private const int MaxCharacterLimit = 10;
private const float FontSizeLarge = 34.7f;
private const float FontSizeSmall = 30.0f;
void Start()
{
inputNickname.characterLimit = MaxCharacterLimit;//문자수 제한 : 10
inputNickname.onValueChanged.AddListener(UpdateFontSizeAndText);
}
public void UpdateFontSizeAndText(string text)//문자 수에 따라 글자 크기, 제한을 동적으로 조절한다.
{
int length = text.Length;
if(length <=8)//문자 수가 8글자 이내이면 표시되는 크기를 크게
{
characterNameText.fontSize = FontSizeLarge;
}
else if(length<=MaxCharacterLimit)//글자 수가 10글자까지 가면 표시되는 크기를 크게
{
characterNameText.fontSize = FontSizeSmall;
}
characterNameText.text = text;//최종 반영하여 넘긴다.
}
}
4. 결과 |
의도한 대로 비속어 필터링이 잘 구현 되었다.
콘솔창에서도 오류 없이 잘 작동함을 확인할 수 있다.
뒤끝이라는 사이트를 알고만 있었지 실제로 기능을 활용해본 건 처음인데, Unity 연동을 지원하고, 무엇보다 한글로 설명되어있는 점이 너무 마음에 들었다.
비속어 필터링같은 기능 뿐 만 아니라 서버, DB, 구매 등 백엔드 관련 기능에 이렇게 쉽게 접근할 수 있다는 점은 인디게임 개발자에게 엄청난 메리트일 것이다.