반응형

C# 20

[디자인 패턴] 11. 유니티에서 이터레이터 패턴

이번에는 이터레이터 패턴, 반복자 패턴입니다. 컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일시킨다면 어떤 종류의 집합체에 대해서도 사용할 수 있는 하나의 함수로 모든 컬렉션을 다룰수있게됩니다. 핵심은 다양한 집합체를 하나의 클래스로 상속받아 관리하며 같은 함수로 내부에 접근을 할 수 있다는 것입니다. 넓게보자면 이전에 포스팅했었던 어댑터패턴과 관통하는 부분이 있을 수 있습니다. 2021.09.30 - [게임 개발/디자인 패턴] - [디자인패턴] 9. 유니티에서의 어댑터 패턴 퍼사드 패턴 [디자인패턴] 9. 유니티에서의 어댑터 패턴 퍼사드 패턴 이번 챕터에서는 두개의 패턴이 함께 있어서 같이 작성했습니다. 첫번째로 어댑터 패턴입니다. 어댑터 패턴 정의 한 클래스의 인터페이스를 클라이언트에서 ..

[디자인패턴] 10. 유니티에서 템플릿 메소드 패턴

이름은 생소하지만 알게모르게 사용하고있던 패턴 '템플릿 메소드 패턴'입니다! 템플릿 메소드 패턴 정의 어떤 작업 알고리즘의 골격을 정의합니다. 일부 단계는 서브클래스에서 구현하도록 할 수 있습니다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 특정 단계만 서브클래스에서 새로 정의하도록 할 수 있습니다. 적용되는 객체지향의 원칙 수퍼클래스에서 모든것을 관리하고 필요한 서브클래스를 불러서 써야합니다. 템플릿 메소드 패턴의 핵심 재활용성을 생각하면서!(밑줄쫙) 추상클래스를 사용해서 수퍼클래스에 중복되는 부분은 구현하고, 서브 클래스에 달라질 수 있는 부분(바뀌는 부분)을 구현해줍니다. * 수퍼클래스에서 알고리즘을 관리하는 템플릿 메소드가 하나 있어야 합니다. * 템플릿 메소드는 알고리즘만 관리..

[디자인패턴] 9. 유니티에서의 어댑터 패턴 퍼사드 패턴

이번 챕터에서는 두개의 패턴이 함께 있어서 같이 작성했습니다. 첫번째로 어댑터 패턴입니다. 어댑터 패턴 정의 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다. 유니티에서 예시로는 결제모듈을 예시로 들었습니다. 실제로는 문제 없지만 만약에 AOS와 IOS의 결제 함수명이 다를때를 가정하고 구현했습니다. // 결제 어댑터 인터페이스 public interface PurchaseAdapter { void Purchase(); } // AOS 결제 모듈 public class AndroidInApp : PurchaseAdapter { public void Purchase()..

[디자인패턴] 8. 유니티에서의 커맨드 패턴

꿀같은 추석시즌동안 너무 행복하게 쉬었답니다. 추석이 전부 가버리기 전에 지난주에 공부했던 커맨드 패턴에 대해 정리해보겠습니다. 커맨드 패턴 핵심 요청하는 객체와 요청을 수행하는 객체를 분리한다. 커맨드 객체의 Execute()를 호출한다. 작업취소기능도 지원할 수 있다. (구현할때는 사용하지 않았습니다.) 아래 객체지향의 원칙을 따른다. 객체지향의 원칙 바뀌는 부분을 캡슐화한다. 상속보다는 구성을 활용한다. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다. 서로 상호작용하는 객체사이에서 가능하면 느슨하게 결합하는 디자인을 사용한다. 확장에는 열려있지만 변경에는 닫혀있어야한다. 추상화된것에 의존하라 구상클래스에 의존하지 않도록 한다. 유니티에서 커맨드 패턴 사용 유니티에서 커맨드 패턴을 사용하기 적절한 곳..

[디자인패턴] 7. 유니티에서 데코레이터 패턴

오늘의 디자인 패턴은 데코레이터 패턴입니다. 데코레이터 패턴의 정의는 객체에 추가적인 요건을 동적으로 첨가한다는 것입니다. 그리고 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공해줍니다. 이번에 핵심적으로 다루는 객체지향 디자인 원칙은 OCP(Open-Closed Principle)으로써 클래스는 확장에 대해서는 열려있어야하며, 코드변경에 대해서는 닫혀있어야 한다는 원칙입니다. 위의 두가지를 고려해보면 어떤 클래스의 추가적인 요건을 동적으로 첨가할때 코드변경에 대해 닫혀있는 방식이 바로 데코레이터 패턴이라고 할수있습니다. 게임을 구현하는데 있어서 그렇게 자주 볼 수 있는 패턴은 아닌 것 같지만 해당패턴을 적용시켜 아이템을 꾸며보았습니다. // 데코레이터 패턴으로 꾸며질 객체 ..

[디자인패턴] 6. 유니티에서 옵저버패턴

오늘 유니티에서 적용해볼 패턴은 '옵저버 패턴'입니다. 옵저버 패턴의 정의는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이가고 자동으로 갱신되는 방식으로 일대다 의존성을 가집니다. 위의 정의를 유의하면서 게임에서 전투를 통한 체력 표시를 구현해봅시다! 구현하기에 앞서 오늘 패턴의 또다른 중요한 원칙 '느슨한 결합'에 대해서 먼저 정리해봅시다. 옵저버 패턴에서는 주제(Subject)와 옵저버(Observer)가 느슨하게 결합되어있는 객체 디자인 원칙을 제공합니다. 특징 1. 주제가 옵저버에 대해서 아는것은 옵저버가 특정 인터페이스를 구현한다는 것뿐입니다. 2. 옵저버는 언제든지 새로 추가할수있습니다. 3. 새로운 형식의 옵저버를 추가하려고 할때도 주제를 전혀 변경할 필요가 없습니다. ..

[디자인패턴]4. 유니티에서 팩토리 메소드 패턴

유니티에서 객체를 생성하는 일이 많습니다. 몬스터, 장애물, 유저캐릭터 등등... 오늘 정리할 패턴은 위와같이 객체를 생성하는 것에 있어서 확장성이 높고 의존성을 줄일 수 있는 패턴 '팩토리 메소드 패턴'입니다. 팩토리 메소드 패턴의 가장 큰 핵심은 어떠한 객체를 생산하는 생산자(Creator)와 어떠한 객체를 생산할지 결정하는 구상 생산자(ConcreteCreator)의 분리 입니다. 게임으로 예를 들면 전체 몬스터를 스폰해주는 어떠한 클래스가 생산자(Creator)입니다. 모든 몬스터는 이 클래스에서 생산이 됩니다. 그리고 생산될 몬스터를 결정해주는 클래스가 구상 생산자(ConcreteCreator)입니다. 고블린을 생산할지, 해골을 생산할지를 정해주는 클래스입니다. 우선 생산자 입니다. 생산자의 특..

[유니티 C#] UI Animation State 이름 중복 사용

최근에 UI 애니메이션 관련해서 재밌는 팁을 알게되서 달려왔습니다! UI 애니메이션의 중복 활용이라 적었는데 무엇이냐면 유니티 애니메이션을 하면서 원하는 애니메이션으로 변경하거나 실행해야할때 각 상태에 transition을 연결하고 파라미터 값을 매겨 일종의 유한상태 머신을 만드는 형태로만 사용해왔습니다. 하지만 이번에 알아낸건 스크립트상에서 애니메이션을 실행할때 state이름을 매개변수로 받아 실행하며 그 state이름을 똑같이 작성하게되면 UI상에 중복되는 시점에 다른 애니메이션을 실행시킬수있다는 것을 알았습니다. 예시를 들자면 일반 팝업 연출과 아래에서 슬라이드해서 올라오는 팝업 연출이 있습니다. 그리고 해당 애니메이터를 제어할 스크립트를 살펴봅시다. // 콜백 매개변수를 위한 델리게이트 publi..

게임 개발/Unity 2021.07.11

[디자인패턴] 03. 유니티에서의 싱글톤(Singleton) 패턴

지난 수요일에 친구들과 디자인패턴에 대해 스터디를 하면서 제 스스로로 잘 알고 사용하고 있으면서도 잘 모르겠는 아리송한 싱글톤 패턴에 대해서 다시 한번 정리하고자 합니다. 저는 예전에 게임을 구현하면서 유니티에서 C#으로 싱글톤으로 어떻게 구현하는지 찾아보면 원하는 스크립트에 static 멤버변수 instance를 선언하여 초기화한 후 다른 씬으로 넘어갈때 계속 유지할수있게 어떤 처리를 해서 계속 사용하는 방법을 자주 볼 수 있었습니다. //// 구글링해서 나오는 대부분의 유니티 싱글톤 느낌 public class GameManager : MonoBehaviour { // instance 멤버변수는 private하게 선언 private static GameManager instance = null; pr..

[유니티 C#] Position으로 SortingLayer 조절 - 건물 뒤에 숨기

최근에 진행하는 프로젝트에서 플레이어 캐릭터가 돌아다니는 상황에서 건물 오브젝트 혹은 다른 오브젝트과 붙어있을때 랜더링 순서가 맞지않아 고민해본 결과 해당 오브젝트의 position.y값으로 레이어 order값을 변경시켜 건물의 앞에서 앞으로 뒤에선 뒤로 랜더링되도록 구현하였습니다. using System.Collections; using System.Collections.Generic; using UnityEngine; // SpriteRenderer 필수 [RequireComponent(typeof(SpriteRenderer))] public class ObjectLayerSetter : MonoBehaviour { private SpriteRenderer spriteRenderer = null; p..

게임 개발/Unity 2020.12.06
반응형