Print Friendly and PDF

Unity 31

[이론] Generic과 Reflection

Generic이란?- 형태로 타입을 매개변수화하여 코드 재사용성과 타입 안정성, 성능을 동시에 확보 가능한 기능 입니다. Generic vs Object- 둘은 유사해보이지만 차이가 큽니다.- Object는 런타임에 박싱/언박싱이 발생하여 GC압박과 런타임 도중 에러가 발생할 가능성이 있습니다.- Generic은 컴파일때 타입이 결정이 되어 박싱이 없고 문제가 생기면 컴파일 타임 에러로 안정성을 보장합니다.// object - 박싱 발생, 런타임 에러object value = 10; // 박싱int result = (int)value; // 언박싱// Generic - 박싱 없음, 컴파일 타임 체크List list = new List();list.Add(10); // 박싱 없음 Generic 제약 조건(..

[이론] Unity Physics시스템과 Collision 처리

Physics 시스템의 작동 원리- 물리 연산은 성능과 관계없이 물리 시뮬레이션을 보장해야하기 때문에 Fixed Updata 타이밍으로 실행 됩니다.*Fixed Udpate는 프레임이 아닌 시간 간겨으로 실행되기 때문에 보장 됩니다. RigidBody 이동 방식방법특징사례Rigidbody.MovePosition물리 엔진에 이동 의도 전달, 충돌 감지 유지Kinematic 오브젝트 이동Rigidbody.velocity속도 즉시 설정점프 및 즉각적인 속도 변경Rigidbody.AddForce질량, 마찰 등 고려한 힘을 가함현실적인 가속/감속*transform.position 이동은 물리 엔진을 무시하고 순간이동 하는 방식으로 작동 됩니다. Collision vs Trigger공통점- 최소 한쪽은 Rigidb..

[C# 기초이론] 델리게이트와 이벤트 완전 정리

1. 델리게이트(Delegate) 기본 개념정의메서드의 참조를 저장하고 실행할 수 있는 타입입니다. 함수 포인터의 안전한 버전으로 생각할 수 있습니다.사용자 정의 델리게이트 vs Action/Func// 사용자 정의 델리게이트public delegate void PlayerDeathDelegate(Player player, DeathCause cause);// Action 사용 (반환값 없음)public Action onPlayerDeath;// Func 사용 (반환값 있음)public Func calculate;차이점과 선택 기준 구분 사용자 정의 델리게이트Action/Func매개변수 제한무제한최대 16개ref/out 지원가능불가능가독성의미있는 이름 부여제네릭 타입명사용 편의성타입 정의 필요즉시 사용 ..

[3매치 게임] 스코어

이번 시간엔 블록 매치에 성공하면 점수를 획득하도록 하겠습니다. public class UI_Match_Block : MonoBehaviour{ [Header("점수")] [SerializeField] int _score; public int GetScore() => _score; public static event Action _mathcomplte_event; //..이하 생략}- 우선 인스펙터에서 점수를 조정해줍니다. using System;using UnityEngine;public class ScoreManager : MonoBehaviour{ public static event Action _add_score_event;//스코어 획득 이벤트 int _curr..

[3매치 게임] 블록 이동 및 재생성

이번 시간엔 블록이 매치되고 난 후에 블록 이동 후 빈 공간만큼 블록 재생성하는 것을 만들어 보겠습니다.플로우 차트- 이동이나 블록이 매치된 후에 먼저는 있던 블록을 전체적으로 이동 시켜줍니다.- 이동시킨 후 빈 공간만큼 블록을 새로 생성한 후 다시 전체 이동을 진행해주면 끝입니다. 블록 재셋팅 함수 //MatchFiledManager.csasync UniTaskVoid FiledReSetting() { _issetting = true; //모든 기능이 다 종료되었을때 진행 await UniTask.WaitUntil(() => (bool)_match_setting_check_event?.Invoke() == false); //새롭게 생성해야할 블록이 있는지 체..

[3매치 게임] 블록 이동 및 개별 매치

이번 시간엔 블록 이동과 이동된 블록을 기준으로 매치하는 기능을 만들려고 합니다. 이 기능 또한 플로우 차트로 설명하기에 뭔가 난해한 것 같아 글로 간략하게 적거 지나가도록 하겠습니다. 구현 설명:1. 블록 클릭 시 정보를 저장합니다.2. 클릭한 상태로 드래그하여 다른 블록으로 이동하여 해당 블록에 마우스(손가락)이 닿아 Trigger Enter이 됐을 때3. 두 블록의 위치를 이동 시킨 후 매치 기능 실행 코드를 보겠습니다.public void Event_Point_Down() { _point_down_event?.Invoke(this); } public void Event_Point_Up() { _point_up_event?.Invoke(); } ..

[3매치 게임] 3매치 필드, 슬롯, 블록 생성

이번 시간엔 3매치 게임에서의 필드와 슬롯, 블록을 생성하는 걸 만들어보려 합니다. 필드란?- 현재 이 맵을 3x3으로 할지 4x4로할지 데이터를 받아오는 역할로 사용하려 합니다. 슬롯이란?- 블록 뒤쪽에 있는 검정색 슬롯을 얘기합니다. 얘를들어 3x3이면 가로 세로 3개씩 만들어질 것이고 4x4면 4개씩 생성되는 일종의 맵?이라고 보면 될 것 같습니다. 블록이란?- 빨간색 별과 같은 것들을 얘기합니다. 플로우 차트1. 간단한 흐름을 우선 만들었습니다. 필드에서 현재 챕터와 스테이지에 맞는 데이터를 가져옵니다.2. 가져온 데이터를 이용해 슬롯을 만듭니다.3. 슬롯 위치를 기반으로 블록을 최상단에 생성합니다.4. 생성이 완료되었으면 블록을 전체 이동처리한 후 마무리 합니다. 위 흐름을 관리하고 처리하는 건..

[3매치 게임] 3매치 게임 제작

안녕하세요 이번엔 3매치 게임 제작을 진행해보려고 합니다. Git Link : 바로가기 GitHub - leehyoenjong/PuzzleGame: 퍼즐게임 포트폴리오퍼즐게임 포트폴리오. Contribute to leehyoenjong/PuzzleGame development by creating an account on GitHub.github.com 목차1. 3매치 필드, 슬롯, 블록 생성2.블록 위에서 아래로 떨어지는 기능 추가3. 3매치 기능 추가4. 블럭 터치를 이용해 이동 기능 구현5. 빈 블럭만큼 재생성 추가6. 스코어 추가7. 클리어 조건 추가8. 4칸 매치 - 가로,세로 모든 블럭 제거 특수블럭 추가9. 5칸 매치 - 터치한 색 모두 제거하는 특수블럭 추가10. +자 매치 - 정사각형 ..

[디펜스 게임] 패치 서버

이번 시간엔 패치서버 추가를 진행해보려 합니다.Addressable추가 후 Remote모드로 해서 패치 여부 확인한 다음 패치하도록 해보겠습니다. 자세한 어드레서블 내용은 여기를 확인해주세요 Addresaable 추가- Addressable을 추가한 후 그룹 설정을 해줍니다. 이제부터 어떤 것을 패치할지 생각해보겠습니다.일단 DataManager에서 불러오고 있는 테이블 데이터를 패치하면 좋을 것 같아 넣어보겠습니다. 테이블 데이터 어드레서블 추가- Insapertor에 체크하면 Groups에 추가 됩니다.- 추가 후 불러올 각 키 명을 넣어주면 좋습니다. 전체 추가 해보겠습니다.- Skill이나 개별 hero/monster들은 할 필요 없습니다. 왜냐하면 최상단인 Table에서 모두 참조하고 있기 때..

[디펜스 게임] 풀링

게임이 어느정도 완성이 되었습니다. 이제 슬 최적화 작업인 풀링을 추가해보겠습니다.풀링을 간략하게 설명하자면 기존 생성/파괴로 이뤄진 것을 활성화/비활성화로 변경하는 것입니다. 플로우 차트 PoolSystem_Monster 클래스 추가using System.Collections.Generic;using UnityEngine;public class PoolSystem_Monster : MonoBehaviour{ public static PoolSystem_Monster instance; Dictionary> _mon = new Dictionary>(); void Awake() { instance = this; Monster_Base._monster_die_a..