Unity 내배캠 TIL

Unity 게임 개발 최종 팀 프로젝트(15주차 5일)

오늘도즐겨 2025. 1. 3. 23:04

🔥 1월 3일 금요일 목표 🔥

🔍 팀 프로젝트 카메라정리

🔍 팀 프로젝트 가챠시스템 UI 정리

🔍 팀 프로젝트 오류 정리하기

 

📌카메라정리

👀AttackCamera - Inspector수정

 

👀AttackCamera - Script 수정

public void SkillBindTarget(ExecuteAttackCommandEvent commandEvent)
    {
        switch (commandEvent.IsDone)
        {
            case true:
                attackCamera.gameObject.SetActive(false);
                break;
            case false:
                if (commandEvent.PlayerUnit.type == UnitType.EnemyUnit) return;

                targetUnit = commandEvent.PlayerUnit.Requirement.cameraPoint;
                
                attackCamera.Follow = targetUnit.transform;
                attackCamera.LookAt = targetUnit.transform;                

                //if (attackTargetUnit == null) return;
                //Vector3 localOffset = new Vector3(2f, 0.5f, -2.5f);
                ////유닛의 로컬 오프셋을 월드 좌표로 변환
                //Vector3 worldOffset = targetUnit.TransformPoint(localOffset);                
                ////카메라 위치를 유닛 뒤쪽에 설정
                //attackCamera.transform.position = worldOffset;
                //Vector3 directionToTargetUnit = (targetUnit.position - attackCamera.transform.position).normalized;
                //attackCamera.transform.forward = directionToTargetUnit;                 
                
                attackCamera.gameObject.SetActive(true);
                break;
        }
    }

 

❓ 빈 오브젝트를 Look At 할 때 크게 두 가지 문제점이 발생할 수 있음.

    1. 스케일이 0,0,0 일 때, 회전 값이 제대로 작동 안할 수 있음.

    2.  빈 오브젝트가 다른 오브젝트와 상호작용할때, 제대로 인식되지 않을 수 있음.

 

💡 2번째 이유에서 오류가 발생했던 문제 였다...

     결국, 이벤트로 받아오는 타깃을 시네머신 카메라의 Follow와 LookAt에 바로 담아주니 해결이 됐다.

     스크립트로 관리하려던 것도 동일하게 하면 될 것 같지만,

     쉽게 시네머신으로 관리할 수 있게 되어 그냥 스크립트를 줄이고,

     시네머신 버츄얼 카메라로 전환시켜버렸다.

 

👀PassiveCamera - Script 수정

 

모든 Passive 카메라의 위치는 쿼터뷰의 포지션을 초기값으로 두고,

FOV값을 조정해 확대해주는 느낌을 주기로 했다.

어시스트 공격을 할 시에는 어시스트하는 유닛과 공격타깃의 위치값을 받아와

그 중간 지점을 LookAt포지션으로 설정해준다.

public void PassiveSkillBindTarget(ExecutePassiveAttackCommandEvent commandEvent)
{
    switch (commandEvent.IsDone)
    {
        case true:
            passiveCamera.gameObject.SetActive(false);
            break;
        case false:
            if (commandEvent.PlayerUnit.type == UnitType.EnemyUnit) return;
            
            passiveCamera.m_Lens.FieldOfView = 60f; // 기본 FOV 설정값 초기화
            passiveCamera.transform.position = quaterViewCamera.transform.position; //초기값은 쿼터뷰카메라포지션
            
            targetUnit = commandEvent.PlayerUnit.Requirement.cameraPoint;
            followTarget.position = targetUnit.position;
            attackTargetUnit = commandEvent.PassiveTargetUnit.Requirement.cameraPoint;
            attackTarget.position = attackTargetUnit.position;
            
            //TODO : 패시브 2명 동시 발생시, target유닛 설정 필요
            if (targetUnit == null || attackTargetUnit == null) return;
            if (commandEvent.PlayerUnit == commandEvent.PassiveTargetUnit) //자가 힐 일 경우
            {
                Vector3 direction = (targetUnit.position - passiveCamera.transform.position).normalized;
                passiveCamera.transform.forward = direction;
                passiveCamera.m_Lens.FieldOfView = 30f;
            }
            else
            {
                Vector3 midPoint = (targetUnit.position + attackTargetUnit.position) / 2f;
                passiveCamera.transform.LookAt(midPoint);
                passiveCamera.m_Lens.FieldOfView = 50f;
            }
            passiveCamera.gameObject.SetActive(true);
            break;
    }
}

 

📌가챠시스템 UI 정리

 

각각의 패널을 만들고 Scroll에 넣어줬음.

하지만, 하나의 패널을 만들고,

내부 데이터를 받아와서 수정하면 좋을 것 같다는

의견이 있어서, 변경해보려한다.

 

👀 각각의 가차 데이터 풀에 해당하는 패널 만들고,

     스크립트 작성해서 담아줌(Rare, Epic, Legendary, OnlyLegendary )

public class UILegendaryGachaPanel : UIBase
{
    [SerializeField] private TMP_Text unitCountText;
    [SerializeField] private TMP_Text oneAccessIconText;
    [SerializeField] private TMP_Text tenAccessIconText;
    [SerializeField] private Button oneAccessButton;
    [SerializeField] private Button tenAccessButton;

    void Start()
    {
        //TODO : 정보 세팅 되면 담아주기
        unitCountText.text = "1/260";
        oneAccessIconText.text = "X50";
        tenAccessIconText.text = "X500";
        oneAccessButton.onClick.AddListener(()=> OnClickOneAccessBtn());
        tenAccessButton.onClick.AddListener(()=> OnClickTenAccessBtn());
    }

    public void OnClickOneAccessBtn()
    {
        if (Core.CurrencyManager.Spend<Shard>(50) == false)
            //TODO : 금액이 부족하다는 캔버스 오픈예정
            return;
        Core.DataManager.GachaCount = 1;
        Core.SceneLoadManager.LoadScene("GachaScene");
    }
    public void OnClickTenAccessBtn()
    {
        if (Core.CurrencyManager.Spend<Shard>(500) == false)
        {
            Core.UIManager.OpenUI<UIGachaWarningPanel>();
            return;
        }
        Core.DataManager.GachaCount = 10;
        Core.SceneLoadManager.LoadScene("GachaScene");
    }
}

 

📌 스킬 인디케이터 오류 정리하기

 

 

 

 

🔥 1월 6일 월요일 목표 🔥

🔍 팀 프로젝트  유저테스트준비