멋쟁이 사자처럼

MiniMaxMiniMax 알고리즘은 턴제로 진행되는 게임에서의 AI를 구현하는데 많이 사용되는 알고리즘이다.이를 적용하여 TicTacToe 게임의 AI를 구현해 보자.      시나리오AI를 실제로 구현하기 전에 시나리오를 통해 최적의 수를 구해보자.O가 플레이어 X가 AI라고 가정해 보자.O마크가 위와 같이 놓여있을 때, X를 두는 곳 중 가장 유리한 곳은 빨간색이 칠해진 곳일 것이다.O를 연속적이지 않게 만들면서 X를 연속된 세 개를 완성할 수 있는 위치이기 때문이다.하지만, 이러한 전략으로 수를 계속 놓게 된다면 완벽한 최적의 수를 구하지 못할 수도 있다. 그렇다면, 모든 비어있는 곳에 X를 두었다고 가정하고 게임을 진행했을 때 결과를 보고 X를 둘지 결정하는 것도 가능해 보인다.O와 X를 번갈아..
유니티 씬 전환Unity에서 씬을 전환할 때 생길 수 있는 이슈에 대해 다뤄보고 해결법을 알아보자.     UI 재활용게임을 개발하다보면 동일한 UI가 여러 씬에서 사용되는 경우가 있다.그런 경우 모든 씬에 UI를 배치하고 동일한 설정을 해주는 것은 꽤나 번거로운 일이다. 이를 해결하기 위해서는 해당 UI를 Prefab으로 만들고 필요시에 Instantiate하면 된다.만약, 재사용될 여지가 있다면 Manager클래스 같은 곳에서 풀링하여 관리하는 것도 좋은 방법이다.     SerializedField 관리여러 씬에서 사용되는 오브젝트들은 DontDestroyOnLoad를 통해 씬 이동시 파괴되지 않게 막는 경우가 많다.이런 경우 해당 오브젝트에 씬에 배치된 오브젝트를 SerializedField를 이..
{ "name": "GameAssembly", "references": ["Unity.TextMeshPro", "UniRx"], "optionalUnityReferences": ["TestAssemblies"]} 테스트개발 과정에서 여러 가지 테스트가 필요한 경우가 있다.이러한 테스트를 간편하게 진행할 수 있게 해주는 Framework가 있다.     Test Runnertest Runner는 Unity에서 제공하는 Test Framework이다.두 가지의 모드가 존재한다.play mode: 런타임에 사용할 기능 테스트(runtime)edit mode: 에디터에서 사용할 기능 테스트(static) 사용법에디터에서 Test 하고 싶은 폴더를 선택하여 테스트 폴더를 생성한다.이후, Assembly Defin..
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: ..
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...
Resources유니티에서 사용하는 특수한 폴더이름이다.해당 프로젝트에 있는 Resources라는 폴더에 있는 에셋을 탐색하여 로드할 수 있다.Resources.Load("path");해당 작업은 동기로 진행되어 병목이 걸릴 수 있다.이를 비동기로 처리하는 방법도 있다.단, 이러한 방식은 오래된 방식이다.개선된 방법으로는 Addressable Asset을 사용하는 것이다.https://unity.com/kr/blog/technology/tales-from-the-optimization-trenches-saving-memory-with-addressables 어드레서블 에셋 시스템으로 메모리 최적화하기고품질 게임은 메모리 내외부로 에셋을 효율적으로 스트리밍하는 기능을 필수로 갖추고 있어야 합니다. 저는 유..
AngryBird 클론 코딩앵그리 버드 클론 코딩 프로젝트를 진행했다.다른 시스템이나 기능을 접목하려 했지만, 아이디어가 떠오르지 않아 최대한 유사하게 만들어보기로 했다.     기본 시스템우선, 앵그리 버드의 기본 시스템을 다음과 같이 정의했다.새총을 뒤로 당겨 새를 발사한다.구조물이 존재하고 발사된 새가 부딪혀 피해를 줄 수 있다.구조물 사이에 적(돼지)이 존재하고 구조물이나 새에 부딪혀 피해를 입는다. 새총 발사새총을 뒤로 당겨 새를 발사하기 위해서 새총 기능을 담당할 오브젝트를 생성했다.마우스로 해당 오브젝트를 클릭한 뒤, 드래그해 줄을 당기도록 구현하고 싶었다.이를 구현하기 위해 마우스 이벤트를 처리하는 인터페이스를 상속받아 진행하였다.using System;using System.Collect..
hvv_an
'멋쟁이 사자처럼' 카테고리의 글 목록