本篇將全面解構“水滸傳”子游戲的服務端核心邏輯、幀同步機制、魚群刷新規則、客戶端命中表現與服務器計算之間的協同方式,聚焦于 C++ 與 Unity3D 跨端同步的真實實現過程。
一、水滸傳捕魚模塊資源結構
該模塊包含三部分核心目錄:
子游戲/game_shuihuzhuan/├── FishDefine.h // 魚種類定義├── FishManager.cpp // 魚生成與路徑控制├── BulletManager.cpp // 子彈軌跡與發射控制├── HitLogic.cpp // 命中判定與服務器廣播└── Config/ // 魚概率配置表、路徑曲線表
二、服務器幀同步設計(C++)
服務器采用固定 20ms 一幀邏輯更新,通過定時器廣播當前房間狀態:
void Room::UpdateFrame() {for (auto& bullet : bullets_) bullet.Update();for (auto& fish : fishes_) fish.Move();BroadcastFrame();
}void Room::BroadcastFrame() {FrameData data;data.bulletPos = bullets_; // 子彈位置包data.fishPos = fishes_; // 魚位置包SendToAllPlayers(data);
}
三、魚群生成邏輯
使用配置文件驅動魚陣曲線軌跡:
{"group_id": 102,"curve": [ {"x":0,"y":0}, {"x":10,"y":50}, {"x":30,"y":90} ],"spawn_count": 20,"interval": 1500
}
生成邏輯 C++ 實現:
void FishManager::SpawnGroup(int groupId) {FishGroup group = LoadGroup(groupId);for (int i = 0; i < group.count; ++i) {fishes_.push_back(CreateFish(group.curve, i * group.interval));}
}
四、命中判定邏輯
服務器不信任客戶端命中信息,而是根據服務器幀內坐標反推命中:
bool HitLogic::IsHit(Bullet b, Fish f) {float dx = b.x - f.x;float dy = b.y - f.y;float dist = sqrt(dx*dx + dy*dy);return dist < f.hitRadius;
}void Room::OnHitCheck() {for (auto& b : bullets_) {for (auto& f : fishes_) {if (IsHit(b, f)) {KillFish(f);break;}}}
}
五、客戶端表現與反饋機制(Unity)
客戶端每幀根據服務器廣播更新魚與子彈坐標,不處理命中,僅播放動畫。
void OnFrameSync(FrameData data) {UpdateFishPositions(data.fishPos);UpdateBulletPositions(data.bulletPos);
}void PlayFishDeath(Fish fish) {// 播放擊殺特效Instantiate(deathEffect, fish.Position, Quaternion.identity);
}
命中事件從服務器下發:
void OnFishDead(ServerKillData data) {var fish = FindFish(data.fishId);PlayFishDeath(fish);ShowScore(data.score);
}
六、網絡協議結構
服務器至客戶端:
message FrameData {repeated Bullet bullets = 1;repeated Fish fishes = 2;
}message ServerKillData {required int32 fishId = 1;required int32 score = 2;
}
七、小結
本篇通過服務器幀同步邏輯、魚群生成、命中判定、客戶端表現、通信協議等方面,拆解了水滸傳捕魚的完整聯動機制。其幀同步思路具備較高參考價值,支持服務器絕對主導控制,適合高并發互動場景。下一篇將深入“拉霸機”子模塊的物理滾輪實現與服務器開獎邏輯。