본문 바로가기
개발일지/게임개발

[유니티 게임 개발] 동방을 걷다 프로젝트 12 - NPC 레이무 미니게임 수정, 추가 기능 2024 05 29(PM 08:30)

by 라이티아 2024. 5. 29.

현재 듣고 있는곡

[Neru] "Stop Nagging Me! "

고오오오전 보컬로이드 곡

가사가 어썸한 곡이다

 

 

현재 제작되어 있는 하쿠레이 신사의 사당 청소 미니게임이다

 

대충 매커니즘만 구현해두고 던져놨었는데, 이제 본격적으로 미니게임으로 만들어 보려 한다

 

우선 게임 시작 버튼을 만들어 보자

 

void help()
    {
        NPCManager.Instance.Gold += 10;
        currentLine = 43;
        DisplayNextSentence();
        Debug.Log(currentLine.ToString() + " ;;;" + rowSize.ToString());
        control.score = 0;
        mini.gameObject.SetActive(true);
    }

현재 도와주기 버튼의 매커니즘이다

 

버튼을 누르면 게임을 클리어한것으로 치고 UI위에 다른 UI를 올리고 바로 게임을 시작해 버리는 형식이다

mini.gameObject.SetActive(true);

핵심은 이 부분이다

 

이게 true가 되면

void Start()
    {
        InvokeRepeating("set_active", 0f, 3f);
    }

    void Update()
    {
        if(control.score >= 20){
            NPCManager.Instance.like += 5;
            gameObject.SetActive(false);
        }
    }

    void set_active()
    {
        if(control.score < 20){
            int R = Random.Range(1, 8);
            if (R == 1)
                leave1.SetActive(true);
            else if (R == 2)
                leave2.SetActive(true);
            else if (R == 3)
                leave3.SetActive(true);
            else if (R == 4)
                leave4.SetActive(true);
            else if (R == 5)
                leave5.SetActive(true);
            else if (R == 6)
                leave6.SetActive(true);
            else if (R == 7)
                leave7.SetActive(true);
            }
        }

미니게임 오브젝트의 스크립트가 실행된다

InvokeRepeating

는 일정시간마다 함수명을 확인해서 일정 시간마다 실행한다

 

즉, 이 스크립트는 일정 시간마다 잎을 활성화 시키는 것 이다

 

이것을 게임 시작 버튼을 누르면 실행하도록 바꿔주자

 

 

포토샵으로 시작 화면을 대충 만들어 줬다

 

그후 스크립트에 시작용 버튼 하나, 시작 화면을 띄울 화면 1개를 public 으로 추가한다

public Button start_btn;
public GameObject main;

 

그후 이것을 구현할 매커니즘을 만든다

if(!is_start){
            main.SetActive(true);
            start_btn.enabled = true;
        }
        else{
            main.SetActive(false);
            start_btn.enabled = false;
        }

bool 변수 is_start를 조절해서 표시, 비표시를 조정한다

 

이제 버튼에 기능을 추가한다

start_btn.onClick.AddListener(minigamestart);

버튼에 클릭시 함수를 실행 시킨다

void minigamestart(){
        is_start = true;
    }

버튼 클릭시 is_start가 true가 된다

 

이제 미니 게임 시작을 재구현 해보자

 

기존에는 InvokeRepeating 

를 사용했기에 start에서 사용할 수 있었지만, 이제 안되기에 Time를 사용해서 구현하려 한다

 

private float timer = 0f;
public float interval = 3f;

변수 2개를 만든다 타이머는 실시간 시간을 확인해주고, 인터발은 빈도를 결정한다

 

void Update()
    {
        if(!is_start){
            main.SetActive(true);
            start_btn.enabled = true;
        }
        else{
            main.SetActive(false);
            start_btn.enabled = false;
            timer += Time.deltaTime;
            if(timer >= interval){
                set_active();
                timer = 0;
            }
        }
        if(control.score >= 20){
            NPCManager.Instance.like += 5;
            main.SetActive(true);
            start_btn.enabled = true;
            gameObject.SetActive(false);
        }
    }

업데이트에 타임을 사용해서 미니게임 시작을 재구현 해준다

 

UI는 대충 이런 느낌이다

 

중간 테스트를 해보자

 

의도한 느낌으로 나왔다

 

 

이제 목표를 달성하면 이미지를 띄우고 버튼으로 나가도록 만들어 보려 한다

 

 

대충 이런 글자와 나가기 버튼을 띄우도록 하자

 

public Button out_btn;
    public GameObject out_text;
    public GameObject out_btn_;

스크립트에 각 객체를 만든다

버튼이 게임 오브젝트로 1개 더 생긴이유는 후술한다

 

void Update()
    {
        if(!is_start){
            main.SetActive(true);
            start_btn_.SetActive(true);
            out_text.SetActive(false);
            out_btn_.SetActive(false);
        }
        else{
            main.SetActive(false);
            start_btn_.SetActive(false);
            out_text.SetActive(true);
            out_btn_.SetActive(true);
            timer += Time.deltaTime;
            if(timer >= interval){
                set_active();
                timer = 0;
            }
        }
        if(control.score >= 20){
            NPCManager.Instance.like += 5;
            is_start = false;
            gameObject.SetActive(false);
        }
    }

이제 update를 수정해 준다

여기서 달리진점은 버튼을 enabled로 조작하려 했는데 안되서

게임 오브젝트에 버튼을 할당해서 setactive로 조작하고 있다는 것 이다

 

안습하다...

이제 버튼에 기능을 할당한다

 

out_btn.onClick.AddListener(minigameend);

버튼에 기능을 추가 선언

void minigameend(){
        if(control.score >= 20){
            NPCManager.Instance.like += 5;
            is_start = false;
            gameObject.SetActive(false);
        }
    }

기존의 나가기 기능을 넣어준다

 

---------------------------------------------------------------------------------------------------------------------------------------------------

오우... 실수했다

else{
            main.SetActive(false);
            start_btn_.SetActive(false);
            out_text.SetActive(true);
            out_btn_.SetActive(true);
            timer += Time.deltaTime;
            if(timer >= interval){
                set_active();
                timer = 0;
            }
        }

else에다가 넣으면 바로 나가기 버튼이 활성화 되어버린다

if문을 하나 걸어주자

else{
            main.SetActive(false);
            start_btn_.SetActive(false);
            if(control.score >= 20){
                out_text.SetActive(true);
                out_btn_.SetActive(true);
            }
            timer += Time.deltaTime;
            if(timer >= interval){
                set_active();
                timer = 0;
            }
        }

 

이제 또 테스트 시간

 

잘 된다

 

이제 나뭇닢들이 너무 가지런하게 나오는 현상을 방지해보자

그냥 scale과 rotation을 랜덤하게 만들어주면 되는 이야기니 편하다

 

void Start()
    {
        imageComponent = GetComponent<Image>();
    }

현재는 그냥 컴포넌트만 가져오고 있다

 

여기에 랜덤하게 만들어 주자

void Start()
    {
        imageComponent = GetComponent<Image>();
        float size = Random.Range(0.5f,1.2f);
        float rotation = Random.Range(0f,270f);
        imageComponent.rectTransform.rotation = Quaternion.Euler(0f, 0f, rotation);
        imageComponent.rectTransform.localScale = new Vector3(size, size, 1f);
    }

 

우선 대충 매커니즘을 짜줬다 안될 것 같지만 해보자

 

 

의외로 잘된다