본문 바로가기

UNITY

UNITY_20230808[팀 프로젝트_1]

0807부터 유니티, 깃헙을 활용한 팀별 게임 개발 프로젝트를 0811까지 진행한다.

개발 목표는 지난 사전캠프의 마지막 강의 내용 "카드 뒤집기" 게임에 더 많은 내용을 담아 보다 몰입할 수 있는 게임으로 발전시키는 것이다.


주어진 과제는 다음과 같다. 내가 담당한 과제는 ★표시한다.

매칭 성공 시, 팀원의 이름 표시 / 실패 시 실패 표시 (종료 시 끝! 나타나는 것처럼)

카드 뒤집기에서 실제로 카드가 뒤집어지는 모습 연출하기

★ 클릭할 때(카드 뒤집을 때), 시작할 때, 진행 중일 때 성공 실패 소리 넣어보기

★ 타이머 시간이 촉박 할 때 게이머에게 경고하는 기능 작성해보기(시간이 붉게 변하거나 긴박한 배경음악으로 변경)

★ 실패할 때 마다 시간 감소 효과 넣어보기

스테이지 선택과 현재 해금한 스테이지가 구분 가능한 시작 화면 만들기, 플레이 중 해당 스테이지의 최단 기록 띄워주기

한 번씩 뒤집은 카드는 색을 다르게 표시하기 (옅은 회색 등)

결과에 매칭 시도 횟수 표시

firstCard 고르고 5초 간 카운트 다운 - 안 고르면 다시 닫기

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

결과에 점수 표시 → 남은 시간, 매칭 시도한 횟수 등을 점수로 환산

 

사실, 딱 봐도 제일 쉬운 과제 3개다. 실제로 해 보니 코드 몇줄 추가 밖에 할게 없다. 심지어 오늘 다 했다.

다른 조원이 담당한 과제의 상세는 따로 작성한다.


★ 클릭할 때(카드 뒤집을 때), 시작할 때, 진행 중일 때 성공, 실패 소리 넣어보기 & 배경음악 추가

 

카드 클릭 시, 뒤집은 두 장의 카드가 일치할(서로 다를) 때 소리 총 3개의 음향효과(SE)를 추가했다.

게임 실행과 동시에 재생되는 BGM을 추가했다.

 

다음은 사용한 SE와 코드다.

draw : 카드 클릭
bell : 카드 일치
error : 카드 불일치

Lazy Day v0_9 : BGM

 

다음은 카드 버튼에 OpenCard() 할당이다.

draw는 카드 스크립트에서 작성한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class card : MonoBehaviour
{
    public AudioSource audioSource;
    public AudioClip draw;

    public void OpenCard()
    {
        audioSource.PlayOneShot(draw);
    }
} // 관련 없는 코드는 전부 생략

bell, error는 GM에서 작성한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.UI;
using System.IO;


public class gameManager : MonoBehaviour
{
    public Animator anim; // timeTxt 애니메이션 전환
    public AudioSource audioSource; // GM오디오소스
    public AudioClip matchedSound; // 카드 두개가 일치할 때 소리
    public AudioClip unmatchedSound; // 카드 두개가 다를 때 소리

    public void IsMatched()
    {

        string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
        string secondCardImage = secondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
        if (firstCardImage == secondCardImage)
        {
            audioSource.PlayOneShot(matchedSound);
        }
        else
        {
            audioSource.PlayOneShot(unmatchedSound);
        }
        firstCard = null;
        secondCard = null;
    }
}

Lazy Day v0_9는 AudioManager(AM)에서 작성한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class audioManager : MonoBehaviour
{
    public AudioSource audioSource;
    public AudioClip bgm;

    void Start()
    {
        audioSource.clip = bgm;
        audioSource.Play();
    }
}

★ 타이머 시간이 촉박 할 때 게이머에게 경고하는 기능 작성해보기(시간이 붉게 변하거나 긴박한 배경음악으로 변경)

 

제한 시간이 10초 이하일 때, 제한시간 텍스트가 빨갛게 점멸하고, 제한시간이 0이 됐을 때 텍스트 색을 빨갛게 처리한다.

다음은 위의 기능을 추가한 게임 화면이다.

다음은 제한시간 텍스트의  Animation과 Animator다.

제한시간 텍스트의 Animator(상), 10초 이하Animation(좌하), 게임 오버Animation(우하)

각 애니메이션의 Transition 조건은 under10seconds이다.

다음은 애니메이션 기능을 추가한 GM의 코드다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.UI;
using System.IO;


public class gameManager : MonoBehaviour
{
    public Text timeTxt;

    public Animator anim; // timeTxt 애니메이션 전환

    void Update()
    {
        time -= Time.deltaTime;

        timeTxt.text = time.ToString("N2");
        if (time <= 10.0f) // 제한시간 10초 이하일 경우
        {
            anim.SetBool("under10seconds", true); // 조건은 true, timeTxtblinking 동작
            ShowMeTheHint();
        }
        if (time <= 0.0f)  // 제한시간 0초 이하일 경우
        {
            GameEnd();
        }
    }

    void GameEnd()
    {
        anim.SetBool("under10seconds", false);  // 조건은 false, timeTxtbGameOver 동작

        Time.timeScale = 0.0f;
        endTxt.SetActive(true);
        time = 0f;
    }
}

★ 실패할 때 마다 시간 감소 효과 넣어보기

 

뒤집힌 두 장의 카드가 서로 다를 경우, 제한 시간에서 3초를 빼고, 제한시간 텍스트 옆에 "-3" 텍스트를 일시적으로 표시한다.

 

다음은 -3텍스트의 속성, 애니메이션이다.

timePenalty : Empty Object / timePenaltyTxt : Text

timePenaltyTxt는 생성 이후 위로 올라감과 동시에 페이드아웃 되어 사라진다.

다음은 GM에서 동작하는 timePenaltyTxt의 코드다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.UI;
using System.IO;


public class gameManager : MonoBehaviour
{
    public GameObject timePenalty; // 카드 두개가 다를 때 시간 까는 패널티

    public Animator anim; // timeTxt 애니메이션 전환

    public void IsMatched()
    {
        if (firstCardImage == secondCardImage)
        {
        
        }
        else
        {
            time -= 3.0f;
            GameObject penalty = Instantiate(timePenalty); // 제한시간에서 3초 까기
            Destroy(penalty, 0.5f);
        }

Text는 GameObject가 아닌 UI다. 따라서 생성된 Text를 GameObject에 할당해야 destroy함수 동작 시 오류가 발생하지 않는다.

만약 위의 할당을 하지 않고 Destroy(timePenaltyTxt) 동작 시도 했을 경우,
destroying assets is not permitted to avoid data loss 오류 메세지가 출력된다.


튜터에게의 질문 : 게임 시작 후 일정 시간이 지나면 BGM의 재생 속도를 조절하고 싶다. 어떻게 하면 되는가?

답변 : AUDIO MIXER라는 기능이 있다. 지금 진도에서 이 기능을 사용해도 되는지 논의해 보고 추가 답변하겠다.

 

github DESKTOP 앱의 사용으로 GIT&GITHUB의 활용을 무난하게 할 수 있게 됐다.

이에 관한 상세는 사용 숙련도가 안정되면 기록한다.

 

'UNITY' 카테고리의 다른 글

UNITY_20230810[팀 프로젝트_3]  (0) 2023.08.10
UNITY_20230809[팀 프로젝트_2]  (0) 2023.08.09
UNITY_20230802[카드 짝 맞추기]  (0) 2023.08.03
UNITY_20230728[고양이밥줘서내쫓기]  (0) 2023.08.01
UNITY_TIL최적화를 위한 규칙  (0) 2023.07.31