ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL]2024-04-16
    TIL 2024. 4. 16. 22:37

     

    오늘 조원분들 중 한분이 어제 합친 코드를 정말 엄청나게 깔끔하고 주석까지 자세하게 적어서 정리해주셨습니다.

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    
    public class TimerWarning : MonoBehaviour
    {
    
        //타이머 시간이 촉박할 떄 게이머에게 경고하는 기능 작성
    
        /*
         *GameMaanager.cs의 time을 public으로 변경(참조하기 위함)
         *AudioManager.cs의 audioSource를 public으로 변경(참조하기 위함)
         *이 스크립트는 Canvas TimeTxt에 붙입니다.
         */
    
        Text timeText;         
        bool runningCorutine;   
        Coroutine coroutine;    
        
        float a = 10f; // 시간 설정을 위해 임의로 넣었다.
    
        void Start()
        {
            timeText = GetComponent<Text>();   // Text 색 변경을 위해 컴포넌트 가져오기
        }
    
    
        void Update()
        {
            /*
             *게임이 끝나기 a초 전
             *코루틴이 실행중이 아니고
             *타임 스케일이 0이 아니여야한다.
             */
            if (GameManager.Instance.time <= a && runningCorutine == false && Time.timeScale != 0)
            {
                coroutine = StartCoroutine(Warning());  //  Warning을 시작해라
            }
            else if (Time.timeScale == 0)   // 게임이 멈춰버린다면 (게임오버)
            {
                if (coroutine != null)      // 수정 사유 : 코루틴이 없는데 밑의 코드가 실행될 경우 error +999가 발생한다. (물론 게임에는 아무 지장 없다)
                    StopCoroutine(coroutine);
                timeText.color = new Color(1f, 0f, 0f, 1);      // Text 색 변경 (빨강색)
                AudioManager.Instance.audioSource.pitch = 1.0f;
                runningCorutine = false;
    
            }
        }
    
        //a초가 남았을 때 시간의 색깔이 점점 빨간색으로 변하기+ 음악 속도 빠르게 하기
        IEnumerator Warning()
        {
            runningCorutine = true; 
            float count = 255f;
    
            for (int i = 0; i < a; i++)
            {
                count = 255f - 255f * i / a;    // 식을 임의로 수정했습니다.
    
                timeText.color = new Color(1f, count / 255f, count / 255f, 1);//시간텍스트 빨개짐
                AudioManager.Instance.audioSource.pitch += 0.1f;//소리속도 빨라짐
    
                yield return new WaitForSecondsRealtime(1f);    // 현실 시간으로 1초 정지
    
            }
    
            AudioManager.Instance.audioSource.pitch = 1.0f;
            runningCorutine = false;
    
        }
    
        // 변경 이전의 코드는 5초를 상정하게 만들었음을 알 수 있다.
        // 재활용성을 위해 변수 a를 만들어서 바꿔보자.
        // 변수로 바꾼다면 원하는 초를 쉽게쉽게 바꿔줄 수 있고, 원한다면 public을 통해서 바꿔줄 수 있다.
    }

    기존 0초에서 30초로 증가하는거에 따라 수식을 바꿔주시면서 기존에있던 오류와 확장성을 고려해서 수정해주셨습니다
    평소에 되게 주석도 덜 달고 더럽게 짰었는데.... 보면서 많이배우고 반성했습니다. 이렇게 정리해서 보니깐 제가 짠 코드가 아니라도 잘 익히더라고요.

     

    [Challenge]

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

    //Card.cs
    
    Coroutine CardTimer;
    
    public void OpenCard()
    {
    	// 끝 화면에서 뒤에가려진 카드를 맞출경우 점수가 올라가는거 방지로 		
        //||Time.timeScale==0 추가했습니다.			                             
        if(GameManager.Instance.secondCard!=null||openCar==true||Time.timeScale==0)
                return;
    	...
    	if(GameManager.Instance.firstCard == null)
            {
                //첫 카드 5초 카운트
                CardTimer = StartCoroutine(FirstCardTimer());
    	...
    	}
    }
    void CloseCardInvoke()
    {
    	if (CardTimer != null)
                StopCoroutine(CardTimer);
    }
    
    IEnumerator FirstCardTimer()
    {
            yield return new WaitForSeconds(5f);
            GameManager.Instance.firstCard = null;
            CloseCard();
          
    }

    코루틴을 사용하여 첫번째 카드만 코루틴에서 돌고 5초안에 두번째 카드가 입력이되면 코루틴을 자동으로 멈추고, 5초가 넘게되면 자동으로 뒤집어집니다.

    10. 나만의 카드 등장 효과 연출하기(파도타기 효과로 등장, 화면 밖에서 나선형으로 날아오는 등장 등)

    이건 제가 완전히 혼자 구현한거 아니지만 여러가지 방법중 하나를 만들어서 팀원들과 공유했습니다.

    //먼저 Card Prefab에 붙여있는 Animoator에 ApplyRootmotion을 체크해 주셔야합니다.
    
    //GameManager.cs
    
    public void Matched()
    {
        if (firstCard.idx == secondCard.idx)
        {
          MoveCard(firstCard);
          secondCard.gameObject.SetActive(false);
        }
    
    }
     void MoveCard(Card card)
    {
        card.transform.position= new Vector2(-1.5f,4f);
        card.anim.SetBool("isMatch", true);
    }

     

    ApplyRootMotion

    애니메이션을 만들 때 transform값을 수정하는 동작이 있으면 카드세팅 위치값이 작동하지 않는 문제가 있었습니다.

    아직 완벽하게 이해는 못했지만 스크립트와 애니메이터 두 곳에서 해당 오브젝트의 위치값을 변경해야 할 때 한번씩 확인해봐야하는 요소인 것 같습니다. 

    참조:

    https://docs.unity3d.com/ScriptReference/Animator-applyRootMotion.html

    나머지 세팅들

     

     

     

     

     

     

     

    카드를 맞추게되면 시간옆에 나타났다가 돌면서 날아간다.

    급하게 만든 애니메이션이긴하지만 이걸 토대로 좀 더 자연스러운 애니메이션을 만들고싶다는 생각

     

     

    여담+팁

    파일을 받았을 때 Inspector창이 아닌 Debug창만 있어서 정확한 요인을 모르고

    Window-Layout-Default 로 초기화 해버렸는데 Debug/Inspector 에 우클릭을 하면 두가지 다 왔다갔다 할 수 있다는것을 팀원 분에게 듣고 알았습니다!

    처음알아서 신기했고  두 창의 차이점은 나중에 다시 알아보려고 합니다.

     

     

     

     

     

    'TIL' 카테고리의 다른 글

    [TIL]C#문법 2  (0) 2024.04.23
    [TIL]C#문법1주차(수정중)  (0) 2024.04.23
    [TIL] 2024-04-18 협업툴 사용  (0) 2024.04.18
    [TIL]2024-04-17 GitHub  (1) 2024.04.17
    [TIL]2024-04-15  (0) 2024.04.15
Designed by Tistory.