오전에 서진이랑 ZEP으로 스터디를 했다. 현재까지 총 4번 진행했다. (4/5, 4/8, 4/14, 4/22)
저번 스터디 이후 한주간 무엇을 공부했는지 설명하고, 오늘 할 공부에 대해 서로 얘기하는 시간을 가진 뒤 2시간 동안 캠 켜놓고 각자 공부했다.
오늘은 스터디를 하는 동안 새로운 씬을 하나 또 만들었다. 플레이어가 새로 만드는 캐릭터의 이름을 묻는 창이다.
근데 생각보다 InputField에 대한 이해도가 부족해서 그런지 좀 해맸다.
그래서 오후에는 InputField에 대한 강좌를 들었다.
<Input Field로 입력받은 값, 버튼으로 확인 누르기>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour {
[SerializeField] private Text txt_Money;
[SerializeField] private InputField inputTxT_Money;
private int currentMoney;
public void Input()
{
currentMoney += int.Parse(inputTxT_Money.text);
/* 이건 제작자가 문자열로 입력받은 값을 숫자로 바꾸기 위해서 형변환 해준거다.
(내 프로젝트에서는 이름 입력받는 거니까 형변환은 필요없음) */
txt_Money.text = currentMoney.ToString();
// 마찬가지로 숫자 연산이 된 후 Input Field에 출력하기 위해 문자로 형변환 해준 것이다.
}
public void Output()
{
currentMoney -= int.Parse(inputTxT_Money.text);
txt_Money.text = currentMoney.ToString();
}
}
캔버스에 만든 스크립트 추가해주면, 인스펙터 창에 스크립트 보면 TxT_Money랑 Input TxT_Money에 각각 Text랑 InputField 하이어라키 창에서 드래그해가지고 저기다 놓는다.
그 다음 입금과 출금 버튼에서 On Click() 함수를 지정해주면 끝.
(https://youtu.be/ZOTZOvRgFmY?si=oz1VIXgH5JdM125F 참조)
<캐릭터 명 입력받기>
스크립트를 만들어준다. (여기서는 스크립트 이름을 InputField라고 했는데 헷갈리지 않으려나.. 했으나 사실 내 프로젝트에서도 이름을 입력받을 일은 게임 상 한 번밖에 없어서 나도 그냥 똑같이 해도 될듯. 입력이 여러번 있을 경우엔 이름을 다르게 지정하는 것이 좋겠다.)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Collections;
public class InputField : MonoBehaviour {
private PlayerManager thePlayer; // 2
public Text text;
void Start () {
thePlayer = FindObjectOfType<PlayerManager>(); // 2
}
void Update () {
if(Input.GetKeyDown(KeyCode.Return))
{
thePlayer.characterName = text.text; // 2
Destroy(this.gameObject); // 텍스트 입력 후 입력 UI가 사라짐
}
}
}
Destroy함수는 자주 호출되면 성능에 좋지 않다. 맵 전환이 이루어질 때는 로딩이 이루어지니까 그나마 좀 상관없는데 게임 도중에는 끊기면 방해되니까..
위에서 했던거랑 마찬가지로 스크립트를 InputField에 갖다놓고, 스크립트에는 입력받은 텍스트가 들어가도록 드래그&드롭으로 넣어주기
그러면 실행 시, 텍스트 입력 후 입력 UI가 사라지는 것을 확인할 수 있다.
(근데 버튼을 누르면 완료되는 식으로 하려고 했는데.. 버튼 추가하고 버튼에다 스크립트가 들어가게 하면 될듯)
주석으로 2 달아놓은 코드는 이후에 추가된 것인데,
이걸 추가하면 입력한 문자열을 가져와 캐릭터의 이름을 변경할 수 있다.
private PlayerManager thePlayer;를 추가하는데 이게 보니까 PlayerManager라는 스크립트가 있던걸로 봐선.. 저게 하나의 클래스가 아닐까 싶음.
(https://youtu.be/0f05-ODhJJI?si=1uHeuQRAgRnWI8Lb 참조)
(유튜버 케이디의 유니티 강좌 파트 22 '텍스트 입력받기'를 참조함. 근데 PlayerManager 부분은 스크립트가 어떤 양식인지 잘 모르겠다는 생각을 함. 이전 강좌 중 플레이어 생성, 그리고 PlayerManager 스크립트 생성하는 부분을 봐야할 것 같았다. 그래서 앞부분 강좌 훑어보다가 찾았다. 파트 10 'NPC 구현하기'에 PlayerManager 부분이 나옴)
공통된 변수 및 함수를 부모 클래스에 만들고, 자식 클래스에 상속하면 효율적.
(전에 캐릭터 만들고 천사와 악마 캐릭터를 만드는 식으로 비유를 들었던 강좌가 생각나는군. 맨 처음 작성했던 TIL에서 클래스 파트를 참고하면 도움이 될 것 같다.)
(근데 내가 만드는 프로젝트는 사실 플레이어가 이동을 한다거나.. npc가 이동을 하는 방식이 아니라서 캐릭터의 클래스를 뭐 상속을 하고 이럴 필요없겠다고 생각을 했는데 생각해보니까 처음에 마름/비만 선택하는 게 있어서 클래스 만들어야겠군..)
아 PlayerManager 스크립트 저렇게 작성하면 알아서 변수 넣는 칸이 인스펙트에 뜨네~ 아하
대충 양식 보고.. 이름, 스텟 정도만 집어넣으면 되지 않을까 싶군.
[Tooltip("내용")] : 툴팁을 작성하면.. 아마.. 인스펙터 창에서 해당 툴팁이 뜸. 마우스를 위에 가져다 놓으면 해당 변수가 어떤 기능을 하는지 알 수 있음.
(오 근데 게임 내에서도 툴팁을 띄울 수 있나? 했는데 링크를 하나 찾아서 참고하면 좋을 듯. 이번에 구현하는 게임에도 넣으면 좋을 것 같기도? 근데 구현하기 좀 복잡해보인다. 링크 : https://ansohxxn.github.io/unity%20lesson%203/ch5-6/ )
(캐릭터 이동은 구현을 안 할거라 좀 대충 들었다. 나중에 다시 들으면 좋을 듯)
플레이어가 아무것도 하지 않고 있을 때도 혼자 움직이는 NPC 를 만드려면 코루틴을 써야한다.
'TIL > 유니티' 카테고리의 다른 글
11. 팝업창 만들기 (0) | 2024.04.29 |
---|---|
10. 유니티_에셋 구입, 텍스트 깜빡이는 효과 구현 (0) | 2024.04.27 |
6. 유니티_캐릭터 선택창 만드는 법 맛보기, 코루틴 (1) | 2024.04.21 |
5. 유니티_메인화면 만들기 (0) | 2024.04.20 |
4. 유니티_오브젝트 이동, UGUI 기초 (1) | 2024.04.19 |