분류 전체보기 72

57일차 - Abyss_Slayer 최종 팀 프로젝트 7 (아처 스킬 수정)

오늘은 투사체 증가 버프를 사용했을 때 지속시간 동안 추가되는 투사체가 같이 발사되어야 하는데 한발이 발사될 때가 있고 두발이 발사될 때가 있어서 이 문제를 해결하는데 대부분의 시간을 썼다. ▶▷ 트러블 슈팅막히는 점투사체 증가 버프 사용 시 버프 지속시간 동안은 2발이 정확히 발사 되어야 하는데 중간중간 1발만 발사되는 현상.원인디버그 로그를 찍고 인스펙터 창에서 플래그의 상태가 어떤지 확인해보았지만 문제 원인을 찾지 못함.예상치 못한 부분에서 코루틴 중단으로 인한 현상으로 추측.시도한 점버프를 사용하는 시점과 끝나는 시점, 추가 화살이 생성되지 않을 경우의 디버그 로그를 출력시켜보았으나 문제가 확인되지 않음.직렬화를 통해 인스펙터 창에서 버프가 끊기는지도 확인해봤는데 문제가 확인되지 않음코루틴을 사용..

56일차 - Abyss_Slayer 최종 팀 프로젝트 6 (투사체 오브젝트 풀링 2, 투사체 증가 버프)

오늘은 어제 있었던 오브젝트 풀링 관련 문제를 해결하고 각 스킬의 투사체 적용 방식을 변경하였다.▶▷ 오브젝트 풀링 트러블 슈팅막히는 점풀이 정상적으로 생성되지 않아 스킬을 사용하면 null 오류가 발생하는 현상원인현재 풀을 만드는 방식이 스크립트 타입을 키로 가져와서 만드는데 팀원께서 미리 만들어두신 보스 관련 풀 중에 스크립트가 잘못 할당되어 겹치는 부분이 있어서 같은 키가 인식되는 바람에 오류가 생겨 밑에 추가한 플레이어 전용 풀이 생성되지 않음해결중복되는 보스 관련 스크립트를 알맞은 스크립트로 변경 ▶▷ 투사체 적용 방식 변경기존에는 스킬마다 이펙트가 구분돼야 하기 때문에 이를 나누기 위해 각각의 투사체 프리펩 자체를 다르게 하려고 했다.그런데 현재 풀에 대한 로직이 프리펩이 나눠지게 되면 해당 ..

55일차 - Abyss_Slayer 최종 팀 프로젝트 5 (투사체 오브젝트 풀링 1)

▶▷ 오브젝트 풀링오브젝트 풀링이란 간단히 설명하자면 공간을 미리 생성해 두고 그 안에서 오브젝트를 생성 및 반환을 하는 기법으로자주 생성되는 오브젝트를 효율적으로 다루기 위해 사용한다.지금 내가 구현하는 부분에서는 플레이어 스킬의 화살을 예로 들 수 있다.화살은 게임 내내 생성되었다 파괴되었다 해야하는데 이걸 매번 Instantiate 하고 Destroy하면 성능에 영향을 미칠 수 있다.그렇기 때문에 최적화를 위해서라면 정말 중요한 기법이다.팀원이 먼저 싱글톤으로 제작한 PoolManager, 반환과 초기화를 담당하는 추상 클래스인 BasePoolable,그리고 이 추상 클래스를 상속 받는 ObjectPool을 통해 기존에 화살을 단순히 생성 및 파괴를 했던 구조에서오브젝트 풀링을 사용하는 방식으로 변..

54일차 - Abyss_Slayer 최종 팀 프로젝트 4 (아처 스킬 구현)

▶▷ 아처 평타일반 공격은 어제에 이어서 일부 로직을 추가하였다.public class Arrow : MonoBehaviour{ [SerializeField] private int damage = 50; // 화살 데미지 private float maxRange; private Vector3 spawnPosition; private void Update() { if (Vector3.Distance(spawnPosition, transform.position) >= maxRange) { Destroy(gameObject); } } public void SetRange(float range) { ..

53일차 - Abyss_Slayer 최종 팀 프로젝트 3 (스킬셋, 스킬 로직)

▶▷ 스킬셋 구현SkillSet.cs[CreateAssetMenu(menuName = "Skill/SkillSet")]public class SkillSet : ScriptableObject{ public string className; // 어떤 직업의 스킬셋인지 public List skillSlots = new(); // 연결된 스킬 리스트}SkillSlot.cs[System.Serializable]public class SkillSlot{ public SkillSlotKey key; // key들이 포함된 enum public SkillData skillData; // 연결된 실제 스킬 데이터 (..

52일차 - Abyss_Slayer 최종 팀 프로젝트 2 (스킬 데이터 구조 구성)

▶▷ 스킬 데이터 관리타겟팅 정보, 스킬 종류, 실행 메소드를 담은 추상화 클래스, 실제 스킬 로직을 담은 ScriptableObject를 스킬의 공통되는 요소를 담는 SkillData에 담는 구조이다.직업의 폴더 구조는 위와 같다.각 스킬별로 폴더를 나누어 해당 키에 대응하는 스킬마다 데이터는 3개가 들어간다. ArcherSkill_x.cs[CreateAssetMenu(menuName = "Skill/Archer/Archer_x")]public class ArcherBasicAtk : SkillExecuter{ public override void Execute(Character user, Character target, SkillData skillData) { // 스킬 로직 ..

51일차 - Abyss_Slayer 최종 팀 프로젝트 1 (전체 구조 설계) , 3D 최적화

▶▷ 구조 설계이번에 최종 프로젝트로 제작할 게임은 2D 횡스크롤 멀티 보스레이드 게임이다.조작은 모두 키보드로 이루어진다.이동: 방향키점프: c기본공격: x회피: z스킬: a, s, d직업은 우선 탱커, 힐러, 궁수, 마법사, 마검사 등 5가지가 있고 추후에 추가될 예정이다. 각 직업은 3가지의 고유 스킬이 있으며 각각의 특성을 뚜렷하게 해서 골고루 파티를 꾸려야 게임이 수월하게 진행되도록 만들 예정이다. 전체적인 게임의 흐름을 나타낸 차트이다. 방에 들어간 다음 난이도를 선택하고 파티원을 모을 수 있다. 그러면 전투 준비 장소로 이동하게 되고 각자 할 일을 마친 다음 전투가 시작된다. 클리어 하면 죽은 파티원도 부활이 되고 전투 준비 장소로 이동한다.파티원이 전부 죽은 경우엔 게임이 오버되고 시작화면..

50일차 - RPGProject 팀 프로젝트 마무리

이번 프로젝트의 시연 영상이다. 품절 기능 같은 경우 팀장님이 인벤토리와의 연동을 위해 로직을 바꾸다보니 누락되었지만 필수적인 기능들은 포함되었다.시간이 하루만 더 있었어도 어색한 부분을 많이 다듬고 더 테스트 해보았을텐데 이번 프로젝트는 기간이 좀 짧아 미흡한 부분이 많았던 것 같다. 발표를 하면서 받은 피드백으로는 어떠한 방법을 사용해서 기존의 방식에서 더 효율적이거나 더 좋게 구현했다면사용했다는 사실만 작성할 것이 아니라 해당 방법을 사용함으로써 어떤 부분이 어떻게 개선되었는지 기존과 비교하여 작성하고 설명하는 것이 중요하다는 점이다. 그리고 여러 방식 중 한가지를 사용한 경우 해당 방식을 선택한 이유 또한 설명할 수 있어야 한다.

49일차 - RPGProject 팀 프로젝트 5

▶▷ 판매, 구매판매 목록에서 클릭 시 구매가 가능하고 보유 목록에서 클릭 시 판매가 가능하도록 구현했다private void InitShopSlot(){ // 기존 슬롯들 삭제 foreach (Transform child in slot) { Destroy(child.gameObject); } shopSlots.Clear(); // 슬롯 리스트 초기화 // 새로운 슬롯들을 생성하여 상점에 추가 for (int i = 0; i 슬롯이 추가되는 기준이 데이터의 유무이기 때문에 아이템을 구매하면 슬롯에서 데이터를 받아와 인벤토리 아이템 데이터 리스트에 Add를 하고판매하면 Remove를 한 다음 Init~~ 메소드를 통해 초기화 시켜주면 데이터에 맞춰 슬롯이 ..

48일차 - RPGProject 팀 프로젝트 4

▶▷ 상점 슬롯에 아이템 데이터 및 아이콘 적용아이템 데이터 필드를 만들고 해당 데이터의 개수에 따라 슬롯이 추가되도록 구현하였다.ShopSlot.cspublic void SetShopItem(ItemData data){ itemData = data; // 아이템 데이터 설정 // 아이템 아이콘이 없는 경우 경고 메시지 출력 if (itemData.icon == null) { Debug.LogAssertion("itemData.icon 없음"); } else { // 아이템 아이콘을 버튼에 설정 shopItemIcon.sprite = itemData.icon; }}private void SelectShopItem(){ ..