[Sparta-BCamp] 미니 프로젝트 1일차(시간추가 기능) ⭐

업데이트:

카테고리:

태그: , ,




미니 프로젝트 1일차

오늘은 캠프 첫 팀 프로젝트 날이다. 미니 프로젝트이지만 처음 팀 단위로 프로젝트가 진행되었다.
첫날 대부분의 시간은 프로젝트에 대한 회의, 대화로 많은 시간을 보냈다. 다들 좋은 분인 것 같았다.
회의 후 각자 한 부분씩 진행하였고 나는 시간 추가 기능을 맡게 되었다. 실패할 때마다 시간 감소 기능 추가
기능 추가 부분은 간단하다고 생각했다. 한 줄이면 되었다.
매칭 실패 시 플레이어가 시간이 추가된 걸 알 수 있게 시각적인 효과를 추가해 보기로 했다.








1. 시간추가, 감소 효과 넣어보기

  • 매칭 실패 시 시간 추가
  • 게임매니저 부분 수정 기본gamemanager.cs
  • Hierarchy에 addtime라는 text 추가
  • image

gamemanager.cs

gamemanager.cs

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(match);
        firstCard.GetComponent<card>().destroyCard();
        secondCard.GetComponent<card>().destroyCard();
        int cardsLeft = GameObject.Find("cards").transform.childCount;
        if (cardsLeft == 2)
        {
            Debug.Log(cardsLeft);
            endTxt.SetActive(true);
            Time.timeScale = 0.0f;
            //Invoke("GameEnd",1f);
        }
    }
    else
    {
        firstCard.GetComponent<card>().closeCard();
        secondCard.GetComponent<card>().closeCard();
        // 추가 1 줄
        time += 5;
    }
  • time += 5;
  • 기능적으로 else 부분 (매칭 실패 시) 5초 증가








2. 시각적인 효과 보여주기

기능만 추가 시 심심한 느낌이 들어서 시각적인 효과를 넣어보려고 하였다.
처음 막힌 부분은 text도 오브젝트처럼 이동이 될까? 였다.

생각한 방법으로는

  • 1.빈 오브젝트 안에 text를 넣고 오브젝트를 이동할까?
  • 2.text의 위치를 나타내고 이동시킬 수 있을까? 가능하면 해보자
    2번을 선택하여 찾아보았다.
  • 게임매니저 부분 수정 gamemanager.cs
  • 주석 추가한 부분 = 수정부분
  • image

1) 선언, Update 부분

gamemanager.cs

gamemanager.cs

using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class gamemanager : MonoBehaviour
{

    public Text addTxt;                                         // addtxt 위치
    private RectTransform transaddtxt;                          // addtxt 위치
    byte c;                                                     // 색상 byte 변수

    void Start() {
        transaddtxt = addTxt.GetComponent<RectTransform>();     // 매칭 실패 시 시간 추가
    }

      void Update()
   {
       float addy = transaddtxt.anchoredPosition.y;         // addtxt 위치
       addy += 0.5f;                                        // addtxt y값 상승
       transaddtxt.anchoredPosition= new Vector2(0, addy);  // addtxt y값 상승

       c -= 1;                                              // 글자 색상 투명하게
       addTxt.color = new Color32(255, 0, 0, c);            // 글자 색상 투명하게

       time += Time.deltaTime;
       timeTxt.text = time.ToString("N2");
       if (time>=60)
       {
           Invoke("GameEnd",0);
       }
   }
}

변수, 선언

  • public Text addTxt; 텍스트
  • private RectTransform transaddtxt; 텍스트의 위치값을 사용하기 위한 RectTransform
  • byte c; 글자 색상 투명도변경 변수 -> byte

Update 부분

  • float addy = transaddtxt.anchoredPosition.y; addy -> text의 y값 위치
  • addy+= 0.5f; addy -> text의 y값을 계속 증가시키기 위로 이동
  • transaddtxt.anchoredPosition= new Vector2(0, addy); update 부분에 추가하여 text의 y값이 계속 증가한다.
  • c -= 1; addTxt.color = new Color32(255, 0, 0, c); 글자 점점 투명하게





2) ismatched

gamemanager.cs

gamemanager.cs

using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class gamemanager : MonoBehaviour
{    
        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(match);

            firstCard.GetComponent<card>().destroyCard();
            secondCard.GetComponent<card>().destroyCard();

            int cardsLeft = GameObject.Find("cards").transform.childCount;
            if (cardsLeft == 2)
            {
                Debug.Log(cardsLeft);
                endTxt.SetActive(true);
                Time.timeScale = 0.0f;
                //Invoke("GameEnd",1f);
            }
        }
        else
        {
            firstCard.GetComponent<card>().closeCard();
            secondCard.GetComponent<card>().closeCard();

            // 시간 추가 기능
            time += 5;
            addTxt.color = new Color32(255, 0, 0, 255);             // 글자색 RED
            c = 0;                                                  // 투명도 초기화
            transaddtxt.anchoredPosition = new Vector2(0, 450);     // 글자 위치 초기화 (진행시간 위)
            addTxt.gameObject.SetActive(true);                      // addTXT 활성화
            Invoke("ActiveFalse", 1.0f);                            // 1초 후 ActiveFalse 실행
        }

        firstCard = null;
        secondCard = null;
    }

    void ActiveFalse() {
        addTxt.gameObject.SetActive(false);                          // addtxt 비활성화 하기
    }
}

isMached ->else

  • addTxt.color = new Color32(255, 0, 0, 255); 글자 색상 RED로 변경
  • c = 0; 투명도 초기화
  • addtime text를 추가 후 비활성화 -> addTxt.gameObject.SetActive(true); 활성화 시키기
  • Invoke(“ActiveFalse”, 1.0f); 1 초 후 ActiveFalse 실행

ActiveFalse()

  • addTxt.gameObject.SetActive(false); -> 비활성화 시키기.








3. GameManager

gamemanager.cs

gamemanager.cs

using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class gamemanager : MonoBehaviour
{
    public static gamemanager I;
    public GameObject endTxt;
    public GameObject card;
    public GameObject firstCard;
    public GameObject secondCard;
    public Text timeTxt;    
    public AudioClip match;
    public AudioSource audioSource;
    public Text addTxt;

    float time = 0.0f;
    byte c;                                                     // 색상 byte 변수

    private RectTransform transaddtxt;                          // addtxt 위치

    void Awake()
    {
        I = this;
    }

    void Start() {
        transaddtxt = addTxt.GetComponent<RectTransform>();     // addtxt 위치
        Time.timeScale = 1.0f; 
        

        int[] rtans = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
        //랜덤정렬
        rtans = rtans.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray();
            
        for (int i = 0; i < 16; i++)
        {
            
            GameObject newCard = Instantiate(card);
            newCard.transform.parent = GameObject.Find("cards").transform;

            float x = (i / 4) * 1.4f - 2.1f;
            float y = (i % 4) * 1.4f - 3.0f;
            newCard.transform.position = new Vector3(x, y, 0);

            string rtanName = "rtan" + rtans[i].ToString();
            newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(rtanName);
        }
    }

    void Update()
    {
        float addy = transaddtxt.anchoredPosition.y;         // addtxt 위치
        addy += 0.5f;                                        // addtxt y값 상승
        transaddtxt.anchoredPosition= new Vector2(0, addy);  // addtxt y값 상승

        c -= 1;                                              // 글자 색상 투명하게
        addTxt.color = new Color32(255, 0, 0, c);            // 글자 색상 투명하게

        time += Time.deltaTime;
        timeTxt.text = time.ToString("N2");
        if (time>=60)
        {
            Invoke("GameEnd",0);
        }
    }
    
    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(match);

            firstCard.GetComponent<card>().destroyCard();
            secondCard.GetComponent<card>().destroyCard();

            int cardsLeft = GameObject.Find("cards").transform.childCount;
            if (cardsLeft == 2)
            {
                Debug.Log(cardsLeft);
                endTxt.SetActive(true);
                Time.timeScale = 0.0f;
                //Invoke("GameEnd",1f);
            }
        }
        else
        {
            firstCard.GetComponent<card>().closeCard();
            secondCard.GetComponent<card>().closeCard();

            // 시간 추가 기능
            time += 5;
            addTxt.color = new Color32(255, 0, 0, 255);             // 글자색 RED
            c = 0;                                                  // 투명도 초기화
            transaddtxt.anchoredPosition = new Vector2(0, 450);     // 글자 위치 초기화 (진행시간 위)
            addTxt.gameObject.SetActive(true);                      // addTXT 활성화
            Invoke("ActiveFalse", 1.0f);                            // 1초 후 ActiveFalse 실행
        }

        firstCard = null;
        secondCard = null;
    }

    void ActiveFalse() {
        addTxt.gameObject.SetActive(false);                          // addtxt 비활성화 하기
    }

    void GameEnd(){
        endTxt.SetActive(true);
        Time.timeScale = 0.0f;
    }

    public void retryGame()
    {
        SceneManager.LoadScene("MainScene");
    }
}

image








4. 정리

  • 기능 추가는 time += 5; 한 줄로 간단한 거 같다.
  • 오늘 배운 건 text의 위치는 anchoredPosition를 사용하여 이동시킬 수 있다는 걸 배웠다.
  • hex코드 색상 변경 new Color32(x, x, x, x); 로 가능하다. x값은 byte 로 사용한다.
  • 오늘 처음 팀원분들과 회의, 대화해 보았고. 다 좋으신 분 같다. 나만 캠이 없어서 죄송했고 열심히 참여해 팀에 도움이 되고 싶다.




[Unity] 미니 프로젝트 1일차

참고 : 유니티 TOP


📔

댓글남기기