플레이어가 업적을 완료했는지 어떻게 확인해야합니까?


13

저는 MMO 게임을 만들고 있는데 성과를 구현해야하는 시점에 도달했습니다. 어떻게해야합니까? 가장 간단한 방법은 100ms마다 한 번씩 실행하는 것입니다.

for a in achievements
    for p in players
        if a.meetsRequirements(p) then p.completeAchievement(a)

그러나 그것은 더 많은 합병증을 일으 킵니다. 예를 들어, 업적이 실제로 완료되었는지 어떻게 확인합니까? 플레이어는 특정 업적을 위해 자신 만의 커스텀 속성을 가지고 있습니까? 나는 주로 "100 나무를 모으기"때문에 퀘스트로 이런 종류의 일을 했으므로 플레이어에 대한 활발한 퀘스트는 그것을 확인합니다. 또한 확인하기에 더 좋은 시간이 있어야합니다. 이러면 서버가 주기적으로 느려질 것입니다.


7
조치가 완료 될 때 적절한 점검 만 수행하는 이유는 무엇입니까? 즉, 사용자가 목재를 수집하는 경우 "100 목재 수집"사양과 일치하는지 확인하십시오.
Mike Cluck

1
그거 좀 지저분 해 ... 사방에 수톤의 수표가있을 것입니다. 나는 단순함 때문에 위의 알고리즘을 고수 할 것이라고 생각한다.
jcora

10
"OnChange"이벤트 핸들러를 사용하여 업적 "개체"를 해당 오브젝트에 첨부하고 로직을 처리하는 것과 같이 덜 혼란스러운 방법이 있습니다. 또한 현재 설정을 사용하면 O (n ^ 2) 수준의 복잡성이 있으므로 캐릭터가 많을수록 게임 속도가 훨씬 느려집니다. MMO에 대한 문제의 종류
Mike Cluck

답변:


23

당신이하는 일은 업적의 본질에 달려 있습니다. 업적이 모두 간단한 패턴 (X 수 Y 수집)에 맞지 않는 한, 어느 정도 특별한 경우가 필요합니다.

메시지 기반 통신 시스템을 사용하여 특수 사례 코딩을 현지화하는 후크를 제공 할 수 있습니다. 자신을 등록하는 리스너에게 특정 조치를 수행하여 메시지를 발행 할 수 있습니다. 그러면 업적 코드 / 스크립트가 적절한 청취자에게 등록되어 업적을 시작하는 데 필요한 모든 테스트를 수행 할 수 있습니다.

업적을 듣고 자하는 일반적인 이벤트에 대한 메시지가 있습니다. "플레이어가 아이템 X를 획득했습니다"또는 "엔티티 Y 살해 엔터티 Z"와 같은 것들. 이런 식으로 플레이어가 죽인 Z의 수와 같은 것을 추적 할 수 있습니다.

그것은 아마도 업적을 위해 시스템을 위해 할 수있는 최선일 것입니다. 가능한 한 코드를 중앙 집중화하고 실제 성과 감지를 위해 청취자에게 책임을 둡니다.

또한 중앙 집중식 성과 시스템 (X-Box Live, Steam 성과)의 경우 성과 달성률은 일반적으로 서버에 저장됩니다. 따라서 누적 성과 ( "작업 XY 횟수 수행")의 경우 성과 스크립트는 X가 수행 된시기를 감지하여 서버 수를 충돌시킵니다. 다른 종류의 업적 ( "작업 X 수행")의 경우 서버 업적은 이진입니다. 수행했거나 수행하지 않았습니다.


+1 이것은 훌륭한 정보입니다. 지금은 업적을 구현할 필요없이 유용합니다.
Joshua Hedges

감사! 이를 구현하기 위해 기다릴 수 없어, 난 ... 전에 이런 생각이 있었으면 좋겠다
jcora

3

업적의 특성에 따라 일종의 "마커 업적"을 소개 할 수도 있습니다.

: 당신은 예를 들어 3 연속 실적이있는 경우
- 수집 (100) 나무 목재 1
목재 2 - 수집 500 나무
목재 3 - 수집 1K 나무

그런 다음 플레이어가 완료 할 때까지 첫 번째 업적에 대해 OnChange 이벤트를 등록하는 것이 좋습니다. 완료되면 다음 도전 과제를 등록 할 수 있습니다.

물론 이것은 성과 의존성 트리의 설계 (또는 계산)를 요구합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.