https://youtu.be/aev7a9nknvo

Download: GooglePlay / Steam

21st Roadmap

Hello players! Jay from Future Cat Labs here with your 21st 'Find with Seoul' development diary. Thanks for sticking with me. Let's get right into it.

About That Map...
I have to apologize; the promised map isn't ready. I've realized my planning was a bit ambitious, so to get things on track, I've created a roadmap. Expect to see updates on this weekly.

New Monthly Goal: One Map
Despite the hiccup, delivering a new map within this month is still the main aim. The roadmap should help keep things in focus.

That's the snapshot for now. Your support is my inspiration, and your feedback is always my guide.

Until next week,
Jay at Future Cat Labs

P.S. Stay tuned, and let's keep leveling up together!

Creator

Patreon Link

'_Diary > Dev' 카테고리의 다른 글

[Run for Seoul] Devlog #1  (0) 2023.10.04
[Stations In Seoul] Devlog #12  (0) 2023.10.04
[Find with Seoul] Devlog #20  (0) 2023.09.25
[Find with Seoul] Devlog #19  (0) 2023.09.16
DRM(Digital Rights Management)이란?  (0) 2023.08.29
블로그 이미지

RIsN

,

https://youtu.be/JBX3NxEZ6D0

Download: GooglePlay / Steam

Hello players! 

Jay here from Future Cat Labs, coming at you with the 20th installment of our 'Find with Seoul' development diary. Your enthusiasm and support are the very fuel that keeps this engine going, so let's get into what's been cooking.

Updates Are on the Way, Just Hang Tight!
Apologies for the radio silence on new updates. The wheels are definitely turning behind the scenes, and I'm geared up to bring you some new excitement real soon.

In the Lab: Lip-Sync for Written Dialogue
Ever thought how neat it would be for characters to really "speak" their lines? Well, I've been tinkering with making their lips move in sync with the written text. It's a small detail that I hope adds a whole new layer of immersion.

Stage Navigation via Keyboard
Switching gears a bit, I'm working on enabling keyboard controls for navigating through the game stages. Your hands won't know what hit 'em!

Upcoming Map: It's Still a Thing!
If you're itching for fresh terrain, rest assured, a new map is still in the works and I'm aiming to release it this month. It's going to be a game-changer, pun intended.

Thank you for being the co-pilots in this incredible journey. Your continual support and input make all the difference.

Here's to another week of top-notch gaming,
Jay at Future Cat Labs

P.S. We're in this for the long haul, and the best is still to come. Let's continue to level up together!

Creator

Patreon Link

'_Diary > Dev' 카테고리의 다른 글

[Stations In Seoul] Devlog #12  (0) 2023.10.04
[Find with Seoul] Devlog #21  (0) 2023.10.03
[Find with Seoul] Devlog #19  (0) 2023.09.16
DRM(Digital Rights Management)이란?  (0) 2023.08.29
[Stations In Seoul] Devlog #11  (0) 2023.08.25
블로그 이미지

RIsN

,

디자인 패턴

  • 싱글턴 패턴 (Singleton Pattern)
    • 싱글턴 패턴은 특정 클래스의 인스턴스가 하나만 존재하도록 보장합니다. 게임 내의 설정이나 데이터베이스 연결과 같이 하나만 있어야 하는 객체에 사용했습니다.
  • 전략 패턴 (Strategy Pattern)
    • 전략 패턴은 특정 작업을 처리하는 알고리즘 또는 전략을 런타임에 변경할 수 있게 합니다. 예를 들어, 카드 변경에 따른 공격 패턴 변화 등에 사용했습니다.
  • 옵저버 패턴 (Observer Pattern)
    • 옵저버 패턴은 하나의 객체가 변할 때, 그 객체를 "관찰"하고 있는 다른 객체들에게 알려주는 패턴입니다. 이런 식으로 객체 간에 한 쪽이 다른 쪽을 자동으로 업데이트 할 수 있게 합니다.
      UI를 처음 구성할 때 등에 사용했습니다.

객체지향

  • 캡슐화 (Encapsulation)
    • 캡슐화는 객체의 상태와 행동을 하나로 묶고, 실제 구현 내용을 외부에 숨기는 것입니다. 캡슐화를 통해 객체가 어떻게 작동하는지 알 필요 없이 어떻게 사용하는지만 알면 됩니다.
  • 상속 (Inheritance)
    • 상속은 기존의 클래스를 기반으로 새로운 클래스를 만들어서 코드를 재사용하거나 확장하는 것입니다. 몬스터 클래스를 여러가지로 분화해서 사용했습니다.
  • 다형성 (Polymorphism)
    • 다형성은 하나의 인터페이스나 클래스를 여러 가지 방식으로 동작하게 할 수 있습니다. 다형성을 통해 코드가 더 유연해지고 쉽게 확장할 수 있습니다. Virtual이 그 대표적 예로 몬스터의 공격을 다양하게 만드는 등에 사용했습니다.
  • 추상화 (Abstraction)
    • 추상화는 복잡한 시스템을 간단한 인터페이스로 단순화시키는 것입니다. 추상 클래스나 인터페이스를 사용해서 구현합니다. Abstract가 대표적 예로, 초기화가 있어야 하는 클래스에 Init등을 강제하거나 할 때 사용했습니다.

C#

  • C#에서 가비지 컬렉션은 어떻게 작동하나요?
    • .NET의 CLR(Common Language Runtime)이 자동으로 메모리 관리를 해주며, 사용되지 않는 객체를 찾아 메모리를 회수합니다.
  • LINQ란 무엇이고 어떻게 사용하나요?
    • LINQ(Language-Integrated Query)는 쿼리를 프로그래밍 언어에 통합시킨 것입니다. 이를 통해 SQL과 유사한 방법으로 데이터를 처리할 수 있어요.
  • C#에서 예외 처리는 어떻게 하나요?
    • try, catch, finally 블록을 사용하여 예외를 처리합니다.
  • 비동기 프로그래밍에 대해 설명해주세요.
    • async와 await 키워드를 사용해서 I/O 작업이나 복잡한 연산을 백그라운드에서 실행할 수 있게 해줍니다.

C# Event

  • 이벤트(Event)가 무엇인지 설명해 주세요.
    • 이벤트는 클래스나 객체가 특정 조건이나 상황이 발생했을 때 다른 클래스나 객체에게 알려주는 메커니즘입니다. 예를 들어, 버튼 클릭이나 키 입력 같은 UI 상호작용을 다룰 때 유용합니다.
  • C#에서 이벤트를 어떻게 선언하나요?
    • event 키워드를 사용해서 선언합니다. 대게 델리게이트 타입을 이용합니다. 예를 들어, public event EventHandler MyEvent;와 같이 선언할 수 있습니다.
  • 이벤트와 델리게이트의 차이점은 무엇인가요?
    • 델리게이트는 단순히 메서드를 가리키는 타입입니다. 반면 이벤트는 델리게이트를 기반으로 하되, 외부에서 무분별한 호출을 막을 수 있도록 캡슐화된 형태라고 할 수 있습니다.
  • 이벤트를 구독하고 해지하는 방법은?
    • += 연산자를 사용해 구독하고, -= 연산자를 사용해 해지할 수 있습니다. 예를 들어, MyEvent += new EventHandler(MyMethod);로 구독하고, MyEvent -= new EventHandler(MyMethod);로 해지합니다.
  • 이벤트에 여러 개의 리스너를 붙일 수 있나요?
    • 네, 가능합니다. 이벤트는 멀티캐스팅 델리게이트를 사용하기 때문에 여러 메서드가 동시에 이벤트를 구독할 수 있습니다.
  • 이벤트와 예외 처리는 어떻게 다른가요?
    • 이벤트는 일반적으로 예측 가능한 상황에서 사용되며, 예외 처리는 예측하지 못한 오류 상황을 다룰 때 사용됩니다. 이벤트는 명시적으로 구독과 해지를 관리해야 하지만, 예외 처리는 try-catch 블록을 사용해 자동으로 관리됩니다.
  • C#에서 EventArgs 클래스는 무엇이고 왜 사용하나요?
    • 답변: EventArgs는 이벤트 데이터를 전달하는 표준 클래스입니다. 이를 상속받아 커스텀 이벤트 데이터 클래스를 만들 수 있습니다. 이렇게 하면 이벤트가 발생했을 때 추가 정보를 전달할 수 있습니다.

C# SQL

  • ADO.NET이 무엇인가요?
    • ADO.NET은 .NET Framework에서 데이터베이스에 접근할 수 있도록 도와주는 라이브러리입니다. SQL Server, MySQL 등 다양한 데이터베이스에 접속할 수 있습니다.
  • Connection Pooling에 대해서 설명해주세요.
    • Connection Pooling은 데이터베이스 연결을 재사용하여 성능을 향상시키는 기술입니다. 연결을 미리 여러 개 생성해 두고, 필요할 때마다 풀에서 꺼내 씁니다.
  • C#에서 SQL Server에 연결하는 방법은?
    • SqlConnection 클래스를 사용해서 SQL Server에 연결할 수 있습니다. ConnectionString 속성에 데이터베이스 정보를 설정하고, Open 메서드로 연결을 엽니다.
  • SQL Injection이란 무엇이며 어떻게 예방하나요?
    • SQL Injection은 사용자 입력을 적절히 처리하지 않아 악의적인 SQL 쿼리가 실행되는 보안 취약점입니다. 이를 예방하기 위해 파라미터화된 쿼리나 Stored Procedure를 사용합니다.
  • LINQ to SQL에 대해 설명해주세요.
    • LINQ to SQL은 C#에서 SQL 데이터베이스에 LINQ 쿼리를 사용할 수 있게 해주는 ORM(Object-Relational Mapping) 도구입니다. 간편하게 데이터베이스에 접근할 수 있습니다.
  • 트랜잭션이 무엇이고 C#에서 어떻게 사용하나요?
    • 트랜잭션은 데이터베이스의 상태를 일관되게 유지하기 위한 작업 단위입니다. C#에서는 SqlTransaction 클래스를 사용해 트랜잭션을 구현할 수 있습니다.
  • DataReader와 DataSet의 차이점은 무엇인가요?
    • DataReader는 순방향 읽기 전용 커서를 제공해 빠른 데이터 접근이 가능하지만, 한 번에 하나의 테이블만 처리할 수 있습니다. DataSet은 메모리에 데이터를 캐시하여 여러 테이블을 동시에 다룰 수 있습니다.

C#으로 MySQL을 사용하는 법

  • C#에서 MySQL 데이터베이스에 연결하기 위해서는 대개 MySql.Data 라이브러리를 사용합니다. 이 라이브러리는 NuGet 패키지 매니저를 통해 쉽게 설치할 수 있습니다.
    1. 1. 라이브러리 설치: MySql.Data 패키지를 설치합니다.
    2. 2. 연결 문자열 설정: MySQL 서버에 연결 정보를 담은 연결 문자열을 설정합니다.
      string connectionString = "Server=localhost;Database=myDB;User ID=myUsername;Password=myPassword;Pooling=false;";
    3. 3. MySqlConnection 객체 생성: 연결 문자열을 이용해서 MySqlConnection 객체를 생성합니다.
      MySqlConnection connection = new MySqlConnection(connectionString);
    4. 4. 연결 열기: Open() 메서드를 사용해서 데이터베이스에 연결을 엽니다.
      connection.Open();
    5. 5. 쿼리 실행: 이후에는 MySqlCommand, MySqlDataReader 등을 사용해서 SQL 쿼리를 실행하고 결과를 처리합니다.
    6. 6. 연결 닫기: 작업이 끝나면 Close() 메서드를 사용해서 연결을 닫습니다.
      connection.Close();

C# 메모리 최적화

  • 가비지 컬렉션(Garbage Collection)이 무엇인가요?
    • 가비지 컬렉션은 .NET 런타임에서 자동으로 수행되는 메모리 관리 방법입니다. 사용되지 않는 객체를 자동으로 회수하여 메모리를 확보합니다.
  • 스택과 힙의 차이점은 무엇인가요?
    • 스택은 지역 변수와 메서드 호출 정보를 저장하고, LIFO(Last-In, First-Out) 방식으로 동작합니다. 힙은 동적으로 할당된 객체를 저장하고, 가비지 컬렉션에 의해 관리됩니다.
  • Dispose와 Finalize 메서드의 차이점은 무엇인가요?
    • Dispose는 개발자가 명시적으로 호출할 수 있는 메서드로, 자원을 즉시 해제합니다. Finalize는 가비지 컬렉터가 호출하며, 객체가 메모리에서 제거될 때 자원을 해제합니다.
  • C#에서 using 키워드의 역할은 무엇인가요?
    • using 키워드는 IDisposable 인터페이스를 구현한 객체의 Dispose 메서드를 자동으로 호출합니다. 이렇게 하면 자원을 효율적으로 해제할 수 있습니다.
  • 메모리 릭(Memory Leak)을 방지하기 위한 방법은?
    • 이벤트 핸들러를 적절히 해제하고, 사용하지 않는 객체에 대한 참조를 끊는 것이 중요합니다. 또, IDisposable을 구현하여 명시적으로 자원을 해제할 수 있습니다.
  • 값 타입과 참조 타입의 메모리 관리 차이점은?
    • 값 타입은 스택에 저장되고, 참조 타입은 힙에 저장됩니다. 값 타입은 스택 프레임이 사라질 때 자동으로 메모리가 해제되며, 참조 타입은 가비지 컬렉션에 의해 관리됩니다.
  • Weak Reference가 무엇이고 언제 사용하나요?
    • Weak Reference는 가비지 컬렉션의 대상이 될 수 있는 참조입니다. 객체가 더 이상 필요하지 않을 때 메모리를 쉽게 회수할 수 있도록 하기 위해 사용합니다.
  • Value Type과 Reference Type의 메모리 사용 방식을 설명해주세요.
    • Value Type은 스택에 저장되고, Reference Type은 힙에 저장됩니다. Value Type은 메모리 관리가 더 효율적이지만, 크기가 커지면 성능에 문제가 생길 수 있습니다.
  • C#에서의 메모리 누수를 방지하는 방법은?
    • IDisposable 인터페이스를 구현하여 관리되지 않는 리소스를 해제하거나, WeakReference를 사용해 참조를 유지하는 것이 좋습니다.
  • Stackalloc이 무엇이고 언제 사용하는지 설명해주세요.
    • Stackalloc은 스택에 메모리를 할당하는데 사용합니다. 주로 작은 배열이나 버퍼를 빠르게 할당할 때 사용합니다.
  • C#에서의 메모리 최적화 기법 중 하나를 들고 설명해주세요.
    • Object Pooling이 있습니다. 이 기법은 빈번히 생성과 해제가 이루어지는 객체를 미리 생성해 두고 재사용함으로써, 메모리 할당과 해제에 따른 오버헤드를 줄입니다.
  • 배열과 List의 메모리 사용에 대해서 설명해주세요.
    • 배열은 크기가 고정되어 있어 메모리 사용이 예측 가능하지만, List는 동적으로 크기가 변경되므로 내부적으로 배열을 다시 할당하는 과정이 있어 메모리 사용이 불안정할 수 있습니다.
  • C#에서 메모리 최적화 하는 법에 대해서 설명해주세요.
    • C#에서 메모리를 최적화하는 방법은 여러 가지가 있습니다.
    • 먼저, Garbage Collection에 의존하지 않고 IDisposable 인터페이스를 사용해서 관리되지 않는 리소스를 명시적으로 해제할 수 있습니다. 이렇게 하면 메모리 누수를 방지하고 성능을 개선할 수 있습니다.
    • 또한, 객체 풀링(Object Pooling)을 사용해서 빈번하게 생성과 해제가 발생하는 객체를 재사용할 수 있습니다. 이 방법은 메모리 할당과 해제에 따른 오버헤드를 줄이고 성능을 향상시킵니다.
    • Value Type과 Reference Type을 적절히 사용하는 것도 중요합니다. Value Type은 스택에 저장되므로 빠르게 접근 가능하지만, 크기가 커지면 문제가 될 수 있습니다. Reference Type은 힙에 저장되기 때문에 관리가 복잡할 수 있습니다.
    • Stackalloc이라는 키워드를 사용해서 스택에 메모리를 할당할 수도 있습니다. 이 방법은 작은 배열이나 데이터 구조를 빠르게 할당하고 해제하는 데 유용합니다.
    • 마지막으로, 불필요한 객체 생성을 피하는 것도 중요합니다. 예를 들어, 문자열 연산을 할 때 StringBuilder를 사용하거나, 컬렉션을 사용할 때 크기를 미리 할당하는 것이 효율적입니다.

자료구조

  • 배열과 연결 리스트의 차이점은 무엇인가요?
    • 배열은 메모리 상에서 연속적인 위치에 데이터를 저장하며, 빠른 접근이 가능합니다. 하지만 크기가 고정되어 있습니다. 연결 리스트는 각 노드가 포인터로 다음 노드를 가리키며, 동적 크기를 가집니다.
  • 스택과 큐의 차이점은 무엇인가요?
    • 스택은 LIFO(Last-In, First-Out) 방식으로 데이터를 저장하고, 큐는 FIFO(First-In, First-Out) 방식으로 데이터를 저장합니다.
  • 해시 테이블이란 무엇이고, 언제 사용하나요?
    • 해시 테이블은 키-값 쌍으로 데이터를 저장하며, 해시 함수를 통해 빠르게 데이터에 접근할 수 있습니다. 검색, 삽입, 삭제가 빠른 시간 안에 이루어져야 할 때 사용합니다.
  • 이진 트리와 이진 탐색 트리의 차이점은 무엇인가요?
    • 이진 트리는 각 노드가 최대 두 개의 자식 노드를 가지는 트리입니다. 이진 탐색 트리는 이진 트리의 일종이지만, 왼쪽 자식 노드는 부모 노드보다 작고, 오른쪽 자식 노드는 부모 노드보다 크다는 추가적인 조건이 있습니다.
  • 빅 오 표기법에 대해 설명해보세요.
    • 빅 오 표기법은 알고리즘의 성능을 평가하는 표기법입니다. 입력 크기에 따라 알고리즘의 시간 복잡도나 공간 복잡도를 나타냅니다.
  • 그래프와 트리의 차이점은 무엇인가요?
    • 그래프는 노드와 노드를 연결하는 간선으로 구성되며, 사이클이 있을 수 있습니다. 트리는 그래프의 한 종류로, 사이클이 없고, 루트 노드에서 시작해서 모든 노드가 정확히 하나의 부모 노드를 가집니다.
  • 동적 배열과 연결 리스트 중 어떤 것을 사용할지 어떻게 결정하나요?
    • 빠른 무작위 접근이 필요하면 동적 배열을, 삽입과 삭제가 빈번하고 순차적인 접근만 필요하다면 연결 리스트를 사용합니다.

 

블로그 이미지

RIsN

,

https://youtu.be/T0TnQXJZ2qI

Download: GooglePlay / Steam

Hey players! 
It's Jay from Future Cat Labs, back with the 19th edition of our development diary for 'Find with Seoul.' 
You're the spark that keeps my creative fires burning, and your encouragement means the world.

No Fresh Updates—But I'm Hard at Work!
I apologize for not rolling out new updates this week. They're brewing, though, and I'm hustling to get them just right for you.

On the Drawing Board: Dynamic Characters
How cool would it be to see game characters' mouths move when they talk? I'm brainstorming ideas to breathe even more life into our virtual buddies, so they're not just digital mannequins. It's all about the little things that add a dash of realism and a heap of charm.

New Stage Alert!
A brand-new stage is in the pipeline! My goal is to get it out to you within the month. Fresh story, new challenges, and more fun await!

A Quick Note
Sorry for the delay in releasing this diary entry. Balancing personal responsibilities, like figuring out living expenses, with game development took a bit more time than I expected. But know that I'm committed to keeping things timely moving forward.

You guys are the wind beneath my wings. Your ongoing support, your invaluable feedback—it's the stuff that dreams are made of.

Wishing you a week full of epic gaming,
Jay at Future Cat Labs

P.S. Keep those seat belts fastened; the ride is just getting started. So thrilled you're here for the journey. Let's continue to reach new heights together!

Creator

Patreon Link

'_Diary > Dev' 카테고리의 다른 글

[Find with Seoul] Devlog #21  (0) 2023.10.03
[Find with Seoul] Devlog #20  (0) 2023.09.25
DRM(Digital Rights Management)이란?  (0) 2023.08.29
[Stations In Seoul] Devlog #11  (0) 2023.08.25
[Find with Seoul] Devlog #18  (0) 2023.08.25
블로그 이미지

RIsN

,

확인 이유: 에픽게임즈 출시를 준비하면서 확인차

Digital Rights Management의 약자로, 디지털 콘텐츠의 저작권을 관리하기 위한 기술이에요. 간단히 말하면, DRM은 불법 복제를 막고, 콘텐츠를 어떻게, 얼마나, 언제 사용할 수 있는지를 제어하는 시스템이죠.

DRM의 주요 기능

  • 라이선스 키: 사용자가 콘텐츠에 접근하기 위해서는 라이선스 키가 필요하게 하는 것
  • 시간 제한: 콘텐츠의 사용 가능 기간을 제한
  • 지역 제한: 특정 지역에서만 콘텐츠에 접근 가능하도록 설정
  • 복제 방지: 콘텐츠의 무단 복제를 막음

Unity에서 DRM 적용하는 방법

  1. 플러그인 사용: Unity Asset Store에서 제공하는 DRM 관련 플러그인을 사용할 수 있어요.
  2. 커스텀 스크립트: Unity에서는 C# 스크립트를 통해 DRM 관련 로직을 직접 구현할 수 있어요. 예를 들어, 서버에 라이선스 키를 확인하는 로직을 넣을 수 있죠.
  3. 외부 서비스: Steamworks SDK나 Epic Games Store와 같은 게임 배포 플랫폼은 자체 DRM 서비스를 제공하기도 해요. 이를 Unity 프로젝트에 연동시킬 수 있어요.
  4. 예시:
    • 라이선스 키 확인: 게임 시작 시 서버에 라이선스 키를 보내 검증
    • 암호화: 게임 데이터나 리소스 파일을 암호화

'_Diary > Dev' 카테고리의 다른 글

[Find with Seoul] Devlog #20  (0) 2023.09.25
[Find with Seoul] Devlog #19  (0) 2023.09.16
[Stations In Seoul] Devlog #11  (0) 2023.08.25
[Find with Seoul] Devlog #18  (0) 2023.08.25
[Steam] 통계 및 업적(Stats and Achievements)  (0) 2023.08.19
블로그 이미지

RIsN

,

사용 이유: 치트 및 테이블 다운로드가 우연히 빌드에서 실행되지 않도록 하기 위해

Conditional Compilation이라는 것은 컴파일러에게 "이 조건이 충족되면 이 코드를 컴파일해, 그렇지 않으면 무시해"라고 말하는 방법이야. 즉, 코드가 실제로 실행 파일에 포함될지 여부를 미리 정의하는 것이지!

조건부 컴파일은 여러 이유로 유용해:

  1. 플랫폼 별 코드: 안드로이드와 iOS, PC 등 다양한 플랫폼에서 동작해야 할 때 각 플랫폼에 맞는 코드만 컴파일할 수 있어.
  2. 디버깅: 개발 중에는 디버깅 코드가 필요하지만, 실제 릴리즈에서는 그런 코드를 빼고 싶을 때 사용해.
  3. 버전 관리: 예를 들어, 레거시 시스템과 새로운 시스템이 함께 동작해야 하는 경우, 조건부 컴파일을 이용해 구버전 코드와 신버전 코드를 분리할 수 있어.

C#과 Unity에서 많이 쓰이는 예시가 이런 것들이야:

#if UNITY_EDITOR
    // 에디터에서만 실행될 코드
#elif UNITY_ANDROID
    // 안드로이드에서만 실행될 코드
#elif UNITY_IOS
    // iOS에서만 실행될 코드
#endif

이렇게 하면, 해당 조건이 참인 경우에만 코드가 컴파일되고 실행되겠지. 😸🌟

많은 프로그래밍 언어가 이러한 조건부 컴파일을 지원해, 게임 개발뿐만 아니라 다양한 프로젝트에서도 쓸모있는 기능이야! 🎮💫

블로그 이미지

RIsN

,

https://youtu.be/lMUzQ6dW8Ng

Download: Steam Wishlist

Hey players,

Welcome to the 11th development diary for 'Stations in Seoul' from Future Cat Labs. Your support fuels my creativity, and I've got some updates to share!

What's Happening?

Focusing on Convenience: I'm committed to enhancing your experience in the game. Every detail matters, and I'm working to make everything just right.

Expanding the Story: There's more to explore in 'Stations in Seoul'. New chapters, more excitement, and endless fun are on the horizon.

A Week of Reflection: No major updates this week, but that doesn't mean I'm not hard at work. I'm brainstorming, planning, and dreaming big for our next steps.

Thank you for being part of this journey. Your encouragement and feedback continue to inspire me. Here's to making 'Stations in Seoul' a game you'll love!

Best,
Jay at Future Cat Labs

Creator

Patreon Link

'_Diary > Dev' 카테고리의 다른 글

[Find with Seoul] Devlog #19  (0) 2023.09.16
DRM(Digital Rights Management)이란?  (0) 2023.08.29
[Find with Seoul] Devlog #18  (0) 2023.08.25
[Steam] 통계 및 업적(Stats and Achievements)  (0) 2023.08.19
[Stations In Seoul] Devlog #10  (0) 2023.08.17
블로그 이미지

RIsN

,

https://youtu.be/RuBenq8uwv4

Download: GooglePlay / Steam

Hey players, it's Jay from Future Cat Labs! 

Welcome to the 18th development diary for Find with Seoul! Your encouragement fuels my creativity and drives me to make this game a work of heart. 

No New Updates This Week, but the Wheels Are Turning! 

Always Striving for Convenience! 
I'm like a detective with a magnifying glass, still examining those little nooks and crannies that need smoothing out. I'm on a mission to make your experience with Find with Seoul as comfortable as a cozy chair in your favorite cafe.

Cooking Up More Story and Future Plans! 
The plot thickens, and the future's bright! I'm knee-deep in thoughts and sketches, crafting additional storylines, and pondering where our adventure goes next. It's like being a novelist and a game creator rolled into one, and I can't wait to share these new chapters with you.

Although this week may seem quiet, it's been a time of reflection, planning, and laying the groundwork for the exciting twists and turns ahead. Rest assured, the gears are always turning here at Future Cat Labs!

I couldn't do this without your constant support. You're the co-pilots on this thrilling journey, and your feedback and ideas are always welcome. 

Wishing you a fantastic gaming week,
Jay at Future Cat Labs

P.S. Stay tuned, adventurers! The best is yet to come, and I'm beyond thrilled to have you all aboard this incredible ride. Let's keep reaching for the stars together! 

Creator

Patreon Link

'_Diary > Dev' 카테고리의 다른 글

DRM(Digital Rights Management)이란?  (0) 2023.08.29
[Stations In Seoul] Devlog #11  (0) 2023.08.25
[Steam] 통계 및 업적(Stats and Achievements)  (0) 2023.08.19
[Stations In Seoul] Devlog #10  (0) 2023.08.17
[Find with Seoul] Devlog #17  (0) 2023.08.17
블로그 이미지

RIsN

,

원문: https://partner.steamgames.com/doc/features/achievements

통계 및 업적(Stats and Achievements)

개요

Steam 통계 및 업적은 게임에서 사용자에게 지속적인 로밍 업적 및 통계 추적을 제공할 수 있는 쉬운 방법을 제공합니다. 사용자의 데이터는 Steam 계정과 연결되며, 각 사용자의 업적과 통계는 형식이 지정되어 Steam 커뮤니티 프로필에 표시될 수 있습니다.

장점

업적은 게임 플레이어에게 높은 가치의 보상을 제공하는 것 외에도 팀워크와 플레이어 상호 작용을 장려하고 보상하며, 게임 목표에 추가적인 차원을 부여하고, 게임에서 더 많은 시간을 보낸 사용자에게 보상을 제공하는 데 유용합니다.

통계는 플레이 시간, 파워업 사용 횟수 등과 같은 세분화된 정보를 추적합니다. 예를 들어, 여러 대의 컴퓨터에서 수집한 여러 세션의 게임 플레이 통계를 기반으로 업적을 부여하는 등 단순히 게임 내부 데이터를 추적하는 데 사용할 수도 있습니다.

구현 개요

게임의 업적 및 통계 정의

도전 과제는 애플리케이션에 따라 다르며 Steamworks 파트너 사이트의 앱 관리자 페이지에서 설정할 수 있습니다.

게임에서 저장할 수 있는 통계에는 세 가지 유형이 있습니다:

  • INT - A 32-bit (signed) integer (e.g. number of games played)
  • FLOAT - A 32-bit floating point value (e.g. number of miles driven)
  • AVGRATE - A moving average. See: The AVGRATE stat type

Steamworks 파트너 웹사이트는 게임의 통계와 업적을 정의하고 업데이트할 수 있는 인터페이스를 제공합니다. 이를 사용하면 다음과 같이 할 수 있습니다:

  • 초기 통계 및 성과 정의
  • 추가 통계 및 업적 추가
  • 업적 이름, 설명 및 아이콘 업데이트
  • 통계 매개변수 및 제약 조건 업데이트(최대/최소값, 이동 평균 창 크기 등)

통계에는 다음과 같은 속성이 있습니다:

  • ID - 각 스탯에 대해 자동으로 생성된 숫자 ID입니다.
  • Type - 이 통계의 유형 - INT, FLOAT, or AVGRATE.
  • API Name - API를 사용하여 이 통계에 액세스하는 데 사용되는 문자열입니다.
  • Set By - 통계를 수정할 수 있는 사용자를 설정합니다. 기본값은 클라이언트입니다. 자세한 내용은 게임 서버 통계(Game Server Stats)를 참조하세요.
  • Increment Only - 이 스탯을 설정하면 시간이 지남에 따라 값만 증가하도록 허용됩니다.
  • Max Change - 설정하면 통계 값이 한 SetStat 호출에서 다음 호출로 변경될 수 있는 양에 제한을 설정합니다.
  • Min Value - 설정하면 이 통계가 취할 수 있는 최소 숫자 값입니다. 기본적으로 최소값은 기본 숫자 유형(INT_MIN 또는 -FLT_MAX)의 최소값입니다.
  • Max Value - 설정하면 이 통계가 취할 수 있는 최대 숫자 값입니다. 기본적으로 최대값은 기본 숫자 유형(INT_MAX 또는 FLT_MAX)의 최대값입니다.
  • Default Value - 설정하면 새 사용자에 대해 이 통계가 처음에 설정되는 기본값이 됩니다. 설정하지 않으면 기본값은 0입니다.
  • Aggregated - 이 옵션을 설정하면 Steam은 이 통계의 글로벌 총합을 유지합니다. 자세한 내용은 아래의 글로벌 통계를 참조하세요.
  • Display Name - 앱에 표시되는 이 통계의 이름입니다.

AVGRATE 통계에는 다음과 같은 추가 속성이 있습니다:

  • Window - 데이터를 평균화하는 데 사용되는 '슬라이딩 창'의 크기입니다.

AVGRATE 통계는 Steam에서 자동으로 평균을 내는 통계입니다. 자세한 내용은 아래 AVGRATE 섹션을 참조하세요.

업적에는 다음과 같은 속성이 있습니다:

  • ID - 각 업적에 대해 자동으로 생성된 숫자 ID입니다.
  • API Name - API를 사용하여 이 업적에 액세스하는 데 사용되는 문자열입니다.
  • Progress Stat - 커뮤니티에서 이 업적의 진행률 표시줄로 사용되는 스탯을 지정합니다. 스탯이 잠금 해제 값에 도달하면 업적도 자동으로 잠금 해제됩니다.
  • Display Name - 이 업적의 이름은 클라이언트 알림 팝업과 커뮤니티에서 확인할 수 있습니다. 현지화될 수 있습니다.
  • Description - 커뮤니티에 표시하기 위한 이 업적에 대한 설명입니다. 현지화될 수 있습니다.
  • Set By - 업적을 잠금 해제할 수 있는 사용자를 설정합니다. 기본값은 클라이언트입니다. 자세한 내용은 게임 서버 통계(Game Server Stats)를 참조하세요.
  • Hidden? - True라면, '숨겨진' 업적은 사용자가 달성할 때까지 사용자의 커뮤니티 페이지에 전혀 표시되지 않습니다.
  • Achieved Icon - 달성 시 표시되는 아이콘입니다.
  • Unachieved Icon - 아직 달성하지 못한 경우 표시되는 아이콘입니다.

다음은 Steamworks API 예제 애플리케이션(SpaceWar)의 업적 목록입니다:

 

특별 고려 사항

  • 업적 이름과 아이콘은 모든 연령대에 적합한 것이어야 합니다.
  • 기본적으로 게임은 처음에는 100개의 도전 과제로 제한됩니다. 앱이 프로필 기능(Profile Features)의 임계값에 도달하면 업적을 더 추가할 수 있습니다.

사용 방법

게임 내에서 통계 및 도전 과제에 액세스하기:

AVGRATE 통계 유형

이 유형의 통계는 독특하고 매우 유용한 기능을 제공하지만 설명하려면 조금 더 자세한 설명이 필요합니다.

"시간당 획득한 포인트"와 같은 평균 통계를 추적하고자 하는 경우를 생각해 보겠습니다. 한 가지 접근 방식은 두 개의 통계, 즉 INT "총 포인트"와 FLOAT "총 플레이 시간 시간"을 가진 다음 포인트를 시간으로 나누어 시간당 포인트를 구하는 것입니다.

이 구현의 단점은 플레이어가 상당한 양의 플레이 시간을 누적하면 계산된 평균이 매우 느리게 변한다는 것입니다. 실제로 사용자가 게임을 더 많이 플레이할수록 평균의 반응성이 떨어집니다. 사용자가 100시간 동안 게임을 플레이했다면, 계산된 평균은 그 중 약 50시간 정도 "지연"됩니다. 스킬이 증가해도 시간당 포인트가 기대만큼 증가하지 않습니다.

평균 통계 유형을 사용하면 평균에 "슬라이딩 윈도우" 효과를 구현할 수 있습니다. 예를 들어, 이전 몇 시간의 게임 플레이만 활용할 수 있으므로 통계에 플레이어의 현재 스킬 레벨이 더 정확하게 반영됩니다.

이전 20시간의 게임 플레이만 값에 영향을 미치는 "시간당 포인트"를 구현하기 위해 AVGRATE 통계를 설정해 보겠습니다. 이렇게 하려면 다음과 같이 하세요:

  • 평균은 "시간당"이므로 이 통계와 관련된 모든 시간 매개변수의 시간 단위는 "시간"이 됩니다. 이는 통계 자체의 Window 프로퍼티와 아래의 UpdateAvgRateStat에 전달된 "dSessionLength" 파라미터에도 적용됩니다.
  • "AvgPointsPerHour"라는 AVGRATE 통계와 20.0의 Window 속성을 만듭니다(이 값은 "시간" 단위임을 기억하세요).
  • 게임 중 적절한 시점에 다음 매개변수를 사용하여 ISteamUserStats::UpdateAvgRateStat를 호출합니다:
    • pchName - "AvgPointsPerHour"
    • flCountThisSession - UpdateAvgRateStat를 마지막으로 호출한 이후 플레이어가 획득한 포인트 수입니다.
    • dSessionLength - UpdateAvgRateStat를 마지막으로 호출한 이후의 게임 시간입니다. 단위는 통계의 창 프로퍼티에 있는 단위와 동일해야 합니다. 이 경우 "시간"입니다.
  • 예를 들어, 플레이어가 0.225시간(13.5분) 동안 지속된 마지막 라운드에서 77점을 획득했다면, SteamUserStats()->UpdateAvgRateStat( "AvgPointsPerHour", 77, 0.225 )가 됩니다.

위의 예에서 Steam은 현재 라운드 평균 점수인 시간당 342.2점(77을 0.225로 나눈 값)을 이전 값과 혼합합니다. 결과는 플레이어의 지난 20시간 게임 시간 동안의 총 평균을 반영합니다. 현재 사용자에 대한 스탯이 처음 업데이트된 경우 현재 값은 342.2가 됩니다.

이 예에서는 시간 단위로 '시간'을 사용했지만 원하는 시간 단위를 사용할 수 있습니다. 다만 "dSessionLength" 및 Window 프로퍼티의 기본 단위로 해당 단위를 일관되게 사용해야 한다는 점만 기억하세요.

다른 사용자에 대한 통계 가져오기

ISteamUserStats::RequestUserStats를 사용하여 다른 사용자의 통계를 가져올 수 있습니다. 그런 다음 ISteamUserStats::GetUserStat, ISteamUserStats::GetUserAchievementISteamUserStats::GetUserAchievementAndUnlockTime을 사용하여 해당 사용자에 대한 데이터를 가져올 수 있습니다. 이 데이터는 다른 사용자가 새 통계를 업로드해도 자동으로 업데이트되지 않으므로 데이터를 새로 고치려면 ISteamUserStats::RequestUserStats를 다시 호출하면 됩니다.

너무 많은 메모리를 사용하지 않기 위해 최근 사용량(LRU) 캐시가 유지되고 다른 사용자의 통계가 가끔 언로드됩니다. 이런 일이 발생하면 ISteamUserStats::UserStatsUnloaded_t 콜백이 자동으로 전송됩니다. 이 콜백이 전송되면 ISteamUserStats::RequestUserStats가 다시 호출될 때까지 지정된 사용자의 통계를 사용할 수 없게 됩니다.

오프라인 모드

Steam은 통계 및 업적 데이터의 로컬 캐시를 유지하여 오프라인 모드에서도 API를 정상적으로 사용할 수 있도록 합니다. 커밋할 수 없는 통계는 사용자가 다음에 온라인 상태가 될 때를 위해 저장됩니다. 두 대 이상의 컴퓨터에서 수정이 이루어진 경우, Steam은 자동으로 업적을 병합하고 더 많이 진행된 통계 세트를 선택합니다. Steam은 통계 데이터의 로컬 캐시를 보관하므로 게임에서 디스크에 데이터의 로컬 캐시를 보관할 필요는 없습니다. 이러한 캐시가 충돌하는 경우가 종종 발생하며, 충돌이 발생하면 사용자에게는 진행 상황이 되돌아간 것처럼 보이므로 매우 불쾌한 경험이 될 수 있습니다.

게임 서버 통계

ISteamUserStats와 유사하게 게임 서버를 위한 ISteamGameServerStats가 있습니다. 이 서버는 클라이언트와 동일한 방식으로 사용자 통계를 가져올 수 있습니다(위에서 설명한 대로). 또한 통계를 설정하고 업적을 수여할 수도 있지만, '설정 기준'이 GS(게임 서버) 또는 공식 GS로 설정된 경우에만 가능합니다. 게임 서버와 공식 게임 서버의 차이점은 공식 게임 서버는 회원님이 직접 호스팅하고 관리하는 서버라는 점입니다. 공식 게임 서버를 사용하여 통계를 설정하면 사용자가 자신의 게임 서버를 수정하거나 게임 서버로 위장할 수 있으므로 부정행위에 대한 보안이 강화됩니다. 공식 게임 서버를 정의하려면 여기에 서버의 IP 범위를 입력합니다.

게임 서버에서 설정할 수 있는 통계 및 도전 과제는 클라이언트에서 설정할 수 없습니다. 게임 서버는 현재 서버에서 플레이 중인 사용자의 스탯과 도전 과제만 설정할 수 있습니다. 사용자가 서버를 떠나는 경우 최종 통계를 설정할 수 있는 짧은 유예 기간이 있지만, 그 이후에는 새로운 업로드가 거부됩니다. 이는 일관성을 보장하고 악의적인 게임 서버가 언제든지 다른 사람의 통계를 설정할 수 없도록 하기 위한 조치입니다. 이러한 제한을 고려할 때, 스탯을 설정하기 위해 라운드가 끝날 때까지 기다리지 않는 것이 중요합니다. 사용자가 종료할 때 저장할 수 있도록 지속적으로 설정해야 합니다.

클라이언트는 게임 서버가 스탯을 변경하면 자동으로 업데이트됩니다. 그러나 클라이언트와 마찬가지로 서버가 다른 사용자를 위해 로드한 통계는 자동으로 새로 고쳐지지 않으며 오래될 수 있습니다.

통계 초기화

개발 중에는 테스트를 위해 계정 또는 모든 계정의 통계와 업적을 완전히 지우는 것이 바람직한 경우가 종종 있습니다. 계정의 통계를 초기화하려면 bAchievementsToo를 true로 설정한 상태에서 ISteamUserStats::ResetAllStats를 호출하여 업적도 초기화하세요. 이 함수를 호출한 후에는 통계와 도전 과제를 다시 실행하고 메모리 내 게임 상태를 초기화하는 것을 잊지 마세요. 모든 사용자의 스탯과 도전 과제를 전역적으로 지울 수 있는 방법은 없습니다. 그 이유 중 하나는 전역 초기화를 수행하더라도 진행 중인 게임이 초기화를 인식하지 못하고 인메모리 값을 다시 기록할 수 있기 때문입니다. 다행히도 게임에 글로벌 초기화 시스템을 쉽게 구축할 수 있는 방법이 있습니다. 방법은 다음과 같습니다:

  • "버전"과 같은 이름으로 스탯을 정의합니다.
  • 게임에 하드코딩된 통계 버전 번호 넣기
  • 통계가 로드되면 '버전' 통계를 하드코딩된 버전 번호와 비교합니다.
  • 일치하지 않는 경우 ISteamUserStats::ResetAllStats를 호출한 다음 "버전" 통계를 하드코딩된 번호로 설정하세요.

이렇게 하면 전역 초기화를 원할 때마다 하드코딩된 통계 버전 번호만 변경하면 됩니다. 그러면 사람들이 새 빌드를 받을 때 전역 삭제가 수행됩니다.

통계 일관성

관련 통계가 어떻게 일관성이 없어질 수 있는지 고려하는 것이 좋습니다. 예를 들어 "GamesWon", "GamesLost", "GamesPlayed" 통계가 세 개 있을 수 있습니다. 최선의 의도에도 불구하고 통계는 서로 동기화되지 않을 수 있고 실제로 동기화되지 않습니다. 이 경우 이긴 게임과 잃은 게임이 총 플레이한 게임에 합산되지 않을 수 있습니다. "GamesLost" 통계를 제거하고 대신 "GamesPlayed" - "GamesWon"으로 계산하여 이 문제를 해결했다면, 불일치로 인해 "GamesLost"가 음수가 될 수 있습니다. 이 경우 "GamesPlayed" 통계를 삭제하고 "GamesWon" + "GamesLost"로 계산하는 것이 가장 좋습니다.

글로벌 통계

관리자 페이지에서 통계를 집계된 것으로 표시하여 Steam이 모든 사용자의 통계 값을 전체적으로 합산하도록 할 수 있습니다. 이를 통해 경제의 총 돈, 총 킬 수, 좋아하는 무기, 좋아하는 지도, 어느 팀이 더 잘하는 경향이 있는지에 대한 데이터를 얻을 수 있습니다. 반대로 '최다 킬 수'와 같은 통계에는 여러 사용자에 대해 합산하는 것은 의미가 없으므로 사용해서는 안 됩니다. 통계는 사용자의 손에 달려 있기 때문에 이 데이터는 조작될 수 있습니다. 따라서 집계된 통계를 사용할 때는 최소값, 최대값, 증분만(적절한 경우), 최대 변화에 대한 적절한 범위를 설정하는 것이 중요합니다. 최대 변화는 집계된 통계에서 특별한 의미를 갖습니다. 새 값이 업로드되면 글로벌 값은 최대 변경 값보다 더 많이 변경되지 않습니다. 이는 부정 행위자가 글로벌 총계에 얼마나 빨리 영향을 미칠 수 있는지를 제한합니다.

글로벌 총계에 액세스하려면 각 글로벌 통계에 대해 ISteamUserStats::RequestGlobalStats를 호출한 다음 ISteamUserStats::GetGlobalStat를 호출하세요. 지정된 일수만큼의 기록에 대한 ISteamUserStats::RequestGlobalStats를 요청할 수도 있습니다. 이 기록은 매일 통계가 변경된 양입니다. 이 기록은 ISteamUserStats::GetGlobalStatHistory로 액세스할 수 있습니다.

클라이언트에 글로벌 업적 완료 비율을 요청할 수도 있습니다. 이렇게 하려면 먼저 ISteamUserStats::RequestGlobalAchievementPercentages를 호출합니다. 그런 다음 ISteamUserStats::GetMostAchievedAchievementInfoISteamUserStats::GetNextMostAchievedAchievementInfo를 호출하여 가장 많이 완료한 것부터 가장 적게 완료한 것 순서로 업적을 반복합니다. 또한 ISteamUserStats::GetAchievementAchievedPercent를 호출하여 특정 업적의 완료 비율을 얻을 수도 있습니다.

테스트

앱이 출시되기 전에는 Steam 커뮤니티나 라이브러리에서 어떤 도전 과제를 획득했는지 확인할 수 없습니다. 앱에서 사용자가 획득한 업적을 출력할 수 있는 방법이 필요합니다.

게임에 코드를 추가하지 않고 도전 과제나 통계를 지우려면 Steam 클라이언트 콘솔을 사용하면 됩니다. 그런 다음 steam.exe -console로 실행하세요:

  • achievement_clear <appid> <achievement name>
  • reset_all_stats <appid>

Steam 커뮤니티

게임이 출시되면 개인 및 글로벌 업적 진행 상황에 대한 정보가 Steam 커뮤니티에 표시됩니다. 각 플레이어는 커뮤니티 프로필에서 자신이 달성한 업적과 아직 잠금 해제하지 않은 업적을 보여주는 페이지로 이동할 수 있는 링크를 받게 됩니다.

NOTE: 앱이 커뮤니티에 어느 정도 공개될 때까지 업적은 표시되지 않습니다.

각 업적은 Steamworks 제어판에 설정된 대로 해당 아이콘과 이름 및 설명이 표시됩니다. 업적 이름과 설명이 사용자가 선택한 언어로 현지화된 경우 해당 언어로 표시됩니다.

또한 이 페이지와 게임의 기본 Steam 페이지에서 게임의 글로벌 업적 통계로 연결되는 링크가 있습니다. 여기에는 가장 일반적인 업적부터 가장 희귀한 업적까지 순서대로 각 업적을 달성한 Steam 플레이어의 비율이 표시됩니다. 이 정보는 플레이어가 재미있게 볼 수 있을 뿐만 아니라 개발자에게도 유용한 자료가 됩니다: 특별 업적이 충분히 어려운가요? 아니면 너무 어려운가요? (이 정보는 판매 및 활성화 보고서 사이트에서도 확인할 수 있습니다).

'_Diary > Dev' 카테고리의 다른 글

[Stations In Seoul] Devlog #11  (0) 2023.08.25
[Find with Seoul] Devlog #18  (0) 2023.08.25
[Stations In Seoul] Devlog #10  (0) 2023.08.17
[Find with Seoul] Devlog #17  (0) 2023.08.17
[Stations In Seoul] Devlog #9  (0) 2023.08.10
블로그 이미지

RIsN

,

https://youtu.be/DS-Jp24q4L8

Download: Under Construction

Hey, wonderful players! 🎮

Choo-choo! 🚂 All aboard the Future Cat Labs express for the 10th development diary for 'Stations in Seoul'. It's your pal Jay here, and your support is like the coal to my steam engine - never-ending and super energetic! 🚂💨

I'm thrilled to share some of the ups, downs, and all-arounds of our journey together. Hold on to your hats; this train's picking up speed!

What's Up? 🧩

New Markers for Quest Dungeons! 🏰
Ever lost your way in our virtual Seoul? Fear not! I'm working on adding marks to the quest dungeons, guiding you through the beginning and end of each story. It's like a compass for your gaming adventure!

Steam Review Rejection - A Bumpy Ride! 🛤️😓
Oopsie-daisy! I tried to play it cool with an AI issue, but that train went off the tracks. It was entirely my mistake, thinking that my adjustments based on AI would be fine. But no, it got rejected! I've cleaned the tracks, removed all dummies, and prepared a new build review. Fingers crossed that it passes this time. I've spent my entire day on it, and I'm not giving up on 'Stations in Seoul'!

Just a Little Longer Before the Big Launch! 🚉
I know, I know, waiting is tough, but I'm putting all my love and whiskers into making this game purr-fect! 🐱 So, hang tight, dear friends; this station isn't closed just yet. A brand-new adventure will be arriving at your platforms real soon!

Your thoughts, feedback, and patient waiting are everything to me. Thank you for being the best passengers a game developer could ask for! 🙏🌟

Here's to smooth rides, epic quests, and a game we'll all love. May 'Stations in Seoul' be the next big hit. Can't wait to see you at the station!

Virtual high-fives and warm thanks,
Jay at Future Cat Labs 🐾

P.S. Your belief in me and 'Stations in Seoul' keeps this engine running. Together, we'll make it a game to remember! Let's keep chugging along, shall we? 🚂💕

Creator

Patreon Link

'_Diary > Dev' 카테고리의 다른 글

[Find with Seoul] Devlog #18  (0) 2023.08.25
[Steam] 통계 및 업적(Stats and Achievements)  (0) 2023.08.19
[Find with Seoul] Devlog #17  (0) 2023.08.17
[Stations In Seoul] Devlog #9  (0) 2023.08.10
[Find with Seoul] Devlog #16  (0) 2023.08.10
블로그 이미지

RIsN

,