Unity - Builder유니티 빌드를 도와주는 github extension이다.https://github.com/marketplace/actions/unity-builder Unity - Builder - GitHub MarketplaceBuild Unity projects for different platformsgithub.comname: Build projecton: [push, pull_request]jobs: buildForAllSupportedPlatforms: name: Build for ${{ matrix.targetPlatform }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: ..
Unity
VContainerVContainer는 Unity를 위한 경량화된 DI(Dependency Injection) 컨테이너이다.DI는 객체 간의 의존성을 외부에서 주입하는 디자인 패턴으로, 코드의 결합도를 낮추고 유지보수성을 향상시키는데 도움을 준다.주요 특징가볍고 빠른 성능Unity의 컴포넌트 시스템과의 원활한 통합직관적인 API 제공코드의 모듈화와 테스트 용이성 향상https://vcontainer.hadashikick.jp/ About | VContainerVContainer - the fastest DI (Dependency Injection) for Unity Game Enginevcontainer.hadashikick.jp 기본 구성요소LifetimeScopeLifetimeScope는 VC..
Scirptable ObjectScriptableObject(SO)는 Unity에서 제공하는 데이터 컨테이너 클래스이다.MonoBehaviour와 달리 GameObject에 부착되지 않는 독립적인 데이터 에셋이다.즉, Prefab과 같이 에디터상에 유일하게 존재하는 것이다.또한, Scene과 독립적으로 존재하며 런타임에 변경된 내용을 정적으로 저장하여 가져갈 수 있다.Scene 전환 시에도 데이터가 유지되며 한 번 로드된 SO는 메모리에 캐싱되어 재사용할 수 있다.빌드 시 에셋으로 포함되어 배포되게 된다. Unity 에디터에서 직접 데이터를 수정하고 저장할 수 있기 때문에 밸런싱같은 작업에서 사용하기 매우 좋다. Data Container SOSO는 기본적으로 데이터 컨테이너이다.즉, 순수하게..
Composite Pattern컴포지트 패턴은 부분-전체 계층 구조를 표현한다.인터페이스를 통일하여 개별 객체와 복합 객체를 동일한 방식으로 다룰 수 있게 한다.보통 트리 구조로 구성되며 재귀적은 구조를 가진다.스킬을 예로 들어보면 다음과 같다. Component (ISkill)모든 객체의 공통 인터페이스 정의단일 객체와 복합 객체가 구현해야 할 메서드 선언Leaf (SingleSkill)가장 기본이 되는 객체다른 객체를 포함할 수 없는 말단 객체Composite (ComboSkill)자식 컴포넌트를 가질 수 있는 복합 객체하위 컴포넌트들을 관리하는 메서드 포함실제 작업은 자식 컴포넌트에 위임ComboSkill (Root)├── SingleSkill (Fireball)├── SingleSkill (I..
Strategy Pattern전략 패턴은 동일한 실행 구조를 가지지만, 실행하는 내용이 런타임에 달라질 수 있도록 만드는 패턴이다. 예를 들어, AI가 행동을 할 때, 행동을 한다는 것은 동일하지만 실제로 어떤 행동을 하는지는 상태에 따라 다를 수 있다.간단하게 공격과 방어를 한다고 가정해 보자.공격을 할 때는 플레이어를 찾아 추격할 것이다. 반대로 방어를 할 때는 플레이어와 일정 거리를 유지하도록 할 것이다.두 상태 모두 동작을 한다는 것은 동일하나 실제로 실행하는 동작은 다르다.// 전략 인터페이스public interface IEnemyBehavior{ void Act(Transform enemyTransform, Transform playerTransform);}// 구체적인 전략 클래스들p..
Observer Pattern옵저버 패턴은 변화를 감지해 이를 전파하는 패턴이다.변화를 감지한 후, 이를 실제로 처리하는 로직을 분리할 수 있기 때문에 유용하다.게임은 특히 이벤트 발생이 예측이 안 되는 분야이기 때문에 이러한 패턴이 적용된 부분이 많다.간단한 예를 들어 보자.게임상 캐릭터의 체력을 나타내는 UI가 있다고 가정해 보자.캐릭터가 피해를 입어 체력이 닳면 UI가 업데이트되어야 한다.하지만, 캐릭터가 언제 피해를 입을지는 예상할 수 없다.따라서, 피해를 입는 이벤트가 발생했을 때 해당 이벤트의 발생 여부가 필요한 객체들에게 이를 전파하는 방식으로 해결할 수 있다. 다음은 옵저버 패턴을 이용하여 입력 시스템을 구현한 것이다.using System;using System.Collections;us..
Object HashCodeUnity의 오브젝트를 비교할 때, HashCode를 통해 비교가 진행된다.GetHashCode를 통해 오브젝트의 InstanceID를 Hash로 변환하여 비교하는데 해당 함수를 override 하면 비교기준을 바꿀 수 있다.public override int GetHashCode() => this.m_InstanceID;private static bool CompareBaseObjects(Object lhs, Object rhs){ bool flag1 = (object) lhs == null; bool flag2 = (object) rhs == null; if (flag2 & flag1) return true; if (flag2) return !Object...
AngryBird 클론 코딩앵그리 버드 클론 코딩 프로젝트를 진행했다.다른 시스템이나 기능을 접목하려 했지만, 아이디어가 떠오르지 않아 최대한 유사하게 만들어보기로 했다. 기본 시스템우선, 앵그리 버드의 기본 시스템을 다음과 같이 정의했다.새총을 뒤로 당겨 새를 발사한다.구조물이 존재하고 발사된 새가 부딪혀 피해를 줄 수 있다.구조물 사이에 적(돼지)이 존재하고 구조물이나 새에 부딪혀 피해를 입는다. 새총 발사새총을 뒤로 당겨 새를 발사하기 위해서 새총 기능을 담당할 오브젝트를 생성했다.마우스로 해당 오브젝트를 클릭한 뒤, 드래그해 줄을 당기도록 구현하고 싶었다.이를 구현하기 위해 마우스 이벤트를 처리하는 인터페이스를 상속받아 진행하였다.using System;using System.Collect..
오브젝트 드래그게임상에서 오브젝트를 클릭하고 드래그하는 방법을 알아보자.우선, 가장 간단한 방법은 마우스 입력이 일어나면 마우스 포인터 위치에 raycast를 진행해 오브젝트를 찾아서 처리하는 것이다.하지만, 다른 방법도 있다.마우스 입력을 처리하는 인터페이스를 사용하면 된다.using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;public class DraggableObject : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler{ private Vector3 star..
벡터의 내적벡터의 내적은 게임 수학에서 자주 사용되는 개념이다.내적의 결과는 스칼라 값이다.이 결과를 통해 다음과 같은 정보를 알 수 있다.결과가 음수라면 두 벡터의 사이각이 90˚~270˚ 사이에 있다.내적은 $cos \theta$ 가 곱해지기 때문이다90˚~270˚에 있다는 뜻은 자신보다 뒤에 있다는 뜻이 된다.내적의 결과는 하나의 벡터를 다른 벡터에 투영한 벡터의 크기와 같다.즉, 하나의 벡터를 분리하여 다른 벡터의 방향에 대한 크기를 알 수 있다. 간단한 예로, 입사각과 반사각을 생각해 보자.바닥이 고정되어 있고 하나의 물체가 특정한 방향으로 떨어져 바닥과 완전 탄성 충돌을 한다고 가정해 보자.그렇다면 물체가 바닥에 튕겨 나갈 것이다.이를 수학적으로 계산하면 다음과 같다.바닥은 고정되어 있어 no..