본문 바로가기
유니티/AmongUs 클론코딩 (30일 프로젝트)

[Unity] #3. 게임 플레이 컨텐츠 만들기 : 미니게임 미션 기본 세팅

by 로토마 2022. 3. 1.

자! 이제 어몽어스에 하이라이트!!

바로~ 미니게임 미션 컨텐츠를 구현할 차례이다.

어떤 미션들을 만들었는지 간단하게? 정리 먼저 해보고! 설명하겠다.

 

게임은 총 6가지 종류로 맵에 위치된 지형을 이용해 수행하게 된다.

맵에서 살펴보면 이렇게 위치한 것을 볼 수 있다.

미션 위치 (노란색 밑줄)

먼저 장소를 기준으로 게임을 나열해 보았다.

일단 맵에서 가장 넓은 공간을 차지하고 있는...

- 카페테리아 

+ 야자수

   -> 버튼 색 맞추기 미션

+ 벽 면 쓰레기장

   -> 쓰레기 버리기 미션

이렇게 두 미션이 위치한 것을 볼 수 있다 !!

자, 그 다음에는 이상한 실험체가 있는 것 같은 실험실을 살펴보자.

- 실험실

+ 키보드

   -> 랜덤으로 생성되는 번호 입력하기 미션

+ 마우스

   -> 순서대로 숫자 클릭하기 미션

여기는 좀 비슷한 위치에 두 가지 미션이 몰려 있는 것을 볼 수 있다.

그리고 왼쪽 끝부분에 위치한,

- 위/아래 항해실 

+ 핸들

   -> 각도 맞추기 미션

이 미션은 유일하게 두 번 실행하게 되는 미션인데,

각각 위와 아래 항해실에 위치했다.

마지막으로 가장 잔 버그가 많았던,

- 전기실

+ 전선

   -> 전선 잇기 미션

이렇게 총 6가지 미션을 구현했다. (생각보다 많은 날이 걸렸다...) 

하지만!! 이에 굴하지 않고!! 잘 완성했다ㅎㅎ

그럼 본격적으로 개발 과정에 대해 설명하겠다.

1. 미션 UI 생성

미션을 만들기 위해, 가장 먼저 Hierarchy 창에 미션 UI Image를 생성한 뒤,

메인메뉴의 맵을 복사해서 집어넣는다.

그리고 미션이 이뤄지는 맵 요소 안에 미션 요소를 새로 생성해 주고,

알맞는 Image를 Sprite에 넣어준다.

그리고 마지막으로 기존 맵에 미션 Sprite의 위치를 똑같이 겹치도록 맞춰서 설정하면,

Hierarchy창에서 해주어야 할 전반적인 작업이 끝난다.

모두 설정된 Hierarchy 창은 아래와 같다.

Mission의 Hierachy 창

2. Circle collider 생성

이제 모든 미션 물체 주위에 Circle collider을 생성해 캐릭터가 가까이 왔을 때 인식할 수 있게끔 해줘야한다.

우선 각 미션 Hierarchy를 클릭해서 Inspector 창을 열고, Add Component를 누른 다음 Circle Collider 2D를 생성해 준다. 물체를 통과하면 안되므로 Is Trigger에 체크 표시를 해주고 Radius값이랑 위치를 맵에서 알맞게 수정해주면 끝이다.

아래는 정상적으로 Collider가 잘 생성된 Inspector 창과 맵!!

Mission6의 Inspector 창

Collider가 생성된 Inspector 창

Mission 6에 생성된 Circle Collider 

위와 같이 초록색으로 원 표시가 생성된 것을 볼 수 있다.

이제 그 원 안에 캐릭터가 들어가면, 미션을 감지해 나중에 만들 USE 버튼이 활성화 되도록 할 것이다.

3. USE 버튼 생성

다음엔 미션이 실행이 되던 안되던 UI창에 계속 있을 USE 버튼을 만들어 볼 것이다.

이 버튼은 미션 주위에 없을 때는 희미하게 남아있지만, 

미션 가까이 다가가게 되면 USE! 버튼이 활성화 되어 그 버튼을 클릭했을 때,

미션이 작동되도록 하는 버튼이다. 

이 부분에서는 USE 버튼과 함께 collider을 인식하면 버튼 활성화되도록하는 script가 있어야 한다.

이 버튼은 계속 Character와 함꼐 움직일 것이므로 Character안에다가 생성해 주어야 한다.

Resources에 Character안에 이렇게 배치해 주었다.

Character 안의 USE Button

이제 Image를 넣어주고, 오른쪽 하단에 위치해,

기능을 넣어줄 script까지 생성해서 연결해 주면, 버튼 세팅은 끝난다.

세팅이 끝난 Inspector 창.

USE Button의 Inspector 창

완성된 UI

완성된 Character UI

그리고 이제 Collider와 연동해 버튼의 활성화를 제어해줄 코드를 작성해주면 미션의 전체적인 기본 세팅은 끝난다.

이제 Collider를 부딫혔을 때 isMission 부분을 활성화 시켜 USE버튼을 활성화하고, Mission 화면이 뜨게끔 코드를 작성하면 된다. 코드 작성후 다시 Character와 button에 script가 잘 추가되었는지 확인해준다.

 

PlayerCtrl script)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick, mainView, playView;
    public Settings settings_script;
    public Button Btn;
 
    Animator anim;
    GameObject coll;
    
 
    //speed 변수 생성
    public float speed;
 
    public bool isCantMove,isMission;
 
    float timer;
    bool isCool,isAnim;
 
 
    //시작할 때의 실행
    private void Start()
    {
        anim = GetComponent<Animator>();
 
        // main camera를 Character의 자식으로 지정
        Camera.main.transform.parent = transform;
        // 처음 위치 지정 => 유니티에서의 main camera의 원래 위치를 상쇄해주기 위해
        Camera.main.transform.localPosition = new Vector3(00-10);
 
        // 미션이라면
        if (isMission)
        {
            Btn.GetComponent<Image>().sprite = use;
 
            text_cool.text = "";
 
        }
       
    }
 
 
 
    // 캐릭터 움직임 관리 함수
   void Move()
   {
        if (settings_script.isJoyStick)
        {
            joyStick.SetActive(true);
        }
        else
        {
            joyStick.SetActive(false);
            //JoyStick 말고 화면을 클릭했는지 판단
            if (Input.GetMouseButton(0)) //좌측을 클릭 혹은 터치 했을 때
            {
                if (!EventSystem.current.IsPointerOverGameObject())
                {
                    //dir 변수에 클릭한 위치 - 중간 위치를 빼주고 normalized 해준다
                    Vector3 dir = (Input.mousePosition - new Vector3(Screen.width * 0.5f, Screen.height * 0.5f)).normalized;
                    //위치를 speed 값과 시간을 고려해 업데이트 해준다
                    transform.position += dir * speed * Time.deltaTime;
 
                    //animation 의 isWalk를 true로
                    anim.SetBool("isWalk"true);
 
                    //왼쪽으로 이동
                    if (dir.x < 0)
                    {
                        transform.localScale = new Vector3(-111);
                    }
                    //오른쪽으로 이동 (좌우반전)
                    else
                    {
                        transform.localScale = new Vector3(111);
                    }
                }
               
            }
            //클릭하지 않는다면
            else
            {
                anim.SetBool("isWalk"false);
            }
        }
 
       
   }
 
    //캐릭터 삭제
    public void DestroyPlayer()
    {
        Camera.main.transform.parent = null;
        Destroy(gameObject);
    }
 
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Mission" && isMission)
        {
            coll = collision.gameObject;
            Btn.interactable = true;
        }
 
    }
 
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.tag == "Mission")
        {
            coll = null;
 
            Btn.interactable = false;
        }
    }
 
    // 버튼 누르면 호출
    public void ClickButton()
    {
        // 미션일 때
        if (isMission)
        {
            //MissionStart 호출
            coll.SendMessage("MissionStart");
        }
 
    }
 
}
 
 
 
 
cs

 

이 과정을 마무리하면 아직, 미션은 생성 안되었지만, 미션 물체를 감지하고, USE Button을 활성화하는 것에는 구현할 수있다. 이제는 6개 종류의 미션을 구현하고, 마지막 kill 미션까지 마무리하면 끝!!