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

HACK UI

  • Player UI (HUD)
  • Enemy UI (인디케이터)
  • Turret, Laptop Hack UI

UI

Laptop Hack

미션 중 하나로, Laptop 을 Interact 하면 나오는 UI이다.
https://velog.velcdn.com/images/lutca1320/post/60898a74-1578-4781-aaaa-b44f7307aabb/image.gif

Turret Hack

이것도 미션 중 하나로, Turret 을 Interact 하면 나온다.
https://velog.velcdn.com/images/lutca1320/post/9cd388fc-35b7-4ccd-be4b-2a6b9f782ed2/image.gif
100% 까지 진행했을 경우, SUCCESS 로 바뀌며 연결된 Turret 이 비활성화된다.
https://velog.velcdn.com/images/lutca1320/post/673dcbef-6421-478e-8ab7-fc085596f434/image.gif

Code

LaptopInteract.cs

1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4using UnityEngine.UI;
5
6public class LaptopInteract : MonoBehaviour
7{
8    private PlayerUI playerUI;
9    private Canvas canvas;
10    private Text hackText;
11    private Text percentText;
12    private RectTransform rootRect;
13    private RectTransform gageRect;
14    private AudioSource audioSource;
15
16    private RobotInputHandler callerInput;
17    private float gage = 0;
18    private bool success = false;
19
20    public Material onMaterial;
21
22    public void Interact(GameObject caller)
23    {
24        playerUI.HideInteractUI();
25        playerUI.SetInteractDescription("");
26        canvas.gameObject.SetActive(true);
27        callerInput = caller.GetComponent<RobotInputHandler>();
28
29        transform.parent.GetComponent<MeshRenderer>().material = onMaterial;
30    }
31
32    private void LocateUI()
33    {
34        var screenPos = Camera.main.WorldToScreenPoint(transform.parent.position);
35        RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, screenPos,
36            canvas.worldCamera, out Vector2 movePos);
37
38        rootRect.position = canvas.transform.TransformPoint(movePos + new Vector2(50, 50));
39    }
40
41    private void OnSuccess()
42    {
43        success = true;
44        hackText.text = "SUCCESS";
45        hackText.color = new Color(0, 1, 0);
46
47        playerUI.GetComponentInChildren<MissionController>().SetMissionStatus("Main02", MissionStatus.COMPLETE);
48    }
49
50    private void StartBeep()
51    {
52        audioSource.Play();
53
54        foreach (var robot in GameObject.FindGameObjectsWithTag("Robot"))
55        {
56            var soundSensor = robot.GetComponentInChildren<AISoundSensor>();
57            if (soundSensor) soundSensor.OnSoundHear(audioSource.maxDistance, transform.parent.position, transform.parent.gameObject, true);
58        }
59
60        StartCoroutine(StopBeep());
61    }
62
63    private IEnumerator StopBeep()
64    {
65        yield return new WaitForSeconds(0.8f * 10);
66        audioSource.Stop();
67    }
68
69    private void Start()
70    {
71        playerUI = GameObject.Find("PlayerUICanvas").GetComponent<PlayerUI>();
72        canvas = transform.parent.GetComponentInChildren<Canvas>(true);
73        hackText = canvas.transform.GetChild(0).Find("HACK").GetComponent<Text>();
74        percentText = canvas.transform.GetChild(0).Find("Percent").GetComponent<Text>();
75        rootRect = canvas.transform.GetChild(0).GetComponent<RectTransform>();
76        gageRect = canvas.transform.GetChild(0).Find("Back").GetChild(0).GetComponent<RectTransform>();
77        audioSource = transform.parent.GetComponentInChildren<AudioSource>();
78    }
79
80    private void Update()
81    {
82        gage = Mathf.Clamp(gage + Time.deltaTime * (callerInput != null && callerInput.holdInteract ? 4 : 0), 0, 100);
83        percentText.text = (int)gage + " %";
84        gageRect.sizeDelta = new Vector2(gage * 1.65f, gageRect.sizeDelta.y);
85        LocateUI();
86
87        if (((30 <= gage && gage <= 31) || (80 <= gage && gage <= 81)) && !audioSource.isPlaying)
88        {
89            StartBeep();
90        }
91
92        if (gage >= 100)
93        {
94            if (!success) OnSuccess();
95        }
96    }
97
98    private void OnTriggerEnter(Collider other)
99    {
100        if (playerUI == null || other.name != "Player") return;
101        playerUI.ShowInteractUI(transform.parent.gameObject);
102        playerUI.SetInteractDescription("HACK");
103    }
104
105    private void OnTriggerExit(Collider other)
106    {
107        if (playerUI == null || other.name != "Player") return;
108        canvas.gameObject.SetActive(false);
109        playerUI.HideInteractUI();
110        playerUI.SetInteractDescription("");
111    }
112}
113

TurretTowerInteract.cs

1using System;
2using System.Collections;
3using System.Collections.Generic;
4using UnityEngine;
5using UnityEngine.Rendering.Universal;
6using UnityEngine.UI;
7
8public class TurretTowerInteract : MonoBehaviour
9{
10    private PlayerUI playerUI;
11    private Canvas canvas;
12    private Text hackText;
13    private Text percentText;
14    private RectTransform rootRect;
15    private RectTransform gageRect;
16
17    private RobotInputHandler callerInput;
18    private float gage = 0;
19    private bool success = false;
20
21    public List<EnemyTurretAI> turretList;
22
23    public void Interact(GameObject caller)
24    {
25        playerUI.HideInteractUI();
26        playerUI.SetInteractDescription("");
27        canvas.gameObject.SetActive(true);
28        callerInput = caller.GetComponent<RobotInputHandler>();
29    }
30
31    private void LocateUI()
32    {
33        var screenPos = Camera.main.WorldToScreenPoint(transform.parent.position);
34        RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, screenPos,
35            canvas.worldCamera, out Vector2 movePos);
36
37        rootRect.position = canvas.transform.TransformPoint(movePos + new Vector2(50, 50));
38    }
39
40    private void OnSuccess()
41    {
42        success = true;
43        hackText.text = "SUCCESS";
44        hackText.color = new Color(0, 255, 0);
45
46        turretList.ForEach(turret =>
47        {
48            turret.Deactivate();
49            playerUI.GetComponentInChildren<MissionController>()
50                .SetMissionStatus("Main01_" + turret.name.Substring(7, 2), MissionStatus.COMPLETE);
51        });
52    }
53
54    private void Start()
55    {
56        playerUI = GameObject.Find("PlayerUICanvas").GetComponent<PlayerUI>();
57        canvas = transform.parent.GetComponentInChildren<Canvas>(true);
58        hackText = canvas.transform.GetChild(0).Find("HACK").GetComponent<Text>();
59        percentText = canvas.transform.GetChild(0).Find("Percent").GetComponent<Text>();
60        rootRect = canvas.transform.GetChild(0).GetComponent<RectTransform>();
61        gageRect = canvas.transform.GetChild(0).Find("Back").GetChild(0).GetComponent<RectTransform>();
62    }
63
64    private void Update()
65    {
66        gage = Mathf.Clamp(gage + Time.deltaTime * (callerInput != null && callerInput.holdInteract ? 8 : success ? 0 : -10), 0, 100);
67        percentText.text = (int)gage + " %";
68        gageRect.sizeDelta = new Vector2(gage * 1.65f, gageRect.sizeDelta.y);
69        LocateUI();
70
71        if (gage >= 100)
72        {
73            if (!success) OnSuccess();
74        }
75    }
76
77    private void OnTriggerEnter(Collider other)
78    {
79        if (playerUI == null || other.name != "Player") return;
80        playerUI.ShowInteractUI(transform.parent.gameObject);
81        playerUI.SetInteractDescription("HOLD");
82    }
83
84    private void OnTriggerExit(Collider other)
85    {
86        if (playerUI == null || other.name != "Player") return;
87        canvas.gameObject.SetActive(false);
88        playerUI.HideInteractUI();
89        playerUI.SetInteractDescription("");
90    }
91}
92