using System.Collections;
using UnityEngine;
public class NumberSystemTest : MonoBehaviour
{
private OrderManager theOrder;
private NumberSystem theNumber;
public bool flag;
public int correctNumber;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
theOrder = FindAnyObjectByType<OrderManager>();
theNumber = FindAnyObjectByType<NumberSystem>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.U))//R키 입력으로 실행
StartCoroutine(ACoroutine());
}
IEnumerator ACoroutine()
{
flag = true;
theOrder.NotMove();//오더 메니져의 이동 정지
theNumber.ShowNumber(correctNumber);
yield return new WaitUntil(()=>!theNumber.activated);//초이싱이 false일 경우에만
theOrder.Move();//오더 메니져의 이동활성화
}
}
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using System.Collections;
public class NumberSystem : MonoBehaviour
{
private AudioManager theAudio; //사운드 불러오기
public string key_sound; //방향키 사운드
public string enter_sound; //결정키 사운드
public string cancel_sound; //오답 & 취소키 사운드
public string correct_sound; // 정답 사운드
private int count; //어느 숫자 대 사운드인지
private int selectedTextBox; //선택된 자리수, 1000 -> 3, 100 -> 2
private int result; //플레이어가 도출해낸 값
private int correctNumber; //정답
private string tempNumber; //끝 번호부터 넣을 수 있게 넣은 변수
public GameObject superObject; //숫자 갯수에 따라 가운대 정렬
public GameObject[] panel;
public TMP_Text[] Number_Text;
public Animator anim;
public bool activated; //return new waitUntil 코루틴 대기
private bool keyInput; //키 처리 활성화 비활성화
private bool correctFlag; //정답인지 아닌지 여부
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
theAudio = FindAnyObjectByType<AudioManager>();
}
public void ShowNumber(int _correctNumber)
{
correctNumber = _correctNumber;
activated = true;
correctFlag = false;
string temp = correctNumber.ToString();// "143451"을 문자열로 이유=>length를 문자열로
for(int i =0; i < temp.Length; i++)//배열은 0부터 시작한다 따라서 <=이 아니다
{
count = i;
panel[i].SetActive(true);
Number_Text[i].text = "0";
}
superObject.transform.position = new Vector3(superObject.transform.position.x + (37 * count), superObject.transform.position.y, superObject.transform.position.z);
//숫자 개수에 따라 넘버패널이 게임플레이 화면 가운대에 보이게 함
selectedTextBox = 0;
SetColor();
result = 0;
anim.SetBool("Appear", true);
keyInput = true;
}
public bool GetResult()
{
return correctFlag;
}
public void SetNumber(string _arrow)
{
int temp = int.Parse(Number_Text[selectedTextBox].text);//선택된 자리수의 텍스트를 Integer숫자 형식으로 강제변환
if(_arrow == "DOWN")
{
if (temp == 0)
temp = 9;
else
temp--;
}
else if(_arrow == "UP")
{
if (temp == 9)
temp = 0;
else
temp++;
}
Number_Text[selectedTextBox].text = temp.ToString();
}
public void SetColor()
{
Color color = Number_Text[0].color;
color.a = 0.3f;
for(int i =0; i <= count; i++)
{
Number_Text[i].color = color;
}
color.a = 1f;
Number_Text[selectedTextBox].color = color;
}
// Update is called once per frame
void Update()
{
if (keyInput)
{
if (Input.GetKeyDown(KeyCode.DownArrow))
{
theAudio.Play(key_sound);
SetNumber("DOWN");
}
else if(Input.GetKeyDown(KeyCode.UpArrow))
{
theAudio.Play(key_sound);
SetNumber("UP");
}
else if (Input.GetKeyDown(KeyCode.LeftArrow))
{
theAudio.Play(key_sound);
if (selectedTextBox < count)
selectedTextBox++;
else
selectedTextBox = 0;
SetColor();
}
else if (Input.GetKeyDown(KeyCode.RightArrow))
{
theAudio.Play(key_sound);
if (selectedTextBox > 0)
selectedTextBox--;
else
selectedTextBox = count;
SetColor();
}
else if (Input.GetKeyDown(KeyCode.Z))//결정키
{
theAudio.Play(key_sound);
keyInput = false;
StartCoroutine(OXCoroutine());
}
else if (Input.GetKeyDown(KeyCode.X))//취소키
{
theAudio.Play(key_sound);
keyInput = false;
StartCoroutine(ExitCoroutine());
}
}
}
IEnumerator OXCoroutine()
{
Color color = Number_Text[0].color;
color.a = 1f;
for(int i = count; i >= 0; i--)
{
Number_Text[i].color = color;
tempNumber += Number_Text[i].text;//끝 번호부터 차근차근 텍스트에 넣는다
}
yield return new WaitForSeconds(1f);
result = int.Parse(tempNumber);
if(result == correctNumber)
{
theAudio.Play(correct_sound);
correctFlag = true;
}
else
{
theAudio.Play(cancel_sound);
correctFlag = false;
}
StartCoroutine(ExitCoroutine());
Debug.Log("우리가 낸 답 = " + result + " 정답 = " + correctNumber);
}
IEnumerator ExitCoroutine()
{
result = 0;
tempNumber = "";
anim.SetBool("Appear", false);
yield return new WaitForSeconds(0.1f);
for (int i = 0; i <= count; i++)
{
panel[i].SetActive(false);
}
superObject.transform.position = new Vector3(superObject.transform.position.x - (50 * count),
superObject.transform.position.y,
superObject.transform.position.z);
activated = false;
}
}
오늘은 자물쇠 시스템에 대해서 공부해보겠다
Hierarchy의 Canvas에 NumberSystem을 만들고 또 그 아래에 SuperObject로 빈객체를 차근차근 만들어주자
그리고 그 아래에 UI > Panel로 패널을 만들어주자
그리고 UI를 찾아서 연결해주자 열결할 이름의 UI는 number_UI이 이다 찾아보기로 찾아서 넣어주자
다음은 그 아래에 TMP로 텍스트를 만들어서 0이라는 숫자를 넣어주자
최종적으로 스샷 안처럼 0짜리 패널이 하나 만들어지면 된다
다음은 숫자처럼 패널을 5개 Ctrl + D 키로 복제해 준다
그리고 아이콘위치는 X를 마이너스 *100 씩 더해줘서 그리고 Y 값은 -100을 입력해주자
이 아이콘 처럼 정열해주자
이해가 안갈 수 있어서 이렇게 표를 올려주었다 판넬을 정열해 주자
다음은 판넬을 구분하기 위해 번호를 붙여준다
다음은 에니매이션을 만들을 차례다
SuperObject를 선택한 상태에서 애니메이션을 만들어 준다
폴더 이름은 NumberSystem으로 만들어주고
애니메이션 Number_Appear로 이름을 지정해주고 만들어보자
애니메이션을 만들때 0프레임에 Scale의 y값을 0으로 만들어주고 10프레임에서 Scale의 y값을 1로 만들어 준다
다음은 반대로 Number_DisAppear에는 0프레임에는 Scale의 y값을 1로해주고 10프레임의 Scale의 y값을 0으로 만들어준다
이제 스크립트를 작성해주자
스크립트 이름은 NumberSystem이다
선언해줄 변수 목록이다 보기 간편하게 주석으로 설명을 넣어주었다
일단 void Start에 오디오를 받아오자
37번줄의 void ShowNumber(int _correctNumber)를 작성하여 초기화해주고 _correctNumber인수를 받아오게하자
39번줄에 correctNumber = _correctNumber;은 받아올 인수를 변수에 선언해준 것이다
40~41번줄은 activate = true로 해주고 correctFlag = false로하여 코루틴 대기용 함수를 true로하고 정답은 미리 false로 관리하자
그뒤 43번째 줄에 string temp = correctNumber.ToString()로 우리가 넣어줄 다이얼번호를 int에서 string 로 만들어준다
44번째줄은 for문 int i = 0이고 i < temp.Length로 i가 temp보다 작다고해주고 i++로 증감해준다
count = i는 판넬 번호용으로 넣은 변수이다
panel[i].SetActive(true)라고 작성하여서 유니티엔진 인스펙터에 판넬을 전부 넣어주고 활성화해준다
Number_Text[i].text = "0";을 작성하여 TMP를 모두 0으로 초기화해준다
51번 줄은 superObject의 위치를 지정해주는 함수이다
new Vector3로 새로 지정해주고 x의 위치를 지정해주는 값을 신경써서 적어주고 나머지는 그대로 지정되게해주자
superObject.transform.position.x + (37 * count)로 기본 위치에 37과 count변수를 곱한 값을 더했다
그럼 실제 실행했을때 위치가 이정도에 오게 된다
53번줄은 변수를 0으로 초기화해주고
54번줄은 함수 SetColor을 실행시켜주고
result = 0;으로 초기화
56번 줄은 anim.SetBool("Appear", true)로 애니메이션을 실행시켜준다
keyInput = true로 키 입력을 활성화해준다
이제 스크롤을 내려서 작성하 부분을 보자
GetResult는 외부에서 값을 받아갈때 사용할 함수이다
다음 void SetNumber(stirng _arrow)로 함수를 만들어주고 string _arrow로 문자열로 값을 참조하게 해주자
67번줄은 선택된 자리수의 텍스트를 Integer숫자 형식으로 강제변환하게 해주는 코드다
69번줄은 if문으로 참조해온 _arrow로 DOWN이 입력됬을때 temp가 0과 같다면 9가 되게해주고 아니라면 temp가 --으로 감소되게 해줍니다
다이얼에서 숫자를 아래쪽으로 돌리는 것을 표현한 코드입니다
76번은 반대로 _arrow인수를 UP로 받아올 경우
if문 temp가 9와 같다면 0으로 만들어주고 아니라면 temp++로 숫자를 증감해주는 코드이다
다이얼에서 숫자를 위로 올리는 효과를 보여주는 것 입니다
83번은 선택된 자리수의 숫자를 변경되게 하는 코드입니다
이제 void SetColor함수를 보겠습니다
88번 줄에 Color color = Number_Text[0].color로 컬러값을 초기화해주고
color.a = 0.3f로 알파값을 살짝 내려줍니다
그리고 90번째 줄에 for문 int i = 0;이고 i <= count;로 i보다 같거나 더 크게 적용해주고 i++로 증감해줍니다
그러면 for문 안의 Number_Text[i].color = color로 선택된 텍스트의 알파값을 변경해줍니다
만약 for문의 Text가 아니라면 color.a =1f로 알파값을 정상으로 만들어주고
Number_Text[selectedTextBox].color = color로 다 적용해줍니다
void Update를 보겠습니다
if문으로 제일번저 keyInput로 조건문을 활성화 true에 작동하게 해 줍니다
103번째 줄과 108번째 if조건문은 소리를 재생하고 위의 SetNumber함수에 인수를 넣어주는 함수입니다
키보드 방향키 아래쪽과 위쪽 입력에 대응합니다
다음 113, 122줄은 왼쪽, 오른쪽 방향키를 입력해서 소리를 나게 한 다음 다이얼의 자리수를 한단계 올려주는 코드입니다
마지막 줄에 SetColor로 색을 변경해주는 코드도 대응하게 해놨습니다
131 줄은 Z키를 눌렀을때 결정키로 작동하게 한 것 입니다
소리를 재생해주고 keyInput를 false로 비활성화해주고
코루틴 OXCoroutine()를 작동되게 해 줍니다
137번째 줄은 취소가 X를 눌렀을때를 지정해주고
소리가 재생되게 해 주고 keyInput를 비활성화
ExitCoroutine()코루틴이 작동되게 해 줍니다
코루틴 OX입니다
Color color = NUmber_Text[0].color
color.a = 1f로 선택된 숫자의 알파값이 정상으로 바뀌게 해줍니다
151번 줄은 int i = count와 같으며 i >=0으로 0보다 같거나 크며 i--로 감소연산자를 넣었습니다
for문 안의 코드는 모든 숫자의 컬러를 위 color변수를 받아넣어 초기화해주고
끝 번호부터 차근차근 숫자를 텍스트 박스에 넣어줍니다
그뒤 yield return new WaitForSeconds(1f)함수로 1초 대기해 줍니다
그뒤 result에 다이얼 번호에 입력한 숫자를 넣어주고
161번에 result(플레이어 입력갑)와 correctNumber(정답)이 같다면
소리를 재생하고 correctFlag를 true로 바꿔서 정답 신호를 보냅니다
166번은 그 외의 경우 정답이 아니라면! 소리를 재생하고 correctFlag = false로 오답신호를 보냅니다
그뒤 코루틴 ExitCoroutine()를 실행하고
Debug.Log에 우리가 넣은 다이얼값과 정답이 출력되게 합니다
마지막 함수입니다
178번부터 181은 초기화를 한뒤 0.1초 대기하게 해 줍니다
그뒤 for문으로 모든 판넬을 선택한 다음 비활성화해주고
186번 줄은 다이얼 오브젝트의 위치를 바꿔줍니다
그뒤 activated = false로 비활성화 해 줍니다
이제 U키를 눌러서 태스트해주는 스크립트를 보겠습니다
설명은 주석으로 처리하였습니다
이제 유니티엔진으로 들어가서 빈 객체를 만들어주고 스크립트 NumberSystemTest를 넣어주고
정답 번호를 넣어줍시다
이렇게 잘 실행된다!
PS
개인적으로 긴장되는 일이 있어서 이번주는 공부를 많이 못했습니다
하지만 일도 해결되었고 공부를 다시 정진하겠습니다!
'쯔꾸르식 유니티 게임 공부' 카테고리의 다른 글
22.텍스트 입력 받기(InputField) (0) | 2025.02.18 |
---|---|
21.문열기와 텍스트 출력 (0) | 2025.02.17 |
19.선택지 분기 (0) | 2025.02.11 |
18.손전등 연출 개량 (0) | 2025.02.09 |
18.손전등 연출 (0) | 2025.02.08 |