전체적인 모습은 발표 이후 올리겠지만 카드 뒤집기 게임을 응용하여 1주동안 나 포함 5명의 조원들과 미니 프로젝트를 진행하고 있다.
마감은 내일(1/24)까지, 1일을 남기고 거의 마무리 되어가는 중이며 그 중 내가 작성한 부분 중 새롭게 알게된 부분에 대해 정리하려고 한다.
처음에 맡앗던 부분은 카드에 대한 스크립트이며 이것은 세번째 게임에서 작성하였던 코드 기반으로 작성하였기 때문에 패스.
(추후 게시글 작성예정)
게임 클리어를 저장하는 코드
if (cardCount == 0)
{
PlayerPrefs.SetInt("GameCleared", 1);
PlayerPrefs.Save();
카드가 0이되어 게임이 끝나면 게임을 클리어한것으로 기록하며 게임을 종료하더라도 남아있게 기록하는 코드
다만 나는 테스트를 위해 PlayerPrefs.Save(); 는 주석처리 해두고 사용하지 않았는데 게임을 새로 실행해도 계속 클리어 처리로 되어있어 끙끙대다 밑에 기능을 추가하였다.
데이터 초기화를 위한 툴바 생성 (PlayerPrefs.DeleteAll();)

Tool - 데이터초기화 선택 시 모든 데이터가 초기화되는 메뉴를 생성해주었다.
PlayerPrefs.DeleteAll(); 메서드를 사용하였으며 튜터님께 여쭤보다 이러한 방법이 있다고 알려주셔서 사용하게 된 기능인데, 추가적으로 공부하면서 PlayerPrefs클래스에 대해 잘 정리해주신 분이 있어 추가로 공부중이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class PlayerDataTool : MonoBehaviour
{
[MenuItem("Tool/데이터초기화")]
private static void ResetData()
{
PlayerPrefs.DeleteAll();
Debug.Log("데이터가 사라졌습니다.");
}
}
게임 1회 클리어 시 해당(갤러리) 버튼 활성되는 기능 추가


위에 클리어를 저장하는 코드와 데이터 초기화하는 코드는 이 기능을 위한 빌드업이었다.
게임을 1회라도 클리어 해야 열리는 갤러리 버튼,
처음부터 갤러리를 열어보면 재미없을듯 하여 조원분께서 의견주셔서 해볼게요! 하고 추가한 기능
private void Start()
{
galleryButton = GetComponent<Button>();
Setting();
}
public void Setting()
{
if (PlayerPrefs.HasKey("GameCleared") && PlayerPrefs.GetInt("GameCleared") == 1)
{
galleryButton.interactable = true;
}
else
{
galleryButton.interactable = false;
}
원래는 galleryButton.SetActive(true); 로 하여 아얘 사라졌다 생겼다 하는걸로 했었으나 해당 게임 오브젝트(갤러리버튼)의 button컴포넌트의 interactable 활성화 비활성화로 수정하였다.
조장님의 의견으로 비활성화/활성화 할수있게하여 처음부터 없는 기능이 아닌 저 기능은 있으나 바로 볼수없는 식으로 보여주자 라고 하셔서 수정하였는데 전보다 훨씬 깔끔하고 괜찮은듯 하다.
배경음악 추가

게임에 사용하는 씬은 Start, Main(게임), Gallery 총 3씬이며 이중 Main씬에 SoundManager 오브젝트와 스크립트 추가 후 컴포넌트에 Audio Source, 스크립트를 추가하여 배경음악을 넣어줬는데 음악은 유튜브에서 제공해주는 음원을 사용하였다.
배경음이기 때문에 바로 재생해주는 Play On Awake와 음악이 끝났을때 반복 재생해주는 Loop를 체크해주었다.
public static SoundManager instance;
AudioSource audioSource;
SoundManager soundManager;
public AudioClip clip;
private void Awake()
{
// 인스턴스를 등록
if (instance == null)
{
instance = this;
// 씬 전환시에도 게임 오브젝트(배경음) 유지
DontDestroyOnLoad(gameObject);
audioSource = GetComponent<AudioSource>();
}
else
{
// 중복된 오브젝트 제거, 중복 재생 방지
Destroy(gameObject);
}
}
싱글톤 처리를 해줬던 이유는 원래 Start, Main씬만 해당 음원을 배경음악으로 사용하고 Gallery에선 다른 음원을 사용하고 싶었기에 해줬으나 그 작업은 마무리하지 못하였다. (해당 내용은 추후에 다시 작성 예정)
코드는 다른 씬에서도 SoundManager 오브젝트가 파괴되지 않고 잘 재생되기 위해 싱글톤 처리를 하였으며 작성한 코드는 위와 같다.
효과음 추가
추가한 효과음
1. 게임시작 후 카드가 뒤집힐때(클릭했을 때) 효과음
// 게임 오브젝트에 추가된 AudioSource를 참조하기 위한 변수 추가
AudioSource audioSource;
public AudioClip clip;
void Start()
{
// audioSource 변수를 사용하기 위해 컴포넌트 참조
audioSource = GetComponent<AudioSource>();
}
public void OpenCard()
{
// 한번 재생
audioSource.PlayOneShot(clip);
// 기타 타 코드 생략
}
기존에 Card 스크립트의 OpenCard 쪽에 오디오가 재생될 수 있게 코드 한줄을 추가하였으며
PlayOneShot(); 은 한번만 재생하는 메서드로, 효과음에 적합하여 사용하였다.

Card 프리팹 안에 Card 스크립트에 작성된 Clip부분과 추가한 Audio Source의 AudioClip쪽에 coin1이라는 효과음을 넣어주었으며
AudioSource를 추가하여 마찬가지로 coin1을 추가하였다.
두개 다 추가한 이유는 Card프리팹에 AudioSource 컴포넌트를 추가하고, Card스크립트에서 이를 참조하기 때문이다
- AudioSource : 소리를 재생하는 장치 역할
- AduioClip : 재생할 소리 파일
2. 한 쌍의 카드를 맞췄을때 나오는 효과음
public AudioSource audioSource;
public AudioClip clip;
public void MatchCard2()
{
if (firstCard.idx == secondCard.idx)
{
audioSource.PlayOneShot(clip);
}
Card쪽과 마찬가지로 변수 추가하고 PlayOneShot();을 추가해주었으며
한 쌍을 맞췄을때의 로직은 GameManager에 있기 때문에 GameManager 스크립트의 카드가 맞았을때의 MatchCard 함수에 추가해줬다.
(MatchCard2 인 이유는 난이도가 하나 더 있어 세개의 카드를 한쌍으로 묶는 함수(MatchCard3)가 있기 때문이며 해당 함수에도 PlayOneShot();을 동일하게 추가해주었다.)

다만 Card와는 달리 따로 넣을만한 오브젝트가 없어 MatchSound라는 오브젝트를 만들어 AudioSource 컴포넌트 추가 후 match 효과음을 넣어주었으며
게임매니저 스크립트 컴포넌트의 AudioSource에는 오브젝트를, Clip에는 match 사운드를 넣어주어 뒤집힐때 효과음이 나도록 해주었다.
(MatchSound 오브젝트를 만들기 전엔 그냥 Clip에만 match를 넣어주었었는데 Card와 동일하게 작성한 코드이다 보니 에러로 인해 진행이 안되어 오브젝트를 하나 만들어 주게 되었는데 더 좋은 방법이 있는지 찾아보려고 한다.)
근데 내가 써놓고도 내가 모르는 부분이 너무 많아서 당황스럽다 ᵕ᷄≀ ̠˘᷅
사실 프로젝트 하면서 조원분들이 너무 잘하셔서 난 뭐하지.. 싶기도 하고 혼자 백지상태로 멀뚱멀뚱 있는바람에 개인학습 하겠다고 엉엉댓는데 같이 하자고 말씀해주시고 기초부터 차근차근 잘 알려주신 조장님과 조원분들 덕에 조금이라도 해내고 많은 지식을 쌓았던 한주인듯 하다!
내일까지 조금 더 힘내자 :)
'Unity > Unity Study' 카테고리의 다른 글
[Unity] 네번째 게임, '카드 뒤집기 게임' 완성 (0) | 2025.02.04 |
---|---|
[Unity] 세번째 게임, '고양이 밥주기 게임' 완성 (0) | 2025.01.28 |
[Unity] 두번째 게임, '풍선을 지켜라' 마무리 (0) | 2025.01.06 |
[Unity] 새로운 게임 시작, 복습단계 (0) | 2025.01.03 |
[Unity] 나의 첫 게임, '빗물받는 르탄이' 완성! (0) | 2025.01.02 |