W298.dev
ProjectsPostsAbout Me
youtube
Pages
ProjectsPostsAbout Me
Posts
TAGS
All
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape
Assembly Definition
ML-Agent
RL-Obstacle-Avoid
RL-Competitive
Unity
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape
Assembly Definition
SERIES
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape

Misson

UI

Mission UI

https://velog.velcdn.com/images/lutca1320/post/df13fca6-7540-471c-897a-868a0b833701/image.png

Mission Failed

https://velog.velcdn.com/images/lutca1320/post/17221a58-0f09-44de-9e02-0fff784cba18/image.png

Mission Complete

https://velog.velcdn.com/images/lutca1320/post/67c2bdbe-68b4-4f19-8eaf-b89672530d21/image.png

Laptop Mission Sound

https://velog.velcdn.com/images/lutca1320/post/17bce915-e1ba-4645-b492-014f821459bf/image.gif
Laptop Crack 을 진행하다가 보면 30%, 80% 에서 경고음이 크게 울린다. 적들이 남아있다면, 이 소리를 듣고 몰려온다.

Stage Clear

https://velog.velcdn.com/images/lutca1320/post/f51d7bd7-ae68-47f2-82ad-ea4fbc3733c4/image.gif
모든 미션을 달성하면 탈출구가 열린다.

MissionController.cs

1using System.Collections;
2using System.Collections.Generic;
3using System.Linq;
4using Unity.VisualScripting;
5using UnityEngine;
6using UnityEngine.UI;
7
8public enum MissionStatus
9{
10    IN_PROGRESS,
11    COMPLETE,
12    FAILED
13}
14
15[System.Serializable]
16public class Mission
17{
18    public MissionStatus currentStatus = MissionStatus.IN_PROGRESS;
19    public string name;
20    public Text uiText;
21    public Mission parentMission = null;
22    public List<Mission> subMissionList;
23
24    public Mission(string name, Text uiText)
25    {
26        this.name = name;
27        this.uiText = uiText;
28        subMissionList = new List<Mission>();
29    }
30
31    public Mission(string name, Text uiText, List<Mission> subMissionList)
32    {
33        this.name = name;
34        this.uiText = uiText;
35        this.subMissionList = subMissionList;
36        subMissionList.ForEach(sm => sm.parentMission = this);
37    }
38}
39
40public class MissionController : MonoBehaviour
41{
42    private List<Mission> missionList;
43    private bool isStageCleared = false;
44    private void Start()
45    {
46        missionList = new List<Mission>();
47
48        missionList.Add(new Mission("Main01", transform.Find("Main01").GetComponent<Text>(), new List<Mission>
49        {
50            new Mission("Main01_01", transform.Find("Main01").GetChild(0).GetComponent<Text>()),
51            new Mission("Main01_02", transform.Find("Main01").GetChild(1).GetComponent<Text>()),
52            new Mission("Main01_03", transform.Find("Main01").GetChild(2).GetComponent<Text>())
53        }));
54        missionList.Add(new Mission("Main02", transform.Find("Main02").GetComponent<Text>()));
55    }
56
57    private Mission GetMission(string name)
58    {
59        Mission mission = null;
60        foreach (var m in missionList)
61        {
62            if (m.name == name)
63            {
64                mission = m;
65                break;
66            }
67
68            foreach (var sm in m.subMissionList)
69            {
70                if (sm.name != name) continue;
71                mission = sm;
72                break;
73            }
74        }
75
76        return mission;
77    }
78
79    public bool SetMissionStatus(string name, MissionStatus newStatus)
80    {
81        var mission = GetMission(name);
82        if (mission == null) return false;
83
84        mission.currentStatus = newStatus;
85        if (mission.parentMission != null)
86        {
87            if (mission.parentMission.subMissionList.All(sm => sm.currentStatus == MissionStatus.COMPLETE))
88            {
89                SetMissionStatus(mission.parentMission.name, MissionStatus.COMPLETE);
90            }
91            else if (mission.parentMission.subMissionList.Any(sm => sm.currentStatus == MissionStatus.FAILED))
92            {
93                SetMissionStatus(mission.parentMission.name, MissionStatus.FAILED);
94            }
95        }
96
97        UpdateUI(mission);
98        if (missionList.All(m => m.currentStatus == MissionStatus.COMPLETE)) StageClear();
99        return true;
100    }
101
102    private void UpdateUI(Mission mission)
103    {
104        Color color;
105        switch (mission.currentStatus)
106        {
107            case MissionStatus.COMPLETE:
108                color = new Color(0, 1, 0);
109                break;
110            case MissionStatus.FAILED:
111                color = new Color(1, 0, 0);
112                break;
113            case MissionStatus.IN_PROGRESS:
114            default:
115                color = new Color(1, 1, 1);
116                break;
117        }
118
119        mission.uiText.color = color;
120    }
121
122    private void StageClear()
123    {
124        if (isStageCleared) return;
125        GameObject.Find("ExitDoor").SendMessage("OpenDoor");
126        isStageCleared = true;
127    }
128}
129