- 개발엔진 : Unity5(2020.3.30)
- 개발기간 : 2022.04 ~2023.09
- 출 시 : 2023.10
- 게임설명 : 프랑켄슈타인의 원작소설을 바탕으로하며, 갈바니즘 이론(전기능력)을 주된 기믹으로 스테이지를 클리어하는 잠입, 퍼즐, 액션 게임
- 공모전
- 2022.08. ➡️ BIGS 출품 : 방구석 인디게임쇼 2022 온라인 전시
- 2023.08. ➡️ BIC 전시 : 부산인디게임페스티벌 2023 오프라인 전시
- 크라우드 펀딩
- 2022.12. ➡️ 텀블벅 크라우드 펀딩 : 크라우드펀딩을 통해 목표금액의 665% 달성
-
게임 플레이 메인 프로그래머
- 플레이어 조작, 스킬, 성장
- 게임 기믹 장치
- 기반 시스템 : Game Manager, ObjectPool System, Database, Steam API
-
쉐이더 프로그래머
- 스텐실 쉐이더
구현 기술에 대한 설명이 필요한 주된 메커니즘들을 설명합니다스킬 : 뇌운, 블루프린트
장치 : 램프, 로렌치니, 파워뱅크
기반시스템 : 스텐실 쉐이더, 오브젝트 풀링
구현목표
- 2D 탑다운 뷰의 게임에서 포물선 궤적과 투사체 투척을 표현
![]()
구현방법
- 라인렌더러를 이용하여 플레이어와 마우스사이 거리를 반주기로 하는 Sin 그래프를 통해 구현
- x 좌표 : 임의의 값(30)으로 구간을 설정 (좌표 개수 : 30개)
- y 좌표 : Sin그래프의 x 좌표로부터 얻어지는 값
![]()
코드
void DrawParabolicSkillTrajectory() { dist = Vector3.Distance(transform.position, GameManager.Instance.GetCurrentSceneT<InGameScene>().SkillSystem.worldMPos); for (float i = 0; i < lr.positionCount ; i++) { float b = GameManager.Instance.GetCurrentSceneT<InGameScene>(). SkillSystem.worldMPos; cachedPos = Vector3.Lerp(transform.position, b, (i + 2) / (pointCnt + 2)); // +2를 한 이유 : 발에서부터가 아닌 손에서부터이니까 cachedPos.y += Mathf.Min(dist, sinMaxScale) * Mathf.Sin(Mathf.PI / (pointCnt + 2) * (i + 2)); //sinScale * Mathf.Sin(Mathf.PI / dist * dist / pointCnt * i); //dist : Vector3.Distance(transform.position, Camera.main.ScreenToWorldPoint(screnMPos)); lr.SetPosition((int)i, cachedPos); } }구현결과
![]()
![]()
구현목표
- update()함수에 의해 매 프레임 기록되는 포인트 사이에서 방향 벡터 계산이 어려움 → 특정 거리마다 포인트를 기록하도록 변경
- 플레이어가 기록한 경로를 가시적으로 표현하는데 사용되는 포인트를 빈번하게 생성/파괴할 경우 부하가 생김 → 포인트를 오브젝트풀로 관리함
- 스킬 시전간에 플레이어가 반드시 마우스 포인트를 개구리에서부터 시작할 보장이 없었다 → 개구리와 최초 마우스 클릭 지점 사이를 보간하여 중간 경로 삽입
![]()
구현방법
라인 렌더러의 좌표도 너무 많을 경우 부하가 생기기때문에 특정 거리(0.5f)씩 마다 좌표를 찍는 방식으로 변경
void DrawMovingTrajectory() { if ( /* ...(조건A) */ && Vector3.Distance(lastPos, mousePos) >= TRAJECTORYINTERVAL && /* ...(조건C) */ ) //TRAJECTORYINTERVAL = 0.5f; { //최대 사용량을 초과할 경우 더 이상 그려지지 않는다 if (currentDT >= allowanceDT) { return; } //특정 거리(0.5f)마다 점 추가 시퀀스 AddTrajectoryPoint(Vector3.zero); } }화살표 오브젝트를 오브젝트 풀링하여 관리하면 빈번한 생성과 파괴를 피할 수 있다.
Queue<GameObject> pointPool = new Queue<GameObject>(); //포인트 풀 //화살표 오브젝트 풀 생성 void GeneratePointPool() { for (int i = 0; i < poolCount; i++) { pointPool.Enqueue(GeneratePoint()); } } //포인트 생성 함수 GameObject GeneratePoint() { GameObject go = Instantiate(point, transform); go.SetActive(false); return go; } //포인트 요청 GameObject GetPointFromQueue() { //예외처리를 통해 포인트가 없는 경우를 대비 try { return pointPool.Dequeue(); } catch { pointPool.Enqueue(GeneratePoint()); //추가 생산하여 인큐, return pointPool.Dequeue(); //그리고 반환 } }개구리와 최초 마우스 입력 위치가 0.5f 이상일 경우 그 사이를 0.5f단위로 보간하여 라인렌더러에 좌표를 삽입한다
bool InterpolateTrajectory() { // ... float interpolDist = Vector3.Distance(mousePos, critterPos); //개구리와 최초 마우스 입력 위치의 거리 계산 if (interpolDist < 0.6f) return true; //0.6미만이면 보간할 필요 없음(취소조건) //이후 거리에 따른 경로 보간 Vector3 interpolPos; int interpolCnt = (int)(interpolDist / TRAJECTORYINTERVAL); //보간 좌표 개수 for (float i = 1; i < interpolCnt; i++) { interpolPos = Vector3.Lerp(critterPos, mousePos, i / interpolCnt); //Lerp()를 이용한 보간 AddTrajectoryPoint(interpolPos); //if( 보간 취소 조건 ) return false; //더이상 경로를 그릴 수 없다 } return true; }
구현목표
- 특정한 오브젝트를 오브젝트 타입 색상으로 하이라이트하여 표시
- 그 외의 구조물은 더 어두운 검은색으로 표시
![]()
구현방법
- 특정 색상으로 표시하고자 하는 오브젝트에 스텐실 버퍼의 REF값 수정후 머테리얼이 적용
- 스킬 사용시 스텐실 버퍼 값과 비교하여 동일한 버퍼 값일 경우 필터의 색상을 채우는 필터를 활성화
- 배경과 이 외의 오브젝트는 스텐실 버퍼값이 그대로(REF 0) ➡️ REF 0에 검은색 적용
코드
Pass { Stencil { Ref [_StencilValue] Comp Greater Pass Replace //Fail IncrSat } //... }Pass { Stencil { Ref[_StencilValue] Comp Equal } /... }구현결과
![]()
구현목표
- 원형 콜라이더를 사용하기때문에, 벽 뒤에 있는 플레이어는 광원 밖 판정 구현
구현방법
- 벡터의 외적을 이용하여 플레이어와 램프의 위치관계 구분 후 광원 적용여부 판정
![]()
코드
Lamp lamp = collision.transform.parent.GetComponent<Lamp>(); if (lamp is Lamp) { Vector3 vectorPivot = collision.transform.parent.GetComponentInChildren<ParticleSystem>().transform.position; if (lamp.isWallLamp == false || //wallLamp가 아니면 바로 활성화 (lamp.isWallLamp == true && Vector3.Cross((playerCenterPos - vectorPivot).normalized, Vector3.right).z > 0)) //wallLamp면 벡터 조건 검사가 필요함 { IsVisible = true; ps.Updating_IsActiveReady(); } }구현결과
![]()
구현목표
- 플레이어 검출 레이더를 시각적으로 표현
- 최대 검출거리 안에 구조물이 있는 경우, 레이더 길이 조정
![]()
구현방법
- 라인렌더러의 끝 좌표를 삼각함수 좌표(Cos θ, Sin θ)로 적용하여 회전 표현
- 구조물에 레이더가 부딪히는 경우 반지름의 길이를 구조물까지의 거리로 변경
![]()
코드
// 라인렌더러를 삼각함수로 회전 void RotatingDetectRay() { float angle = curAngleTime / DEFAULT_SONARSPEED * 360; curRayPos.x = transform.position.x + Mathf.Cos(-angle * Mathf.Deg2Rad) * curSonarRadius; curRayPos.y = transform.position.y + Mathf.Sin(-angle * Mathf.Deg2Rad) * curSonarRadius; line.SetPosition(1, curRayPos); } // 레이케스팅으로 플레이어 검출 void DetectOnRay() { //레이케스팅을 정중앙(transform.position)에서부터 시작하지 않기위한 시작점 배치 RaycastHit2D hit = Physics2D.Raycast(transform.position + (curRayPos - transform.position).normalized * 0.8f, (curRayPos - transform.position).normalized, DEFAULT_SONARRADIUS, detectLayer); try { //충돌할 경우 레이 감소 if (hit.collider != null) { //레이 감소 curSonarRadius = Vector3.Distance(hit.point, transform.position); //레이 감소상태에서 플레이어일 경우 이벤트 발생 if (hit.collider.CompareTag("Player") && canDetect == true) /....구현결과
![]()
구현목표
- 커스텀 에디터를 통해 씬에 배치된 장치들을 파워뱅크에 연결하는 작업 소요시간 단축
구현방법
- 커스텀 에디터를 이용하여 레벨 작업 소요시간 단축
코드
// 에디터에 점 찍는 함수 private void OnSceneGUI() { if (powerLineConnector.isFinWriting == true) return; if (Event.current.type != EventType.MouseDown || powerLineConnector.isWriting == false) return; var mousePosition = Event.current.mousePosition * EditorGUIUtility.pixelsPerPoint; mousePosition.y = Camera.current.pixelHeight - mousePosition.y; var worldPosTmp = Camera.current.ScreenPointToRay(mousePosition).origin; var worldPos = new Vector3(Mathf.RoundToInt(worldPosTmp.x), Mathf.RoundToInt(worldPosTmp.y), 0); powerLineConnector.AddPoint(worldPos); } // 찍힌 점을 기반으로 라인렌더러 연결 public void Create_Line() { isFinWriting = true; int lineCnt = 0; try { powerSource = GetComponent<PowerSourceDevice>().powerSource; if (powerSource == null) throw new System.Exception("Power Source Binding First"); } catch(System.Exception e) { #if DEV Debug.LogWarning(e.Message); #endif return; } try { lineCnt = disConnectPoints.Count; } finally { for (int i = 0; i <= lineCnt; i++) { lineIdx = i; GameObject powerLine = new GameObject("PowerLine_" + i); Init_LineRenedere(powerLine); StartCoroutine(Connect_PowerLine(powerLine)); } } } void Init_LineRenedere(GameObject go) { go.tag = "PowerLine"; LineRenderer lr = go.AddComponent<LineRenderer>(); lr.gameObject.transform.SetParent(transform); Color lineColor; ColorUtility.TryParseHtmlString("#7F8C8C", out lineColor); lr.startColor = lineColor; lr.endColor = lineColor; lr.numCornerVertices = 5; lr.numCapVertices = 5; lr.startWidth = 0.1f; lr.endWidth = 0.1f; lr.sortingLayerID = SortingLayer.NameToID("Platform"); lr.sortingOrder = 2; lr.material = Resources.Load<Material>("PublicResources/Materials/Stencil_PowerLine"); } IEnumerator Connect_PowerLine(GameObject powerLine) { LineRenderer lr = powerLine.GetComponent<LineRenderer>(); Vector3[] points = connectPoints.ToArray(); int posIdx = 0; int disConnectPointIdx = lineIdx; disConnectPointIdx = disConnectPointIdx >= disConnectPoints.Count ? disConnectPoints.Count - 1 : disConnectPointIdx; //Point Setting stPos = lineIdx == 0 ? transform.position : disConnectPoints[lineIdx - 1].disConnectEnd; //Start Point lr.positionCount = 1; lr.SetPosition(posIdx++, stPos); //Middle Point int i = connectPoints.FindIndex(e => e == stPos); i = i < 0 ? 0 : i; for (; i < points.Length; i++) { lr.positionCount++; lr.SetPosition(posIdx++, points[i]); if (disConnectPoints.Count != 0 && //끊김포인트가 있고 points[i] == disConnectPoints[disConnectPointIdx].disConnectStart) //마지막 포인트가 끊김 시작포인트일 경우 { yield break; } } //End Point lr.positionCount++; lr.SetPosition(posIdx++, powerSource.transform.position); yield return null; #if UNITY_EDITOR UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()); #endif }구현결과
![]()
![]()
구현목표
- 벽 뒤의 플레이어를 시각적으로 표시
구현방법
- 벽보다 먼저 그려진 스텐실 버퍼값이 클 경우, 벽 버퍼값으로 수정
- 벽 버퍼값과 벽 필터 버퍼값이 같으면 필터적용
코드
// 플레이어 스텐실 Stencil { Ref[_StencilRef] // Ref 11 Comp[_StencilComp] //Always Pass Replace } // 벽 스텐실 Stencil { Ref [_StencilValue] // Ref 10 Comp Less // 플레이어 버퍼를 만나서 10으로 변경 Pass Replace } // 필터 스텐실 Stencil { Ref[_StencilValue] // Ref 10 Comp Equal // Ref 10인 경우 필터 색상 적용 }구현결과
![]()
구현목표
- 주로 사용하는 오브젝트들을 미리 생성하여, 잦은 생성/파괴로 인한 가비지 컬렉터 호출을 방지
- 오브젝트 풀이 비어있는 경우, 추가 생성 로직 구현
구현방법
- Queue를 형식의 풀을 이용함으로써 사용가능한 오브젝트 탐색 시간을 제거
코드
// Enum 으로 이펙트의 종류를 구분하여, List< Pool > 생성 // Pool은 Queue<T>로 생성하여, 사용가능한 오브젝트를 탐색하는 과정 제거 void GenerateSkillEffectPool() { skillEffectPool = new List<Queue<GameObject>>(); for (int i = 0; i < skillEffectPrefabs.Length; i++) { skillEffectPool.Add(new Queue<GameObject>()); for (int j = 0; j < skillEffectPrefabs[i].cnt; j++) { GameObject go = Instantiate(skillEffectPrefabs[i].skillEffectPrefab, skillEffectParent ); //Instantiate Prefab go.GetComponent<SkillEffect>().Initialize_SkillEffect(); skillEffectPool[i].Enqueue(go); } } } // 요청하는 이팩트의 타입을 Enum으로 구분 public void ServeSkillEffect(SkillEffectCode skillEffectCode, Vector2 spawnPos) { // 오브젝트가 없는 경우, 추가요청 if (skillEffectPool[(int)skillEffectCode].Count == 0) { skillEffectPool[(int)skillEffectCode].Enqueue( Additionally_GenerateSkillEffect(skillEffectCode) ); } GameObject go = skillEffectPool[(int)skillEffectCode].Dequeue(); go.GetComponent<SkillEffect>().Dequeue_SkillEffect(spawnPos); } // 오브젝트 추가 요청시, 생성하여 반환 GameObject Additionally_GenerateSkillEffect(SkillEffectCode skillEffectCode) { GameObject go = Instantiate(skillEffectPrefabs[(int)skillEffectCode].skillEffectPrefab, skillEffectParent); //Instantiate Prefab go.GetComponent<SkillEffect>().Initialize_SkillEffect(); //Hide Prefab return go; } // -------------------------------- // 이펙트에서 스스로 초기화 후, 멤버변수로 갖고있던 이펙트 타입을 매개변수로 넘김 Initialize_SkillEffect(); GameManager.Instance.GetCurrentSceneT<InGameScene>(). PoolSystem.ReturnSkillEffect( gameObject, skillEffectCode ); // 오브젝트 회수 시, 오브젝트 타입 Enum과 함께 반환 public void ReturnSkillEffect(GameObject gameObject, SkillEffectCode skillEffectCode) { skillEffectPool[(int)skillEffectCode].Enqueue(gameObject); }구현결과
![]()
- TeamWork
- Git Manager : 프로젝트의 버전관리를 깃 브랜치를 이용하여 작업 주도
- Optimazing
- object pooling
- skill effect prefab 오브젝트 풀링
- circle Size cached : 빈번한 스킬관련 원형 오브젝트를 생성할 경우, 오브젝트 생성/파괴
- movingTrajectory : 개구리 이동경로를 가시적으로 표시하기 위한 화살표 오브젝트를 풀링
- 프로파일링 : 리지드바디, 콜라이더 바디타입 별로 프로젝트 부하를 프로파일링 함
- object pooling
- Math
- LineRenderer : Draw Parabolic skill trajectory(Math - Mathf.sin)
- Get Deg from V3 (Mathf, Quaternion) : Quaternion 사원수를 이용하여 각도를 벡터로 계산
- Get Position relation between two object : 벡터의 외적을 이용하여 두 오브젝트간의 위치관계를 확인
- Tech
- UI 에셋 구매하여 남의 코드를 읽고 맛에 따라 적용 : 구매한 에셋에 대해서 게임에 맞게 적용
- New Tech
- Shdaer : Stencil Buffer를 이용하여 StencilShader 를 제작함으로써, 보이지 않는 플레이어를 효과적으료 표현
- LineRenderer : ExecuteInEditMode on Script 를 이용하여 유니티 에디터 상에서 전선 연결 작업을 용이하게 함
- coroutine 동기로드 / async - await 비동기 를 이용하여 드라이브의 엑셀 데이터 로딩을 용이하게 함
- Creativity
- Player FOV Expansion : 마우스를 이용하여 플레이어의 시야 확장을 하는 방식을 유니티에서 제공하는 시네머신을 이용하여 간편하게 구현함
-
스텐실을 위한 3주간 고민
-
변수 변경은 통일된 장소에서,, 함부로, 별도로 변경을 하면 에러발생시 파악이 어렵다
-
BIC , 버닝비버, BIGS 등 전시
-
펀딩
-
기획팀과의 소통을 통해 이상한점, 어색한점 등 의견을 피력
-
A가 작업한것을 B가 업그레이드를 위해 그냥 가져다가 쓰니까 오류가 발생. (책상의 playerAttacked Layer, playerAttacked Layer를 감자하는 타임라인트리거)
-
스텐실 노력 에셋을 사서 입맛에 맞게 작업하기 최xx과의 충돌 미흡한 의사소통으로 인한 이미지 리소스 오류 최적화에 대한 학습 수학의 활용(외적,내적 삼각함수: 뇌운 궤적,로렌치니 원형회전,개구리점프, 역삼: 백터로 각도계산-스킬이펙트배치시 시작점과 끝점의 각도계산, 갈바니즘 포인트 배치시-이전 점과의 벡터를 구하여 각도계산) LINE_RENDERER, json, excel, RayCasting, OverLap,
- RayCast unsing Speific Layer Filltering ←
- Get Vector using angle(need to adjust Quaternion's(x,y,z) & StdVector) ←
- https://wiseraintown.tistory.com/entry/Transform-%EA%B0%81%EB%8F%84%EC%97%90-%EB%94%B0%EB%A5%B8-Object-%EB%B0%A9%ED%96%A5-%EA%B5%AC%ED%95%98%EA%B8%B0
Quaternion.Euler(0, 0, x) * Vector3.right;
- Event on Editor & Get WorldPosition using Event.mousePosition
- LineRenederer
- Create Unity Editor custom Button to execute some Function
- How to save variable in custom editor in unity
- Particle System Playing Stop immediately
- pc.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);
- Draw Bezier Curves Line
- System.Enum.GetValue(typeof(EnumName)).Length
- gameObject.trasnform.childCount
- scripting API - https://docs.unity3d.com/ScriptReference
- SortingOrder : using UnityEngine.Rendering
- Tilemap : using UnityEngine.Tilemap
- Light2D : using UnityEngine.Experimental.Rendering.LWRP
-
스킬 구현
- 블랙아웃 스킬 구현
- 과부화 스킬 구현
- 번개 스킬 구현
- 천둥 스킬 구현
-
스킬 업그레이드
- 업그레이드 분석
- 플레시 레벨 0, 1 분리
-
픽락 레벨 1 - 테이저 스킬업 구현
- 천둥 스킬업 구현
- 갈바니즘 스킬업 구현
- 뇌운 스킬업 part1(duration) 구현
- 뇌운 스킬업 part2(부여) 구현
-
스킬 안정화
- 스킬 UI 안정화
- 퀵힐 안정화
-
스킬 안정화
-
스킬 테이블 수정 -
스킬 스트링 테이블 수정 - 과부화 이미지 적용
- 천둥 적용(협업)
-
-
장치 구현
- 증기발생기
- 번개장벽
- 두줄 번개장벽
-
로렌치니 구현
- 상태 관리
- 회전 관리
- 공격 관리
- 장치구현
- 지뢰
- 무한동력 장치
- 버그 수정
- INGAME_Canvas
- 패널 이동 관련 로직 수정
- Skill Tree UI
- UI 만들기
- 스크립팅
- 버그수정
- Skill Tree UI
- 스킬버튼 선택 이펙트
- 스킬상태 및 스킬 습득 버튼
- 스킬 습득 모달 윈도우
- 버그 수정
- 스테이지 obtain → 글로벌 obtain
- 책상버그
- 개구리 알림 적용
- 슬라이딩 도어 적용
- Skill panel
- 경험치 슬라이더
- 데이터 베이스 연동
- 환경 전력 흡수 페널티 제거
- 스킬포인트 : player.ic → skillPointSys
- 스킬 습득에 따른 저장
- Skill Panel buff
- 버프 획득 메커니즘
- 버프 에니메이션
- 협업
- 대화시스템 로딩
- 버그 수정
- 스테이지 obtain → 글로벌 obtain
- 영구 환경 전력
- 개구리 알림 적용
- 전기 방벽
- 플랙서블 전기방벽
- 협업
- 대화시스템 로딩
- 버그 수정
- 램프 스텐실 소팅
- 브라이드 스파인
- 스파인 및 에니메이션
- 리소스 업데이트
- resurrection Device
- skill panel text
- 빌드
- BIC
- 무한 버그... 기억도 안나
- 지도 UI
- clear Window
- QA
-
플레이어 8방향 이동 구현
세부내용 : 플레이어의 이동 구현- 플레이어 에셋 탐색
- 플레이어 스크립트 제작
- 플레이어 컨트롤러 제작
- 플레이어 인터렉트컨트롤 제작
- 플레이어 애니메이션 최적화 및 리터치
-
플레이어 테스트 환경 구축
세부내용 : 플레이어 테스트를 위한 씬과 타일맵 제작- PlayerTestScene 제작
- PlayerTestScene위에 타일맵 배치
-
GameManager 제작
세부내용 : 최상위 매니저 GameManager를 싱글톤으로 제작하여 매니저 환경 구축- 싱글톤 GameManager 제작
-
Iter , IMetal 전기 전이 메카니즘
세부내용 : IWater, IMetal 인터페이스 구현하여 Qinteract를 통해 전기 전이 메카니즘 구현- IWater interface
- IMetal interface
- interactQ 전기 부여 메카니즘 구현
-
IBio 전기 전이 메카니즘
세부내용 : 전기전이 인터렉트 Q를 이용하여 IBio(Enemy) 테이즈 스킬 구현- IBio interface
- interactQ 테이즈 스킬 구현
-
Interact Q 상호작용 추가 구현
세부내용 : Interact Q의 상호작용 우선순위 부여, 테이즈 스킬 조건 추가- 우선순위 메카니즘 구현
- 테이즈 스킬 조건 추가
-
IElectricity - elecPoint 전기 흡수 메카니즘
세부내용 : IElectricity interface 제작과 그에 따른 InteractE 흡수 메카니즘- IElectricity interface 제작
- Interact E 흡수 메카니즘 구현
-
IElectricity - ElecPoint GameObject 흡수 Effect
세부내용 : ElecPoint GameObject 흡수 Effect구현- ElecPoint GameObject 제작
- Interact E를 통한 흡수 Effect 구현(FadeOut)
-
데이터베이스 구축
세부내용 : 싱글톤을 이용하여 데이터베이스 구축- 싱글톤 데이터 베이스 구축
-
엑셀 데이터 로더와 데이터베이스 연동
세부내용 : 엑셀 데이터 로더를 통해 SkillDataTable 데이터를 스크립터블 오브젝트로 크롤링하여 데이터베이스와 연동- 데이터베이스와 크롤링 스크립터블 오브젝트 연동
-
플레이어 상호작용 범위 개선
세부내용 : 플레이어의 상호작용 범위를 몇가지 테스트용으로 구현- 플레이어의 마지막 입력 벡터 산출
- 마지막 입력벡터에 따른 반호 상호작용 범위 구현
- 마지막 입력벡터에 따른 사각형 상호작용 범위 구현
- 사각형 범위 디버그 조정 변수 설정
-
오브젝트 풀 시스템 구현
세부내용 : 전기이펙트를 위한 오브젝트 풀 구현(추후 다른 오브젝트 풀도 추가 예정)- 오브젝트 풀 구현
- 풀에 전기 이펙트 풀 생성
-
전기이펙트 라이프 타임 관련 스크립트 생성
세부내용 : 라이프타임에 따른 오브젝트풀 삽입 메카니즘 구현- 라이프타임에 따른 오브젝트풀 반환(삽입) 메카니즘 구현
-
물 객체와 전기 전이 상호작용 메카니즘 구현
세부내용 : 전기 전이 상호작용을 통해 물 위에 전기를 발생- 물 객체 모델 3개 제작
- 물 객체 전기 전이 메카니즘 구현
-
물 객체와 상호작용 추가작업
세부내용 : 물 객체와의 상호작용 추가 작업- 전이 전력 소멸 후 전력전이 포인트 초기화
- 물 객체 위에서의 물 객체와의 상호작용 불가 메카니즘 구현
- 중첩전기의 lifeTime 증가 구현
- 플레이어 직접전이는 isTransited를 검사하지 않는 버그 수정
- isTransitedClear Method 버그 수정
-
물 객체와의 상호작용 테스트
세부내용 : 다양한 예시를 통한 물 객체 전기전이 테스트- 물 객체 모델 수령
- 물 객체 제작
- 테스트
-
금속 객체와의 상호작용 구현
세부내용 : Metal 전기 전이 구현
ㄴ사전작업 : IMove, Interact F- Metal 전기전이 메카니즘 구현
- 전이가능포인트 초기화 구현
- 중첩전기 lifeTime 증가 구현
- 종류별 전기 프리팹 제작
- 방향별 전기 프리팹 연동
- Y프레임 파이프 전기 전이 버그 수정
- 플레이어 직접전이는 isTransited를 검사하지 않는 버그 수정
- isTransitedClear Method 버그 수정
-
IMove Interface 구현 -
Interact F 구현 -
오브젝트 이동 시, 오브젝트 포인트 재계산 메카니즘 구현
-
상호작용 업그레이드
세부내용 : Water/Metal의 각각의 포인트에서 다른 Interactable Object를 만났을때, 전기 전이가 이뤄지는 메카니즘을 생성- 오브젝트 포인터 별 다른 오브젝트 체크
- 물 객체에서의 새로운 오브젝트 발견 시, 전이 메카니즘 구현(mainBody/Dervied 상관없이 전이 발생)
- 금속 객체에서의 새로운 오브젝트 발견 시, 전이 메카니즘 구현
-
전기 흡수 메카니즘
세부내용 : 발생시킨 전이 전기와 그 주변 인근 전기 흡수 메카니즘- 흡수된 전이전기의 주변 전이전기 계산
- 전기 흡수 메카니즘 개선
-
플레이어 이동 관련 버그 수정
세부내용 : 실행 pc에 따라 이동속도가 상이한 현상을 수정- 실행 pc에 따른 이동속도 버그 수정
-
전기전이 상호작용 개선
세부내용 : 파이프에서 물로의 전기전이가 비정상적인 경우에 대해 해결- 코드 정리
- 버그 수정
- 전이 가능 포인트 초기화 메카니즘 개선
- 동일 속성 전도체간 전이 메카니즘 구현(금속우선)
-
IMetal Object 프리팹화
세부내용 : 별다른 설정없이 파이프를 배치- 파이프 형태 프리팹화
- 자동 피벗 탐색 후 자동 좌표 설정
- 요청 파이프 프리팹 제작
-
Resizable 파이프 제작
-
스킬 클래스 생성
세부 내용 : 스킬 실행에 관여할 스킬 클래스 제작- 스킬 클래스 구현
-
테이저
세부내용 : 테이저 스킬 보완- 테이저 벡터 컨디션 업데이트
- 스킬 클래스 쿨타임 매니저 연동
-
이펙트 추가
세부내용 : 테이저, 천둥, 흡수 ,픽락 시전 이펙트- 부여 이펙트
- 스킬 사용실패 이펙트
- 테이저 이펙트
-
레벨 디자인 씬 셋팅
세부내용 : 기획자를 위한 레벨 디자인씬 기반 시스템 구축- 기반시스템 구축
-
스킬 이펙트 결정
세부내용 : 기획자회의를 통한 이펙트 선정- 실패 이펙트 확정
- 전이 이펙트 확정
- 테이저 이펙트 확정
- 픽락 이펙트 확정
- 마비 이펙트 확정
-
스킬 이팩트 적용
세부내용 : 회의를 통해 결정된 이펙트 적용- 실패 이펙트 적용
- 전이 이펙트 적용
- 전이 2 water 이펙트 적용
- 마비 이펙트 적용
- 테이저 이펙트 적용
- 픽락온락 이펙트 적용
- 픽락 이펙트 적용
- 마비 이펙트 적용
-
문 오브젝트
세부내용 : IOpen Interface Door 생성- IOpen 인터페이스 생성
-
열쇠 오브젝트 세부내용 : IObtain Interface - key Item 구현
- IObtain Interface - key Item 구현
-
문과 열쇠 상호작용 세부내용 : 열쇠를 통한 문 잠금 해제
- 잠금해제
-
픽락
세부내용 : 상호작용 PickLock 스킬 구현- PickLock Debug 연출 구현
-
전이 사이클 UI
세부내용 : 인게임에 전이 사이클 수 표시- KeyHoldCycleDebuger 구현
- 개발 회의를 통한 기획진 설정
- UI
-
천둥
세부내용 : 기능 구현을 통한 초안 구현-
초안 -
소음 시스템
-
-
PlayerCenterPos 변수 전격 변경
세부 내용 : 함수의 매개변수로 전달되던 playerCenterPos를 구현된 GameManager.Instance.Player.PlayerCenterPos로 변경하기- 변경
-
스킬 이펙트 다듬기
세부내용 : 어색한 이펙트 정리 및 디렉토리 정리- 테이저
- 픽락1
- 픽락2
-
게임 데이터 저장
세부내용 : 체크포인트를 통한 게임 데이터 저장 요소와 진행상황- 플레이어 데이터 : 체력, 마나,
- 보유스킬
- 수집목록
- 스테이지 오브젝트 - 세이브포인트
- 스테이지 오브젝트 - 열쇠
- 스테이지 오브젝트 - 문
- 스테이지 오브젝트 - 에너미
-
스테이지 해금 -
정제전력 -
도전과제
-
게임 데이터 로드
세부내용 : 게임 데이터 로드 구현 진행상황- 플레이어 데이터 : 체력, 마나 (#1. 리스폰)
- 플레이어 데이터 : 체력, 마나 (#2. 재시작)
- 보유스킬
- 수집목록
- 스테이지 오브젝트 - 세이브포인트(Only ReStart)
- 스테이지 오브젝트 - 열쇠
- 스테이지 오브젝트 - 문
-
스테이지 해금 -
정제전력 -
도전과제
-
게임 데이터 로드
세부내용 : Json 게임 데이터 로드 구현 진행상황- 플레이어
- 플레이어 데이터 : 위치
- 플레이어 데이터 : 체력, 마나 (#1. 리스폰)
- 플레이어 데이터 : 체력, 마나 (#2. 재시작)
- 스킬
- 보유스킬
- 스킬쿨다운
- 컬렉션
- 수집목록
- 스테이지 오브젝트
- 스테이지 오브젝트 - 세이브포인트(Only ReStart)
- 스테이지 오브젝트 - 열쇠
- 스테이지 오브젝트 - 문
- 스테이지 정보
- 스테이지 해금 정보
-
정제전력 -
도전과제
- 플레이어
-
스테이지 클리어 포인트
세부내용 : 스테이지 클리어 포인트 생성과 구현- 스테이지 클리어 포인트 구현
- 스테이지 해금 업데이트
- 스테이지 해금 데이터베이스 연동
-
카메라 트랙킹
세부내용 : 씨네머신- 씨네머신 적용하기
-
카메라 워크 컷씬, 스크린 셰이크 이란... -
씨네머신 응용 구현
-
비동기 씬 로드
세부내용 : 타이틀씬 - 인게임씬 작업- 타이틀 구현
- 로딩씬 구현
- 인게임씬 구현
- 비동기 씬 로드
- 새 게임 생성 시, 게임데이터 삭제하기
-
전기 데미지
세부내용 : 초당 전기 데미지 - enemy- 전기 데미지
-
소음발생장치 세부내용 : 전기 프리팹을 통해 소음을 발생시키는 장치 제작
- 소음발생장치 디버그 구현
- 소음발생장치 SoundWave 구현
-
브라이드 리소스 적용 세부내용 : 브라이드 리소스 적용하기
- 피벗 설정
- 컴포넌트 적용
- 걷기 애니메이션 연동
-
공격 애니메이션 연동
-
INGAME 데이터 관리
세부내용 : 인게임 데이터 관리- 스킬
- 스킬쿨다운
- 에너미
- 리로드 리셋 적용
- 스킬
-
GAME 데이터 관리
세부내용 : 게임 데이터 관리- 스킬
- 보유스킬
-
스킬포인트
- 스테이지 정보
- 스테이지 해금 정보 저장
-
스테이지 overWrite 불가
- 스킬
-
문, 열쇠 프리팹
세부내용 : 새로운 프리팹 생성- 문 프리팹 생성
- 열쇠 프리팹 생성
-
소음발생 장치
세부내용 : 소음발생 장치 사운드 웨이브 생성- 사운드 웨이브 생성
- 소음발생장치 리소스 적용
-
IMetal 상속
-
씬 셋업
세부내용 : 프로토타입 씬 세팅- 튜토리얼 씬
- 튜토리얼 씬 셋업
- STAGE 1
- 씬 셋업
- 튜토리얼 씬
-
UI 작업
세부내용 : player, Skill 정보 노출- 플레이어
- 체력
- 마나
- skill
- Conduction
- PickLock
- Taze
- Drain
- savePoint
- 저장 코멘트
- 플레이어
-
해상도 빌드
세부내용 : 프로토타입 해상도 고정 빌드 방법 모색- 해상도 고정 빌드 방법 모색
-
애너미 상태 초기화
세부내용 : 임시 방편으로? 데이터 저장없이 에너미 상태 초기화- 씬 재로드에 따른 에너미 상태 초기화
-
Steal Key
세부내용 : Make Stealable Key- Steal Key 구현
-
데이터 동기 로드
세부내용 : 기반 / 엑셀 → 스킬 → FadeInEffect- 동기 로드 구현
-
UI 개선
세부내용 : 몇 가지 UI를 개선- INGAME PANEL : HP, ELELC BAR UI 개선
- 그림자 적용
- TITLE SCENE의 전기 이펙트 판넬에 가려지게끔 적용
- 없는 대상에 대해서 UI INACTIVE 적용
- ST0, ST1 Scene Manage Button 구현
- F Interaction available UI
-
전류 충전 배터리 제작
세부내용 : 전류 흡수용 배터리 제작- 배터리 제작
- 리소스 적용
-
버그 관리
세부내용 : 방역업체 컨텍- 전력부여 UI Cancel 버그
- 픽락 deep condition에 따른 UI ACTIVE
- 테이저 deep condition에 따른 UI ACTIVE
- UnLock comment 가운데 정렬
- 개구리야 그만 울어라 나도 울고싶다
- 우리 문이 왜그럴까?
-
E스킬 병합
세부내용 : E스킬(Drain) → Q스킬 계열로 로직, 키 병합- 병합
-
UI 자동화
세부내용 : UI 자동화에 대한 공부- UI Object Auto Bind
- Function Auto Bind to Button UI Object
-
체크포인트 로직 수정
세부내용 : 순차 트리거 → Bigger 트리거- 로직 수정
-
최적화
세부내용 : 최적화에 대한 내용 정리 + 빈 이벤트 함수 제거, InVoke() → Coroutine()- 최적화 카드 생성
- Resources 폴더 최적화
- #define 최적화
- 하이어라키 최적화
-
물 orig Point Auto Setting
세부내용 : 자동 좌표설정과 프리팹화-
Orig Point Auto Setting -
프리팹 생성
-
-
버그픽스
세부내용 : 꾸준하게 버그를 리포트하고 수정- 씬 로드 때, 문 애니메이션 소리 재생 수정
- 씬 로드 때, 트리거 코멘트 출력 수정
- 씬 로드 때, 플레이어 이동가능 수정
- 문 세이브 데이터 읽기
-
플레이어 시야 확장
세부내용 : 마우스를 이용하 FOV확장- 구현
-
버그 수정
- 체크포인트 인덱스 순차배치 강제성 제거
- 스킬 쿨다운 세이브/로드 오류 개선
-
etc
- 클리어 포인트 콜라이더 변경
- 문 콜라이더 변경
- 최적화
- 캔버스 생성 자동화
- Stage2 생성
-
버그 해결 세부내용 : 빌드 전, 버그 수정
- 클리어 포인트 콜라이더 범위 변경
- 스킬 쿨다운 세이브 버그
-
클리어포인트 인덱스의 자율성 세부내용 : 클리어포인트 인덱스 순차 트리거 매커니즘 해소
- 해소
-
스테이지별 경과시간 매카니즘
세부내용 : 스테이지별 경과시간 매카니즘 구현- 스킬 쿨다운 세이브 버그로 인한 elapsed Time 구현
-
스텐실 쉐이더(스텐실 버퍼) 구현
세부내용 : 벽 위에 플레이어 실루엣 오버레이를 위한 스텐실 쉐이더 시스템 구현- 2D & 3D Stencil Shader system
-
URP Stencil Shader system
-
스텐실 쉐이더(스텐실 버퍼) 구현
세부내용 : 벽 위에 플레이어 실루엣 오버레이를 위한 스텐실 쉐이더 시스템 구현- URP Stencil Shader system
-
DataBase 데이터 로드 단순화 세부내용 : Scene 로드때마다의 불필요한 데이터 ReLoad 매카니즘 개선
- TitleScene 최초 실행 시에만 고정 데이터 로드 매카니즘 구현
-
버그 해결
세부내용 : 빌드 전, 버그 수정- 벽 소팅 버그 수정
-
스킬 테이블 연동
세부내용 : 스킬테이블의 참조변수 필드 추가 연동- Update skillValues Field
-
텍스트 테이블 연동
세부내용 : 언어설정에 따른 텍스트 변동목적의 텍스트 테이블 연동- 텍스트 테이블 연동
- 텍스트 테이블 참조를 통한 UI설정
-
다이나믹 텍스트 기능 구현
세부내용 : 색상, 폰트 스타일 적용 방법 구현- 고정색과 헥사코드 색상 적용 구현
- 볼드체와 이태릭채 적용 구현
-
구글 데이터 시트 연동
세부내용 : 구글 데이터 시트 연동- 연동
-
버그 수정
세부내용 : 버그- 파이프 전력 전이 오류/파이프 콜라이더
-
UI
세부내용 : UI 생성과 자동화-
작업보류
-
-
목표전기 전이(Elec TargetTransit)
세부내용 : 목표전기 전이 구현- 목표전기 전이 메카니즘 구현
- 전기 전이 중 버그(잔여 전기량과 관련없이 끊어짐)
- 목표 트리거 이후 전기 고착 메카니즘 구현 - 물
-
목표전기 전이 업그레이드
세부내용 : 목표전기 전이 업그레이드- 멀티 장치 전기전이 메카니즘(최단 거리 장치 트리거) ← 18
-
전력원과 장치
세부내용 : 장치 구현- F상호작용 토글 장치 구현
- 전력원에 따른 장치 구현
- 전력원 장치 인스펙터 자동화 ← 18
- 전력원 장치 회로 구현 메카니즘 ← 18
- 전기 컨테이너 구현 ← 18
-
기타 작업
세부내용 : 기타 작업 및 버그 수정- 에너미 피벗 포인트 변경에 따른 에너미 마비이펙트 생성 위치 ← 18
- elec Flow Sound Stop Mechanism ← 18
- Elec Trig Device Toggle off Mechanism ← 18
- soundGenerator device소속으로 편입
-
전기변수 조정
세부내용 : 전기 특성에 따른 변수 조정- 전기 유지 시간 통일
- 전기 전이 속도 감소
-
장치
세부내용 : 장치관련 업데이트- 램프의 장치 편입
- 램프 - 파워소스 연결
- IsUsable Device Data Save
-
전력원
세부내용 : 전력원 관련 업데이트- powerSource containAmount Data Save
- 전력원 전력 부여 제한 메카니즘
- 장치 전력 부여 이펙트
- 파워소스 리소스 업데이트
-
물 세부내용 : 물 매카니즘 리워크
- 매카니즘과 프리팹 변경
- 단순 전이
- 목표전기 전이
- pipe 2 water 전이
- water 2 pipe 전이
-
목표전기 전이
세부내용 : 목표전기 전이 업그레이드-
트리거 전기 흡수 메카니즘(라이프타임 조정)(후순위) -
전력원과 장치간의 목표전기 전이(후순위) -
복합 전도체 위의 장치 목표 전이(후순위) -
멀티 장치 최단거리 메카니즘 변경(복합 전도체 위의 멀티 장치)(후순위)
-
-
UI
세부내용 : 에셋을 활용한 UI작업- Input System 변경
-
기타
세부내용 : 기타 작업 및 버그 슈팅- 전력원과 장치 연결 노션 작성
- 장치, 전력원 배치 방법 노션 작성
-
프리팹
세부내용 : 회의 내용 반영- 파이프
- 물
- 상자
- 전력원
-
전기전이 세부내용 : 버그 수정
- 타겟 전이 필요량 초과 부여시, 잔가지가 이상한 곳을 튀는 현상
-
UI 세부내용 : UI 적용
- UI 틀 갖추기
- Title에서 GameStart 연결하기
- stage Clear Panel
- Game Eneding Panel
- Option Panel
-
etc
세부내용 : 등등,,- 벽 뒤 light Can't trigger on Player
- Tazer Vector Checker Mechanism
-
목표전기 전이 세부내용 : 목표전기 전이 구체화
- 트리거 전기 흡수 메카니즘(라이프타임 조정)
- 전력원과 장치간의 목표전기 전이
-
git Hub 세부내용 : 브랜치 관리
- 브랜치 관리
-
목표전기 전이 세부내용 : 목표전기 전이 구체화
- 전력원과 장치간의 목표전기 전이
- 복합 전도체 위의 장치 목표 전이(Water → Pipe)
- 멀티 장치 최단거리 메카니즘 변경(단순 거리 → 최소 이동 거리)
-
튜토리얼 최적화
세부내용 : 스크립터블 오브젝트를 이용한 튜토리얼 메모리 최적화- 스크립터블 오브젝트 이용
-
라인렌더러 세부내용 : 라인렌더러 리소스 적용
- 방안 모색
- 임시 리소스 적용
-
인게임 리소스 세부내용 : 인게임 리소스 적용
- 문
- 문 에니메이션
- 열쇠
- 자물쇠 FADE OUT
-
상호작용 개선 세부내용 : 문 잠금 기능 제거
- 제거
-
목표전기 전이
세부내용 : 제발 마무리하자..- 멀티 장치 & 복합 전도체 목표전기 전이
-
체크포인트
세부내용 : 체크포인트 상호작용 방식 수정- HeartEngine
- Device
- 수정
-
스킬
세부내용 : 스킬 구현-
스킬_구현
-
-
문
세부내용 : 문 기타 수정 사항- Full Open sprite 수정
- 애니메이션 이벤트 함수 등록
- lock fade out 시간 조정
-
기타
세부내용 : 기타 수정 사항- 몇몇 리소스 소팅 장애
- 파이프 규격화 데이터 수집
-
체크포인트
세부내용 : 체크포인트 상호작용 방식 수정- HeartEngine
- Device
- 수정
-
InGame ReSource
세부내용 : 인게임 리소스 적용- 파이프
- 파워라인
-
UI
세부내용 : 플레이어 ui 변경- 플레이어 상태
- 스킬
-
세이브 포인트
세부내용 : 추가 설정 변경- PowerSourceDevice && IsUsable Device 특이점
- spawn Position 수정
- 리스폰 포인트 갱신 comment
-
인게임 리소스 적용
세부내용 : 리소스 적용- 심장엔진
- 부활장치
-
기타
세부내용 : 기타사항- 문 버그
- 전기 소팅 버그
-
UI
세부내용 : skill Description- Hover Tip : Skill Description
-
스킬 이펙트 추가
세부내용 : 스킬 이펙트 추가- 흡수
- 충전
-
기타 세부내용 : 기타사항
- 개구리 IObtain → IContainer
- 플리커링 해결 방법 모색
-
UI
세부내용 : skill Description- Hover tip window Design
- Hover Tip window Bug
- Add Skill Name into hoverTip window
-
Canvas
세부내용 : 캔버스 병합 및 hotKey 적용- 캔버스 병합(playerCanvas : tmp, inGameCanvas)
- hotKey : esc, j, mouseMidBtn
-
Skill Effect
세부내용 : 스킬 이펙트 점검- 은폐시 스킬 이펙트 표시 막기
- 새로운 흡수 이펙트
- 팔로잉 이펙트 : 충전, 실패
-
이펙트 버그 - 충전 - 이펙트 버그 - 실패
-
상호작용 메카니즘
세부내용 : 상호작용 범위 변경- 상하
- 좌우
-
기타
세부내용 : 기타사항- 파이프 리소스 변경
- 파이프 - 전기 소팅 버그
- 컨테이너 레이어
-
전기 흡수
세부내용 : 전기 흡수 관련 버그수정- 전기 흡수 메카니즘 변경
- 컨테이너 전기 흡수 버그
- w2p targetting transit 버그
-
스킬 시스템
세부내용 : 스킬 시스템 유틸 함수 추가- 스킬 획득 메카니즘
- 스킬 레벨업 메카니즘
- 스킬 시스템 최적화
-
스킬 구현
세부내용 : 신규 스킬 구현- 천둥
- 플레시
-
RMB 스킬 UI
세부내용 : RMB스킬 관련 UI- 스킬 UI
-
스킬 시스템
세부내용 : 스킬 발동 메카니즘 변경- 은폐중 스킬 사용 가능 조건 추가
- 은폐중 이동 방지 메카니즘 변경
-
기타
세부내용 : 기타사항- 상호작용 관련 변수 코드 정리
- 상호작용 범위 변경
-
스킬
세부내용 : 신규 스킬 구현- 천둥
- 플레시
-
스킬 UI
세부내용 : Quick Wheel Skill Panel- UI 형성
- 버튼 애니메이션
- 버튼 메카니즘
-
컷신
세부내용 : 컷신 어시스트- signal script
- 컷신 어시스트
-
기타
세부내용 : 기타사항- 전력 부여 이펙트 - glow effect 제거
- 위쪽 상호작용 범위 1.6f → 1.2f
-
스킬
세부내용 : 신규 스킬 구현- 천둥
- 플레시
- 피뢰침
-
컷신
세부내용 : 컷신 어시스트- 새로운 컷신 재생 메카니즘 - IToggle
- 새로운 컷신 재생 메카니즘 - IMetal
-
스킬 이펙트
세부내용 : 스킬 이펙트 협업- 천둥
- 플래시
- 피뢰침
-
스킬포인트
세부내용 : 임시 스킬 습득 방식- 스킬 포인트 프리팹 구현
-
기타
세부내용 : 기타사항 및 버그- Quick Wheel 버그
- 흡수 이펙트 버그
- 옵션 UI 버그
- 흡수량 버그
- 컨테이너 트리거 전기 흡수 버그
휴식
-
버그잡기
- 플래시 이펙트 버그
- Quick Wheel 버그
- 충전 이펙트 버그
- 옵션 UI 버그
- 흡수량 버그
- 컨테이너 트리거 전기 흡수 버그
-
스킬 정상화
- 플래시
- 천둥
- 피뢰침
-
쉐이더
- 스텐실 쉐이더
- 아웃라인 쉐이더
-
장치
- 파괴가능 컨테이너
- 파과기능 저장
- 쉐이더
- 아웃라인
- 아웃라인 쉐이더 적용
- 스텐실 쉐이더 추가 작업
- RMB 스킬
- rmb 스킬 시퀀스 제작
-
RMB 스킬 : 천둥
- 스킬 범위 UI
- 포물 궤적 UI
- 스킬 시전 불가 UI
- 스킬 사거리 데이터 시트 연동
- 원형 UI 케시 제작
- 스킬 범위 UI
- 레이케스팅 메카니즘
- 천둥 스킬 이펙트
-
E 스킬 : 블루프린트
- Q, F조작 불가
- F UI, OutLineMat OFF
- E UI
- 피격시 해제
- 호버 네임 텍스트
-
RMB 스킬 : 갈바니즘
- 갈바니즘 스킬 메카니즘 및 UI
- 갈바니즘 스킬 이펙트 메카니즘
-
RMB 스킬 : 갈바니즘
- 갈바니즘 스킬 메카니즘 및 UI
- 갈바니즘 스킬 이펙트 메카니즘
-
E 스킬 : Blue Print
- 전도체 빗금 해제
- 전도체 색상 확정
-
RMB Hold Mechanism
- 뇌운
- 갈바니즘
-
개구리 AI
- 개구리 만들기
- 개구리 소팅
- 개구리 AI
- 개구리 이미지 점프 코드
- 개구리 방향 감지
- 개구리 애니메이션
- 개구리 충돌로 인한 순간이동 버그 해결
-
Moving Trajectory 수정
- 선이 아닌 점으로 변경
- 방향에 따른 경로 표시
- 글로우 이펙트 표시
- 장애물을 넘겨 그릴 수 없도록
-
전력 부여 메카니즘 수정
- 최초 입력으로 즉시 전도 불가
- 개구리 경로
- 첫번째 지점까지의 경로 보간
- obstruction 직전까지 경로보간
- cos()안에 계속 deg 값을 적용.. * Mathf.Deg2Rad


















