728x90
반응형

Game Development, 게임개발/개발 98

Handling Event, 이벤트 활용하기 - 3, 옵저버패턴, Observer Pattern [Unity]

우리가 왜 이벤트를 활용해보았을까. 바로 옵저버 패턴이란 것을 익혀보기 위함이었다. 옵저버 패턴은 어떤 때에 쓰일까?? 다수의 클래스가 하나의 이벤트에 대해 무엇인가 해야할 때 쓰인다. 이전 글에서 플레이어가 죽거나, 적이 죽을 때처럼 많은 곳에서 참조할 때?? 그정도? 알아보자 옵저버 패턴은 이런 식으로 진행된다. 하지만 모든 Observer마다 Notify를 하긴 귀찮기에 인터페이스를 이용하기도 한다. 이번에는 목숨이 다 소모되어서 게임이 끝났을 때를 가정해보자 게임 상에 남은 Enemy와 아이템은 없어지고 점수는 0으로 초기화되고 GAME OVER 문구가 떠야한다. 여기서 옵저버 패턴을 한 번 써보자. 그럼 인터페이스 만들어보자 이제는 Subject에 Private으로 Observer 리스트 만들고..

Handling Event, 이벤트 활용하기 - 2 [Unity]

이어서 이벤트를 활용해보자 이전 글과 이어진다. 이번에는 Enemy가 죽으면 해당하는 점수를 인터페이스 보여주려고 한다. 여기선 HUD, Head Up Display로 나타난다. 총알을 맞으면 어떻게 되는지 보자 private void OnCollisionEnter2D(Collision2D collision) { Destroy(collision.gameObject); GameObject xPlosion = Instantiate(explosion, transform.position, Quaternion.identity); xPlosion.transform.localScale = new Vector2(2, 2); Destroy(gameObject); } 이번에도 이벤트를 이용하고 싶다. 이번엔 이런 식으로 ..

Handling Event, 이벤트 활용하기 [Unity]

이벤트를 배워놓고 어디다 써먹는지 몰랐다. 이제 왜 이벤트를 써야하는지 알아 볼 차례다. 알아보자 문제 상황 플레이어가 총을 쏘는데 총알이 스크린을 벗어나거나 적에게 맞지 않는다면 총알을 쏠 수 없게 만들고 싶다. 즉, 총알을 쏘는 속도를 제어하고 싶다는 말이다. 그래서 생각해낸 생각이 아래와 같다. 플레이어 스크립트에서 Disable, 과 Enable로 총을 쏠 수 있게 하고 총알 자체에서 스크린 밖으로 벗어난 것을 감지하면 그것을 플레이어에게 알려줌으로 Scene에 활성화 된 총알을 하나만 만들려고 한다. 여기 플레이어의 스크립트가 있다. 그렇게 구현하고자 한다면 #region Projectile Management public void EnableProjectile() { projectileEnab..

이벤트, Events [Unity]

이벤트하면 뭐 경험치 2배, 선물 주는 것 생각이 나는 여기선 그건 아니고 정말 이벤트다. 사건이라고... 해석하기보다 그냥 Event로 받아들이자. 알아보자 정의해보자 어떤 이벤트가 일어났으면 설정해놓은 메서드를 불러와서 실행시킨다. delegate에 메서드를 담아서 실행시키는 것과 비슷한 원리다. 다만 Event는 static으로 선언되어 객체없이도 어디서나 접근할 수 있게해놓는 것이다. 그렇게 이용한다고 한다. public delegate void ClickAction(); public static event ClickAction OnClicked; 이런 식으로 선언한다. delegate으로 먼저 선언해준다. 그 후 event 키워드를 사용하여 메서드를 써준다. ** static으로 설정하지 않아도..

어트리뷰트, Attributes [Unity]

아.. 사실 속성이란 뜻인데 속성이라고 하면 property도 있어서 그냥 해석하지말고 영어 그대로를 받아들이는 것이 낫다. 알아보자 또 정의부터 하고 넘어가야겠지. 어트리뷰트란 어셈블리, 모듈, 클래스, 구조체, 열거형변수, 생성자, 메소드, 프로퍼티, 필드, 이벤트, 인터페이스, 파라미터, 반환값, 델리게이트 같은 프로그래밍 요소에 대해 메타정보를 포함 시킬수 있는 기능을 말한다. 어트리뷰트에는 아래와 같은 곳에 쓰인다. Conditional - 메서드 실행 관여 DllImport - 외부 DLL 사용 Obsolete - 메서드 설명 Transaction - 트랜잭션 관리 WebService - 웹서비스 관련 Serializable -- 클래스 직렬화 ??????? 감이 안오는데..??? 뭐야? 유니..

델리게이트, Delegates [Unity]

델리게이트?? 뭔가 했다. 아직도 뭔가 하는 것 같다. 알아보자 우선 정의해보자 Delagate는 도대체 뭐하는 앤가? delegate 해석하면 "대신 ~해준다" 정도로 해석된다. 뭘 대신해준다는 것일까? Container for similar functions (or methods)다. 다시말해서 메서드를 참조해준다. 우리는 변수를 선언해서 값을 담을 수 있지만 메서드를 담을 수 있는 변수는 없다. delegate는 메서드를 담아준다. delegate void firstdelegate(); firstdelegate = hello(); public void hello() { print("Hello!"); } hello라는 메서드를 firstdelegate가 참조한다. 어떻게 사용하느냐? 1. delega..

Coroutine,코루틴(IEnumerator, StartCoroutine, yield 등 )에 대한 모든 것 [Unity]

모든 것을 자세히 알기 전에 코루틴(Coroutine)이라는 것에 대해서 알고 가야 한다. A coroutine is a function that can suspend its execution (yield) until the given YieldInstruction finishes. 쉽게 말하면 잠시 ~할 시간을 준다. 다시 말해서 Interval을 준다. YieldInstruction이 끝날 때까지 Interval을 주는 것이다. 근데 왜 쓰느냐? 우선 대표적으로는 Single function임에도 시간이 오래걸리는 함수를 실행한다면 그 실행동안은 게임이 frozen 된 것 같이 보이겠지? 그래서 코루틴으로 그것을 해결할 수 있고 또한 Timer같이 일정 시간 이후에 쓰이게 할 수 있다. 코루틴(Cor..

싱글톤의 특징, Singleton [Unity]

뭔가 소스를 작성하다 보면 어디서든지 접근할 수 있는 하나의 인스턴스만 있는 그런 경우가 있다. ** 예를 들면 데이터를 담당하는 오브젝트같이 하나의 인스턴스만 필요로 하는 Control Class 혹은 Manager Class를 만들어야 하는 일이 발생한다. 그럴 땐 거의 싱글톤 패턴이나, 정적 클래스로 많이 제작을 한다. -> 이전의 글에서 데이터를 다룰 땐, 정적 클래스로 접근했다. 그러나 싱글톤 패턴과 정적 클래스를 섞어서 쓰면 코드가 더러워진다. 그래서 차이를 알고 적절히 써야한다. 그래서 오늘 이 글을 쓴다. 알아보자 **Unity는 C#을 언어로 쓰지만 싱글톤 사용 시 방식이 조금 다르다. 일반 C#에서는 기본 생성자를 사용하지 못하게 private으로 막아야 한다. 유니티에서는 Monobe..

Namespace, 네임스페이스 [Unity]

모든 언어들에게 있는 외부 라이브러리, 툴 같이 필요한 것들을 불러오는 것. 엄청나게 많은 것들 중에 무엇을 가져올지 모른다. C#에서는 네임스페이스가 해결해준다. 알아보자 정의부터하자 네임스페이스란 클래스를 구분하기 위한 이름표 같은 것이다. C#이 기반으로 있는 닷넷프레임워크에는 수많은 클래스가 있는데 클래스 간의 충돌을 막고 사용자의 편의성을 위해 네임스페이스를 정의했다. 극단적으로 예를 들어 문자열을 add 하는 함수랑 숫자를 add 하는 함수랑 이름이 Add로 같을 수도 있잖아..? Add()이렇게 쓰면..되겠냐고... ++ 사실 오버로드(Overload)가 되어서 파라미터마다 다르게 적용되겠지만 아무튼 그래서 다른 이름표인 네임스페이스를 붙이는 것이다. **사실 클래스는 네임스페이스가 붙어야 ..

Extension Method, 확장 메서드 [Unity]

역시나 해석 그대로다. 메서드 확장하는 것이다. 알아보자 정의부터 하자면 기존 내장 되어있는 소스들을 수정 안해도 사용자 정의 메서드를 추가할 수 있는 것이다. ** 이것이 목적이라고 보는 게 맞겠다. ex) Transform 같은 경우 내장되어 있어서 일반적으로 접근이 불가능하다. Generic이 아니면서 static 클래스에서만 정의되며 static 메서드로 정의한다. -> 그냥 static 메서드로 인식 되지 않고 확장 메서드로 인식되는 이유는 this 키워드로 "첫번째" parameter를 받기 때문이다. **만약 매개변수가 더 필요하면 그 때는 this를 붙이지 않고 입력해야 한다. **여기서 this는 2가지 역할을 한다. 1. 어느 클래스의 확장 메서드가 될지 결정한다. 2. 해당되는 클래스..

728x90
반응형