Localization 추가
Package Manager를 이용하여 Localization 패키지 추가하였습니다.
Project Settings에서 Localization을 아래와 같이 설정하였습니다.
- 영어 로캐일(Locale), 한국어 로캐일 등록(영어, 한국어 지원)
- System String Table을 추가하여 기본 문자열 테이블로 등록
- System String Table에 앱 이름을 영어와 한국어로 입력한 후 메타 데이터에 등록
게임에서 사용되는 텍스트들은 따로 관리하기 위해 Game String Table을 추가하였습니다.
유니티에서 제공하는 텍스트 테이블 관리툴은 텍스트가 많아질 수록 관리하기 불편했기 때문에 csv 파일을 연동할 수 있도록 설정하였습니다.
Game String Table.csv 파일을 추가하여 Game String Table과 연결하였습니다.
System String Table은 텍스트를 많이 추가하지 않을 계획이기 때문에 csv 파일을 추가하지 않았습니다.
Game String Table.csv 파일에 텍스트를 입력하였습니다.
한번 실행하면 내용이 변경되지 않는 텍스트들은 Localize String Event 스크립트를 연결하여 다국어 처리를 하도록 구현하였습니다.
템플릿 연동
템플릿에도 Game String Table에 등록된 텍스트의 불러올 수 있도록 구현하는 작업을 시작하였습니다.
Game String Table.csv 파일에 자동차 이름, 손님 대사를 추가하였습니다.
Template(Dev).xlsx 파일의 Car, Talk 시트에 Game String Table의 이름과 각각의 키 값을 추가한 후 Car, Talk 템플릿을 DB에 등록하였습니다.
이전에 추가했었던 LocalizationTemplate을 이용하여 다국어 처리된 텍스트를 불러올 수 있도록 수정하였습니다.
public class LocalizationTemplate
{
[JsonIgnore]
LocalizedString localizedString;
public string Table { get; set; }
public string Key { get; set; }
public string GetLocalizedString()
{
if (localizedString == null)
localizedString = new LocalizedString(Table, Key);
return localizedString.GetLocalizedString();
}
public string GetLocalizedString(params object[] arguments)
{
if (localizedString == null)
localizedString = new LocalizedString(Table, Key);
return localizedString.GetLocalizedString(arguments);
}
}
TalkViewUI 스크립트에서 다국어 처리된 대사를 출력하도록 수정하였습니다.
public void Show(int customerIndex, int talkIndex)
{
var templateService = ClientManager.Instance.TemplateService;
var talk = templateService.Talks[talkIndex];
if (talk.Type == TalkType.Call)
SoundManager.Instance.PlaySfx(callSfx);
customerIconImage.sprite = templateService.Customers[customerIndex].Icon;
talkContentText.text = talk.Content.GetLocalizedString();
gameObject.SetActive(true);
}
RewardPopupViewUI 보상으로 받은 자동차의 이름을 출력하도록 수정하였습니다.
돈을 보상으로 받았을 때 메시지와 자동차를 보상으로 받았을 때 메시지를 미리 등록할 수 있도록 구현하였습니다.
public void Show(string carId, bool newCar)
{
coinImage.gameObject.SetActive(false);
carImage.gameObject.SetActive(true);
carManager.Select(carId);
var car = ClientManager.Instance.UserService.User.Cars.Find(e => e.Id == carId);
var carName = car.Name.GetLocalizedString();
if (newCar)
contentText.text = contentForCar.GetLocalizedString(carName);
else
contentText.text = contentForCarCost.GetLocalizedString(carName, car.Cost);
gameObject.SetActive(true);
}
언어변경 구현
설정창 UI에 언어 선택을 할 때 이용할 드롭다운을 추가하였습니다.
SettingViewUI 스크립트에서 로캐일을 선택을 할 수 있도록 구현하였습니다.
드롭다운을 이용하여 로캐일을 선택하면 선택된 로캐일의 인덱스값을 PlayerPrebs로 저장하도록 구현하였습니다.
void Start()
{
bgmToggle.ValueChangedEvent += (sender, value) =>
{
SoundManager.Instance.BgmVolume = value ? SoundManager.maxVolume : SoundManager.minVolume;
};
sfxToggle.ValueChangedEvent += (sender, value) =>
{
SoundManager.Instance.SfxVolume = value ? SoundManager.maxVolume : SoundManager.minVolume;
};
languageDropdown.ClearOptions();
languageDropdown.AddOptions(
LocalizationSettings.AvailableLocales.Locales.Select(
l => l.Identifier.CultureInfo.NativeName
).ToList()
);
languageDropdown.value = LocalizationSettings
.AvailableLocales
.Locales
.IndexOf(LocalizationSettings.SelectedLocale);
languageDropdown.onValueChanged.AddListener(value =>
{
var locale = LocalizationSettings.AvailableLocales.Locales[value];
if (LocalizationSettings.SelectedLocale == locale)
return;
LocalizationSettings.SelectedLocale = locale;
PlayerPrefs.SetInt("SelctedLocale", value);
});
logoutButton.onClick.AddListener(() =>
{
ClientManager.Instance.AuthService.Logout();
GameUI.Instance.HideAll();
SceneManager.LoadScene(0);
});
closeButton.onClick.AddListener(() =>
{
gameObject.SetActive(false);
});
}
이전에 영어로 변경한 후 게임을 재시작하면 모든 텍스트가 영어로 출력되도록 하는 기능을 LoginLogic 스크립트에 추가하였습니다.
SettingViewUI에서 PlayerPrebs를 이용하여 저장했던 인덱스 값을 불러와 로캐일을 선택하도록 구현하였습니다.
IEnumerator Start()
{
if (GameUI.Instance != null)
GameUI.Instance.HideAll();
SoundManager.CreateInstance();
SoundManager.Instance.StopBgm();
ClientManager.CreateInstance();
yield return LocalizationSettings.InitializationOperation;
SelectLocale();
Loading();
}
void SelectLocale()
{
var index = PlayerPrefs.GetInt("SelctedLocale", -1);
var locales = LocalizationSettings.AvailableLocales.Locales;
if (index < 0 || index >= locales.Count)
return;
LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[index];
}
다음에는 Azure에 서버를 등록하고, MongoDB Atlas로 DB를 만든 후, 게임을 빌드하는 과정을 정리한 후 프로젝트를 마무리하도록 하겠습니다.
구현 결과
깃 허브 저장소 : taxi-game-3d-unity
'개발노트 > Taxi Game 3D' 카테고리의 다른 글
Devlog) Taxi Game 3D) 26) 게임 빌드, 버그 수정 (0) | 2024.02.23 |
---|---|
Devlog) Taxi Game 3D) 25) 서버 게시, 게임 빌드 (0) | 2024.02.20 |
Devlog) Taxi Game 3D) 23) 이펙트 추가 (0) | 2024.02.14 |
Devlog) Taxi Game 3D) 22) 사운드 구현 (0) | 2024.02.08 |
Devlog) Taxi Game 3D) 21) 자동차 목록창 수정, 보상획득창 구현 (0) | 2024.02.02 |