본문 바로가기
프로그래밍/유니티

[Unity UGUI] InputField 인풋 필드 + α (플레이어 이름 입력)

by 김시루시루르 2021. 12. 6.

이번에도 이 프로젝트에 썼던 것.

플레이어가 이름을 입력하고 입력 정보를 기억해서 결과창에 써먹는 식이었습니다.

직전에 쓴 랭킹 글과 같이 보면 좋을지도! 왜냐하면 지금 쓰는 글 이후에 아래의 기능이 이어지거든요.

 

[유니티 C#] PlayerPrefs로 기기에 저장되는 랭킹 만들기

학교다닐때 과제로 냈던 프로젝트에 썼던 코드 얼렁뚱땅 PalyerPrefs로만 구현했습니다. 오직! 플레이어프립스로만! 플레이어프립스 특징 상, 기기에 저장되는 랭킹입니다. 그때 이걸 만들면서 이

drybone-developer.tistory.com


1. 인풋필드

저는 대충 아케이드 게임 종료 후 플레이어 기록하기 용도로 썼습니다.

물론 그것 외에도 플레이어의 임의 문자열 입력이 필요한 곳에 인풋필드를 쓸 수 있겠죠.

게임오브젝트 항목에서 UI → Input Field로 만들 수 있습니다.

TMP를 쓸거냐 말거냐에 따라 선택도 가능하다!


2. 인풋필드 구성

의외로 간단합니다!

왜 간단하느냐

정말로 입력값을 보여주는 것 외의 기능은 포함되지 않기 때문

패키지와 DLC의 느낌? (?)

 

어쨌든 텍스트 두 개를 가진 InputField 오브젝트로는 인풋필드의 크기를 조절할 수 있습니다.

그 아래에 있는 Placeholder와 Text는 각각 텍스트 UI인데,

Placeholder는 아무것도 입력하지 않았을 때 뭐라고 표시할건가? 입니다. 기본값인 셈이랄까...

그리고 Text는 플레이어가 입력하는 텍스트를 보여주는 오브젝트입니다.

 

늘 보던 이런 식의 것이 Placeholder

Placeholder도 일반 텍스트와 똑같은 텍스트 컴포넌트를 갖고 있으므로, 입맛에 맞게 꾸밀 수 있습니다.

(이건 그 아래에 있는 Text 오브젝트도 마찬가지라서, 플레이어가 입력할 텍스트의 속성을 정할 수 있습니다.)

다만 오른쪽과 같으면 UI적으로 뭔가.. 이게 뭔가 싶긴 하겠죠?

 

필수 요소는 아니므로 삭제해도 큰일이 나거나 하진 않습니다.

혹시 모를 참조 에러를 막기 위해서는 상위 오브젝트인 InputField의 인풋필드 컴포넌트에서

Placeholder 값을 지워서 None으로 바꿔주시면 됩니다.


α. 플레이어 이름을 입력하고 저장할 때

저는 이 게임 플레이어의 랭킹을 남기기 위해 플레이어 이름을 입력받을 필요가 있었는데

인풋필드만으로는..? 그저 입력밖에 할 수 없었습니다. 디자인도 비어있고 (...)

그래서 이것저것 덧붙여서 아래와 같은 구성이 되었습니다.

창 배경이 되는 이미지를 넣고, 입력 완료 버튼을 넣었습니다.

입력 버튼을 누르면 최종 랭킹을 계산해서 씬을 넘기는 함수를 실행했고요 (바로 이 글)

 

이 때 플레이어가 키보드로 이름을 입력한 뒤 마우스로 다시 손을 올려야만 하는..! 그게 싫어서

키보드로의 버튼 입력과 마우스로 입력 버튼을 누르는 것을 전부 할 수 있는 스크립트를 작성했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using UnityEngine;
using UnityEngine.UI;
 
public class ResultNameInput : MonoBehaviour
{
    public InputField playerNameInput;
    private string playerName = null;
 
    private void Awake()
    {
        playerName = playerNameInput.GetComponent<InputField>().text;
    }
 
    private void Update()
    {
        //키보드
        if (playerName.Length > 0 && Input.GetKeyDown(KeyCode.Return))
        {
            InputName();
        }
    }
 
    //마우스
    public void InputName()
    {
        playerName = playerNameInput.text;
        PlayerPrefs.SetString("CurrentPlayerName", playerName);
        GameManager.instance.ScoreSet(GameManager.instance.score, playerName);
    }
}
cs

GameManager.instance.ScoreSet을 참조하는 부분이 랭킹 계산 + 결과창으로 가는 것입니다.

 

24번째줄에서 시작되는 게 플레이어가 입력을 마쳤을 때의 실행이고

Update문에서는 플레이어가 엔터를 눌렀을 때 기준으로 입력을 마쳤나 안 마쳤나 확인하고 있습니다.

인풋필드에서 플레이어가 텍스트를 입력하는 부분에

이름(으로 추정되는)을 한 글자 이상 입력 + 엔터 입력으로 다 입력했군! 이라 판단하는거죠.

 

입력이 아무것도 안 됐으면 실행이 안 됩니다.

이 때도 실행이 되게 하고 싶다면

Length가 0일때 플레이어 이름을 뭐라 할지?를 주는 코드가 또 있어야 할 것 같아요

공백으로 두면.. 슬프잖아...

 

그리고 마우스 입력 함수는 그대로 UI에 연결해서 쓸 수 있습니다. (public으로 만들었으니깐)

댓글