2024-04-15 TIL

이재형·2024년 4월 15일
0

요구 사항 정리

1. 타이머 시간이 촉발 할 때 경고 기능 (시간 깜빡임, 배경음악 변경)

● 시간Text 깜빡이게 구현

void Start()
    {
        Time.timeScale = 1f;
        StartCoroutine("TextChange"); // 시작 시 TextChange 코루틴 시작
    }
    
    
 IEnumerator TextChange()
    {
    	// 15초 딜레이를 부여
        yield return new WaitForSeconds(15.0f);
        // 글씨(하양 => 빨강 / 빨강 => 하양)으로 계속 변경
        while (true)
        {
            TimeTxt.color = new Color(255, 0, 0);
            yield return new WaitForSeconds(0.5f);
            TimeTxt.color = new Color(255, 255, 255);
            yield return new WaitForSeconds(0.5f);
        }
    }   

게임 시작시 코루틴을 사용하여 TextChange를 실행 시킨 다음 코루틴의 yield를 사용하여 15.0f초 동안 딜레이를 주고 while의 무한을 사용하여 TimeTxt의 색을 빨강, 하양으로 0.5초마다 변경하게 함

● 15초 후 배경음악 변경

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance;    

    public AudioClip[] clip;
    public AudioSource audioSource;
    private bool soundCheck = true;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            audioSource = GetComponent<AudioSource>();
            // 게임 시작 시 사운드
            instance.audioSource.clip = clip[0];
            instance.audioSource.Play();
            //씬을 이동할때 해당 오브젝트를 파괴하지 않고 그대로 씬을 넘어가는 코드
            DontDestroyOnLoad(gameObject);          
        }
        else
        {
        	//싱글톤이 2개가 존재할때 instance가 이미 있으므로 나머지를 파괴하여 하나만 존재케하는 코드
            Destroy(gameObject);                    
        }
    }

    private void Update()
    {
        // 게임매니저의 instance가 존재하고 soundCheck가 true일 경우
        if(Gamemanager.instance?.time > 15.0f && soundCheck)
        {
            // 빠른 사운드로 AudioClip변경
            instance.audioSource.clip = clip[1];

            // AudioClip 변경 후 재생
            instance.audioSource.Play();
            soundCheck = false;
        }
    }

게임 시작 시 사운드 클립의 0번째의 사운드를 시작하게 Gamemanger.instance의 null처리를 확인 한 후에 soundChek으로 1번만 실행하게 처리하고 클립의 1번째 사운드로 변경 후 사운드 출력하게 함

2. 현재 스테이지(또는 난이도)에 따라 카드 배열 증가시켜보기

// 게임 재시작, 시작할 때 씬 이동
    public void ReStart()
    {
        SceneManager.LoadScene("MainScene");
    }

    // 1스테이지
    public void Stage1()
    {
    	// StageCard의 int형 변수에 6을 저장
        PlayerPrefs.SetInt("StageCard", 6);
        ReStart();
    }

    // 2스테이지
    public void Stage2()
    {
        PlayerPrefs.SetInt("StageCard", 8);
        ReStart();
    }

    // 3스테이지
    public void Stage3()
    {
        PlayerPrefs.SetInt("StageCard", 10);
        ReStart();
    }

위의 함수들 각 버튼으로 적용 후 사진

public class Board : MonoBehaviour
{
    public GameObject card;

    void Start()
    {
    	// 저장했던 StageCard의 값을 매개변수로 CardSetting실행
        CardSetting(PlayerPrefs.GetInt("StageCard"));
    }

    private void CardSetting(int cardCount)
    {
    	// int형 List arr를 선언 후 cardCount만큼 List에 저장
        List<int> arr = new List<int>();
        for (int i = 0; i < cardCount; i++)
        {
            arr.Add(i);
            arr.Add(i);
        }
        // arr의 값을 랜덤으로 섞어서 배치
        arr = arr.OrderBy(x => Random.Range(0f, cardCount-1)).ToList(); //Linq를 사용한곳

	}

버튼마다 PlayerPrefs를 이용하여 버튼을 눌러 매개변수의 값을 변경시켜 리스트의 개수를 다르게 함

3. 카드 오브젝트 개수 늘리기

// List인 arr의 개수만큼 카드 오브젝트를 반복 생성
for (int i = 0; i < arr.Count; i++)
        {
            GameObject go = Instantiate(card, this.transform);

            float x = (i % 4) * 1.4f - 2.1f;
            float y;

            // 난이도(카드 수)에 따라서 생성되는 카드 위치 변경
            if (cardCount == 6)
            {
                y = (i / 4) * 1.4f - 1.8f;
            }
            else if (cardCount == 8)
            {
                y = (i / 4) * 1.4f - 3.0f;
            }
            else 
            {
                y = (i / 4) * 1.4f - 3.8f;
            }

            go.transform.position = new Vector2(x, y);
            go.GetComponent<Card>().Setting(arr[i]);
        }
        Gamemanager.instance.CardCount = arr.Count;
    }

리스트의 개수만큼 Instantiate를 이용하여 카드의 개수를 증가시키고 위치를 카드의 개수에 따라서 다르게 함

변경 된 카드 개수 사진

난이도1

난이도2

난이도3

오늘의 주요 코드 정리

// StageCard라는 int형 변수에 number의 값을 저장
PlayerPrefs.SetInt("StageCard", number);

// int형 변수인 StageCard의 값을 가져옴
PlayerPrefs.GetInt("StageCard");

// 조건으로서 Gamemanager.instance가 Null인지 여부 확인 후
// Null이 아닐 때 time의 변수 값을 15.0f와 비교
Gamemanager.instance?.time > 15.0f
profile
한국사람

0개의 댓글