프로젝트/프로젝트 A

# 027 Portfolio video (with. perf)

효따 2025. 9. 22. 19:02

https://github.com/Kimhyogyeom/ProjectA

 

GitHub - Kimhyogyeom/ProjectA: Unity-MOBA-Prototype

Unity-MOBA-Prototype. Contribute to Kimhyogyeom/ProjectA development by creating an account on GitHub.

github.com

 


 

 

 


안녕하세요.

 

오늘은 프로젝트의 전체 요약본 영상을 녹화해 보았습니다.

 

시간을 3~4분으로 줄여보려고 했지만.. 쉽지 않더라고요.

 

그래도 7분 이내로 세이브했습니다.🤣

 

 

 


 

추가로 

 

Tap 키를 누르면 Score Board가 나오게 작업을 해주었습니다.

 


 

ScoreBoardController 스크립트

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class ScoreBoardController : MonoBehaviour
{
    public int playerLevel = 1;
    public int playerDeathCount = 0;
    public int turretBreakCount = 0;
    public int creepScore = 0;

    [SerializeField] private TextMeshProUGUI playerLevelText;
    [SerializeField] private TextMeshProUGUI playerDeathCountText;
    [SerializeField] private TextMeshProUGUI turretBreakCountText;
    [SerializeField] private TextMeshProUGUI creepScoreText;


    [SerializeField] private GameObject scoreBoardUI;
    private KeyCode keyCode = KeyCode.Tab;

    void Update()
    {
        if (Input.GetKeyDown(keyCode))
        {
            playerLevelText.text = playerLevel.ToString();
            playerDeathCountText.text = playerDeathCount.ToString();
            turretBreakCountText.text = turretBreakCount.ToString();
            creepScoreText.text = creepScore.ToString();
            scoreBoardUI.SetActive(true);
        }
        if (Input.GetKeyUp(keyCode))
        {
            scoreBoardUI.SetActive(false);
        }
    }
}

 

PlayerLevel / DeathCount / TurretBreakCount / CreepScore

은 외부에서 추가를 해 줄 것이기에 public으로 선언을 해주었습니다.

 

다음은 Update()에서 keyCode인 Tab으로 

GetKeyDown / GetKeyUp을 활용해

 

Board 오브젝트를 활성 / 비활성화해주었습니다.

 

Update()에서 즉시 Text에 동기화를 해줄 수도 있지만,

쓸데없는 비용을 줄이기 위함입니다.

 


 

다음으로는 FindGameObjectWithTag의 방식을 없애기입니다.

 

FindGameObjectWithTag는

 

비용이 매우 큰 작업으로 알고 있습니다.

 


 

 

그렇기에 기존에 만들어둔 EnemyManager 스크립트의 minions List를 활용하였습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyManager : MonoBehaviour
{
    public static EnemyManager Instance;

    public List<GameObject> minions = new List<GameObject>();

    void Awake()
    {
        Instance = this;
    }

    public void RegisterMinion(GameObject minion)
    {
        if (!minions.Contains(minion))
            minions.Add(minion);
    }

    public void UnregisterMinion(GameObject minion)
    {
        if (minions.Contains(minion))
            minions.Remove(minion);
    }

    public List<GameObject> GetMinions()
    {
        return minions;
    }
}

 


 

    private void UpdateTarget()
    {

        // Transform closestMinion = GetClosestObjectInRadius(GameObject.FindGameObjectsWithTag(minionTag), aggroRange);
        Transform closestMinion = GetClosestObjectInRadius(EnemyManager.Instance.minions, aggroRange);

        if (closestMinion != null)
        {
            currentTarget = closestMinion;
        }
        else
        {
            // Transform closestTurret = GetClosestObject(GameObject.FindGameObjectsWithTag(turretTag));
            Transform closestTurret = GetClosestObject(turretArray);

            if (closestTurret != null)
            {
                currentTarget = closestTurret;
            }
            else
            {
                currentTarget = nexusObj != null ? nexusObj.transform : null;
            }
        }
    }

    private Transform GetClosestObject(GameObject[] objects)
    {
        float closestDistance = Mathf.Infinity;
        Transform closestObject = null;
        Vector3 currentPosition = transform.position;

        foreach (var obj in objects)
        {
            if (obj != null)
            {
                float distance = Vector3.Distance(currentPosition, obj.transform.position);

                if (distance < closestDistance)
                {
                    closestDistance = distance;
                    closestObject = obj.transform;
                }
            }
        }
        return closestObject;
    }

    private Transform GetClosestObjectInRadius(List<GameObject> objects, float radius)
    {
        float closestDistance = Mathf.Infinity;
        Transform closestObject = null;
        Vector3 currentPosition = transform.position;

        foreach (var obj in objects)
        {
            if (obj.tag == minionTag)
            {
                float distance = Vector3.Distance(currentPosition, obj.transform.position);

                if (distance < closestDistance && distance <= radius)
                {
                    closestDistance = distance;
                    closestObject = obj.transform;
                }
            }

        }
        return closestObject;
    }

 

Enemy가 이동되는 탐색 로직을 위와 같이 변경시켜 주었으며,

 

Turret 또한 Enemy의 탐지 방식을 동일하게 적용시켜 주었습니다.

 

생성된 Enemy를 List로 관리함으로 인해

 

훨씬 더 비교적 손쉽게(?) 해결을 할 수 있었습니다.

 


 

마지막으로 플레이어의 대미지를 높게 올려 영상으로 살펴보겠습니다.

 

 


 

영상을 녹화하면서 뭔가 

 

재미를 줄 수 있는 부분들이 뭐가 있을지 고민이 되었습니다.

 

 

현재 생각나는 것이

 

Mission 부여 / / 함정 / 설정 / Ctrl + 1~4 모션 등이 있는데요

 

 

현재 ProjectB 를 기획함에 있어

 

ProjectA의 작업은 블로그에 업로드 하지 않고, 

 

ProjectB 프로젝트의 작업과 병행 하면서

 

Git에 Commit만 올리는 방식으로 진행하겠습니다.

 


 

감사합니다.

 

 

 

 

'프로젝트 > 프로젝트 A' 카테고리의 다른 글

# 026 Git (with. ScriptableObject)  (3) 2025.09.01
# 025 Victory (with. DOTween)  (4) 2025.08.30
# 024 GameManager (with.production)  (2) 2025.08.30
# 023 Object Icon (with. Minimap Drag & Click)  (2) 2025.08.29
# 022 Map Design  (4) 2025.08.28