Unity 게임 개발 최종 팀 프로젝트(15주차 5일)
🔥 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일 월요일 목표 🔥
🔍 팀 프로젝트 유저테스트준비