개발/게임 교육

[Unity class] 게임 교육 21 - 미션 게이지바 만들기

이게될까 2024. 1. 6. 19:21
728x90
728x90

이젠 미션 게이지바를 만들어 보자!

Slider를 만들어준다

이름은 Guage로 해준다.

자동으로 생긴 Canvas 설정

폰크기에 맞출 것이므로 !

이건 그냥 하나씩 들어가면서 사진 바꾸고 크기 바꾸고 하면 된다!

플레이하면 마우스로도 움직일 수 있다.

마우스로 움직이는 것을 막기 위해서 interactable를 해제해준다.

이제 위치 조정!

우측 상단에 위치하고 이제 상호작용하도록 스크립트를 만들면 된다!

이제 새 스크립트를 만들고 미션 안에 넣어준다!

그리고 스크립트 작성!

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

public class MissionCtrl : MonoBehaviour
{
    int missionCount;
    public Slider guage;
    
    // 미션 성공하면 호출
    public void MissionSuccess()
    {
        missionCount++;
        guage.value = missionCount / 7f;
    }

}

별거 없다. 이제 모든 미션에서 성공하면 이 스크립트가 나오도록 해야 한다.

미션 1부터 다 수정!

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

public class Mission1 : MonoBehaviour
{
    public Color red;
    Animator anim;
    PlayerCtrl playerCtrl_script;
    public Image[] images;
    MissionCtrl missionCtrl_script;

    // Start is called before the first frame update
    void Start()
    {
        //getcomponent를 그냥 쓰면 안된다. 여기서 애니메이션은 하위 파일에 있다.
        anim = GetComponentInChildren<Animator>();
        missionCtrl_script = FindObjectOfType<MissionCtrl>();
    }

    //미션 시작
    public void MissionStart()
    {
        anim.SetBool("IsUp", true);
        playerCtrl_script = FindObjectOfType<PlayerCtrl>();
        // 초기화
        for (int i = 0; i < images.Length; i++)
        {
            images[i].color = Color.white;
        }

            // 랜덤 작업
        for (int i = 0; i < 4; i++)
        {
            int rand = Random.Range(0, 7);// 0 ~ 6 랜덤

            images[rand].color = red;// 랜덤한 숫자를 칠하기, 중복 고려 안했다.== 1~ 4
        }
    }

    //x버튼 누르면 호출
    public void ClickCancle()
    {
        anim.SetBool("IsUp", false);
        playerCtrl_script.MissionEnd();
    }

    // 육각형 버튼 누르면 호출
    public void ClickButton()
    {
        Image img = EventSystem.current.currentSelectedGameObject.GetComponent<Image>(); // 이미지 가져와서 저장
        // 버튼 색이 하얀색 이라면
        if(img.color == Color.white)
        {
            // 빨간색으로 !
            img.color = red;
        }
        else
        {
            // 만약 빨간색이라면 하얀색으로
            img.color = Color.white;
        }
        // 성공 여부 체크
        int count = 0;

        for (int i = 0; i < images.Length; i++)
        {
            if (images[i].color == Color.white)
            {
                count++;
            }
        }

        if(count == images.Length)
        { // 미션 성공
            Invoke("MissionSuccess",0.2f);
        }
    }

    // 미션 성공하면 호출될 함수
    public void MissionSuccess()
    {
        ClickCancle();
        missionCtrl_script.MissionSuccess();
    }
}

미션 스크립트를 가져와서 저 함수를 실행하도록 하였다.

그런데 한번 실행한 미션은 중복 실행 못하도록 바꿔야 한다. 그래서 한줄 씩 추가해준다.

Mission ctrl에선

    public void MissionSuccess(CircleCollider2D coll)
    {
        missionCount++;
        guage.value = missionCount / 7f;

        // 성공한 미션은 다시 플레이 하지 못하도록 - 써클 콜라이더 2D 사용해야 한다.
        coll.enabled = false;

    }

이렇게 바꿔준다.

mission 1에선 콜라이더를 넣어줘야 하므로

        missionCtrl_script.MissionSuccess(GetComponent<CircleCollider2D>());

이렇게 바꿔주면 끝이다!

이제 1부터 6까지 넣어준다....

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

public class MissionCtrl : MonoBehaviour
{
    int missionCount;
    public CircleCollider2D[] colls;
    public Slider guage;
    
    // 미션 성공하면 호출
    public void MissionSuccess(CircleCollider2D coll)
    {
        missionCount++;
        guage.value = missionCount / 7f;

        // 성공한 미션은 다시 플레이 하지 못하도록 - 써클 콜라이더 2D 사용해야 한다.
        coll.enabled = false;

    }

    //미션 초기화 기능
    public void MissionReset()
    {
        guage.value = 0;
        missionCount = 0;

        //콜라이더도 활성화 해야 한다.
        for(int i = 0; i < colls.Length; i++)
        {
            colls[i].enabled = true;
        }
    }
}

다 넣었다면 초기화 기능도 추가해준다.

초기화는 메인 메뉴에서 게임 들어갈 때 해준다.

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

public class MainMenu : MonoBehaviour
{
    public GameObject missionView;
    // 게임 종료 버튼 누르면 호출
    public void ClickQuit()
    {
        // 유니티 에디터
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false; 

        // 안드로이드
#else
        Application.Quit();
#endif

    }
    // 미션 버튼 누르면 호출
    public void ClickMission()
    {
        gameObject.SetActive(false);
        missionView.SetActive(true);
        //캐릭터가 메인 화면에서 보이는 것 때문에 캐릭터를 지운 뒤 여기서 읽어 온다.
        GameObject player = Instantiate(Resources.Load("Character"), new Vector3(0,-2,0),Quaternion.identity)as GameObject;
        // PlayerCtrl 스크립트를 가져와서 메인 뷰에 게임 오브젝트를 넣는다.
        player.GetComponent<PlayerCtrl>().mainView = gameObject;
        player.GetComponent<PlayerCtrl>().missionView = missionView;

        missionView.SendMessage("MissionReset");
    }
}

워낙 옛날에 적은 곳이라 잘 확인해야 한다.

코드 다 적고 콜라이더들 다 넣어야 한다!

이렇게 !

이런거 할땐 잠금해서 하고 풀면 된다!

이제 미션 게이지 다 차면 미션 완료 뜨기!

애니메이션까지 한번에 진행해줬다.
루프할 것이 아니기 때문에 해제해준다.

이건 이제 알아서 잘 할꺼라고 생각한다

-1000에서 시작해서 0에서 20초있다가 다시 -1000으로 10초만에 내려간다.

이제 스크립트만 수정해주면 끝!

 

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

public class MissionCtrl : MonoBehaviour
{
    public GameObject text_anim,mainView;
    int missionCount;
    public CircleCollider2D[] colls;
    public Slider guage;
    
    // 미션 성공하면 호출
    public void MissionSuccess(CircleCollider2D coll)
    {
        missionCount++;
        guage.value = missionCount / 7f;

        // 성공한 미션은 다시 플레이 하지 못하도록 - 써클 콜라이더 2D 사용해야 한다.
        coll.enabled = false;

        //모든 미션 성공 여부 체크
        if(guage.value == 1)
        {
            text_anim.SetActive(true);
            Invoke("Change", 1f);

        }
        
    }

    //미션 초기화 기능
    public void MissionReset()
    {
        text_anim.SetActive(false);

        guage.value = 0;
        missionCount = 0;

        //콜라이더도 활성화 해야 한다.
        for(int i = 0; i < colls.Length; i++)
        {
            colls[i].enabled = true;

        }
    }

    // 미션 모두 성공 시 화면 전환 
    public void Change()
    {
        mainView.SetActive(true);
        gameObject.SetActive(false);

        // 캐릭터 삭제
        FindObjectOfType<PlayerCtrl>().DestroyPlayer();
    }
}

이제 실행하면 된다!

728x90