개발/게임 교육

[Unity] 게임 교육 13 - 첫 번째 미션 만들기

이게될까 2024. 1. 2. 17:25
728x90
728x90

버튼을 총 7개 만들어 줍시다

버튼은 UI에 들어가면 있습니다. 위치는 적당히 위 그림 처럼 만들어 주세요

버튼을 눌러서 색을 변경하는 모션을 구현해 보겠다. mission1 script에서 구현하겠습니당.

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;

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

    }

    //미션 시작
    public void MissionStart()
    {
        anim.SetBool("IsUp", true);
        playerCtrl_script = FindObjectOfType<PlayerCtrl>();
    }

    //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;
        }
    }
}

코드는 단순합니다.

Red지정해준거 색 까먹지 말기
이것도 까먹지 말기 클릭하면 뭐가 일어난다.
실행하면 잘 되는 것을 확인할 수 있다

.이제 색이 다 바뀌면 끝나는 것도 만들어야 겠지?

일단 랜덤으로 몇개만 빨간색으로 만드는 기능을 구현한다. 아마 start에서 하지 않을까 싶다.

    public Image[] images;

이 한 줄만 아까 mission1 script에 추가해준다. 그리고 이 이미지를 각각 버튼에 추가해줘야 한다.

그리고 드래그해서 다 넣어주기!

아래 코드는 랜덤한 칸을 붉은색으로 칠하는 코드를 만든 Mission1 script이다.

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;


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

    }

    //미션 시작
    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;
        }
    }
}

랜덤을 활용해서 크게 어려운 부분 없이 만들었다.

잘 작동한다.

이제 미션의 성공여부를 체크해야 한다.

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;


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

    }

    //미션 시작
    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();
    }
}

여기선 클릭할 때 마다 모든 버튼이 하얀색인지 확인하고, 모두 하얀색이라면 0.2초후에 MissionSuccess를 호출하여 미션창을 내려버린다.

그러나 여기선 미션 완료와 캔슬에서의 차이가 없기 때문에 그걸 메꿔줄 필요가 있다.

728x90