게임에서 성과를 감지하는 방법?


10

실수로 이것을 stackoverflow에 게시했으며 이제 해당 사이트의 제안에 따라 여기에 게시합니다 ...

이것은 매우 높은 수준의 개념적 질문입니다. 소프트웨어 응용 프로그램에서 4 가지 작업 (예 : 업로드, 공유, 댓글 등)이 있다고 가정합니다.

그리고 다음과 같이 사용자에게 업적 배지를 제공하고 싶습니다.

  • 신인-처음 5 개 파일 업로드
  • Junkie 업로드-하루에 20 개의 파일 업로드
  • Night Crawler-자정 이후 파일 업로드
  • 홀리 홀릭-10 가지 파일 공유
  • 모두 좋아함-20 개의 다른 파일처럼

당신은 아이디어를 얻는다. 성과에 대한 논리를 내 코드로 컴파일하지 않고도 사용자가 특정 성과를 달성했는지 확인하고 확인하는 가장 좋은 방법은 무엇입니까? -..-컴파일 후 새로운 업적 추가 (xml 또는 db) 기능 유지-업적은 특정 작업, 횟수 및 추가 기준 (시간 등)을 추적해야합니다.-사용자에게 알리기 위해 실시간에 근접해야합니다. 업적이 완료되면 거의 즉시

가장 큰 질문은 이러한 성과가 어떻게 달성되는지 어떻게 알 수 있습니까? 나는 :

1) 모든 조치를 수행 한 후 다음을 점검하십시오 ... (가장 쉬움)

내가 놓친 또 다른 패러다임이 있습니까? 많은 게임 (예 : iOS 용 jetpack)에서 꽤 인상적이라고 생각하는 잠금을 해제 한 순간에 잠금 해제 한 업적에 대해 알았 기 때문에 확실히 있다고 느낍니다.

감사합니다


도전 과제 시스템을 아직 설계하거나 제작했으며 게임에서 사용 방법을 알고 싶습니까?
해리슨 브록

답변:


6

일반적으로하는 것은 "업적"시스템입니다. 발생하는 모든 행동은 업적 시스템이라고하며 "이 상황이 발생했습니다"라고 말합니다.

성취 시스템은 일반적으로 일련의 규칙이며, 일반적으로 간단한 조합 논리와 다양한 "이벤트"에 대한 카운터로 구성됩니다. 그런 다음 규칙과 카운터, 도움을 얻은 선수, 그리고 어떤 성과를 내야하는지에 대한 성취 시스템의 책임입니다.

이렇게하는 이유는 두 가지입니다.

  • 상태 로직을 코드베이스 전체에 퍼 뜨리고 싶지 않습니다.

  • 때로는 성과가 완전히 다른 시스템 / 시간 / 등에서 발생할 수있는 "재료"의 조합이 필요할 수 있으며 코드베이스 주변 에이 논리를 퍼 뜨리면 불필요한 복잡성이 커질 수 있습니다.

과거에 내가 한 방법은 스크립팅 가능한 규칙 시스템을 사용하는 것입니다 (스크립팅 가능한 용어는 일반적으로 일종의 데이터 중심 비교기). 따라서 다음과 비슷한 것을 말할 수 있습니다.

  • "사용자가 무언가를 눌렀을 때" "pressed"변수가 "증가"될 때.

그런 다음 다른 규칙을 가질 수 있습니다.

  • "pressed"변수가 "some value"보다 큰 경우 "blah"

아니면

  • "사용자가 보스를 죽이면" "유인"업적 "blah"가 발생합니다.

업적 시스템은 또한 업적이 이미 나눠진 상태를 유지해야하므로 중복되지 않습니다.


0

이를 처리하는 깔끔한 방법은 사양 패턴 일 수 있습니다. 성과 관리자가 있으면 사양 세트와 일치하는 사용자를 정기적으로 사용자에게 쿼리합니다. 따라서 성과 클래스에는 이름, 로고, 포인트 점수 등이 포함되며 해당 성과를 얻은 사용자를 설명하는 사양도 포함됩니다. 예를 들어, C #에서 "홀리 윈 공유"업적은 다음과 같습니다.

AchievementType ShareAHolic = new AchievementType
{
    Name = "Share-a-holic",
    Description = "Shared 10 files",
    Score = 25,
    Specification = (user => user.SharedFiles.Distinct().Count() > 10)
};

AchievementManager.AddAchievementType(ShareAHolic);

적절한 시점에서 성과 관리자는 다음과 같은 작업을 수행 할 수 있습니다.

foreach (AchievementType achievement in AchievementTypes)
{
    var users = DB.Users.Where(achievement.Specification && !(user.Achievements.Contains(achievement)));
    foreach (User u in shareaholics)
    {
        AchievementManager.Award(u, achievement);
    }
}

업적을 .Award()즉시 감지 할 수있는 경우 업적 관리자의 방법을 적절한 시점에 직접 호출 할 수도 있습니다. 특정 사용자에 대해 이러한 확인을 실행하는 방법을 추가하여 중요한 이벤트 후에 확인을 트리거하여 사용자가 즉시 성과를 얻을 수 있도록 할 수도 있습니다.


파티셔닝 업적이 빠르게 중요 해지면 AchType은 가능한 경우 관련없는 업적을 피하기 위해 DB.Users.Where ()를 지원할 수있는 'sope'속성이 필요합니다. 따라서 파일 공유 업적을 PvP에서만 수여 할 수 있으면 PvP 만 검색하십시오. 약탈과 같은 일반적인 것이 전 세계적으로 가능할 수 있지만 그러한 범위를 갖지 않을 것입니다.
hpavc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.