Maison  >  Article  >  développement back-end  >  Comment PHP et Unity3D utilisent Workerman pour implémenter la fonction de classement en temps réel

Comment PHP et Unity3D utilisent Workerman pour implémenter la fonction de classement en temps réel

WBOY
WBOYoriginal
2023-07-17 17:15:101623parcourir

Comment PHP et Unity3D utilisent Workerman pour implémenter la fonction de classement en temps réel

Avec l'essor des jeux en ligne, la fonction de classement est devenue le centre d'intérêt de nombreux développeurs de jeux. Les classements en temps réel permettent aux joueurs de rivaliser et de comparer, rendant le jeu plus intéressant et plus stimulant. Cet article expliquera comment utiliser le framework PHP, Unity3D et Workerman pour implémenter la fonction de classement en temps réel.

1. Comprendre le framework Workerman

Workerman est un framework PHP asynchrone hautes performances basé sur des événements développé en PHP. Il adopte un modèle d'E/S multi-processus et non bloquant, présente une faible empreinte mémoire et des capacités de traitement de connexion simultanées élevées. Les fonctionnalités de Workerman le rendent idéal pour créer des applications en temps réel, telles que des serveurs de jeux.

2. Construire le côté serveur

  1. Installer le framework Workerman

Tout d'abord, nous devons installer le framework Workerman côté serveur. Vous pouvez l'installer avec la commande suivante :

composer require workerman/workerman
  1. Écrire un script de serveur de classement

Créez un script PHP sur le serveur, tel que Rank_server.php. Dans ce script, nous devons initialiser Workerman, définir un tableau de classement et fournir des interfaces que le client Unity3D peut appeler.

Ce qui suit est un exemple de code simple :

<?php
require_once __DIR__.'/vendor/autoload.php';

use WorkermanWorker;

$rankList = array();

$worker = new Worker("websocket://0.0.0.0:2345");

$worker->count = 4;

$worker->onWorkerStart = function($worker) {
    global $rankList;
    echo "Worker started!
";
};

$worker->onMessage = function($connection, $data) {
    global $rankList;
    $request = json_decode($data, true);

    switch($request['action']) {
        case 'update_rank':
            $rankList[$request['username']] = $request['score'];
            break;
        case 'get_rank':
            krsort($rankList);
            $rankList = array_slice($rankList, 0, 10);
            $connection->send(json_encode($rankList));
            break;
        default:
            break;
    }
};

Worker::runAll();

Le code ci-dessus crée une instance Worker et écoute le port 2345. Dans la fonction de rappel onWorkerStart, nous initialisons le tableau de classement. Dans la fonction de rappel onMessage, le traitement correspondant est effectué en fonction de la requête reçue : s'il s'agit d'une requête de mise à jour de la liste de classement, le tableau de classement est mis à jour ; s'il s'agit d'une requête d'obtention de la liste de classement, le tableau de classement est envoyé ; au client. Notez que lors de la mise à jour du classement, nous utilisons $rankList[$request['username']] = $request['score'] pour stocker le score de l'utilisateur.

3. Écrivez le client

  1. Créez un client WebSocket dans Unity3D

Utilisez WebSocket dans Unity3D pour vous connecter au serveur. Nous pouvons utiliser des plug-ins tiers tels que WebSocket-Sharp. Tout d'abord, vous devez importer le plugin WebSocket-Sharp dans l'éditeur Unity3D. Référencez ensuite l'espace de noms WebSocket dans votre code.

using WebSocketSharp;
  1. Écrire le code client du classement

Ce qui suit est un exemple de code pour un simple client de classement Unity3D :

using System.Collections;
using UnityEngine;
using WebSocketSharp;

public class RankClient : MonoBehaviour
{
    private WebSocket ws;
    private string serverUrl = "ws://127.0.0.1:2345";

    void Start()
    {
        ws = new WebSocket(serverUrl);
        ws.OnOpen += OnOpen;
        ws.OnMessage += OnMessage;
        ws.Connect();
    }

    void OnOpen(object sender, System.EventArgs e)
    {
        Debug.Log("WebSocket connected!");
    }

    void OnMessage(object sender, MessageEventArgs e)
    {
        string msg = e.Data;

        // 接收到服务器发送的排行榜数据,进行处理
        // ...
    }

    public void UpdateRank(string username, int score)
    {
        // 向服务器发送更新排行榜请求
        string json = "{"action":"update_rank", "username":"" + username + "", "score":" + score + "}";
        ws.Send(json);
    }

    public void GetRank()
    {
        // 向服务器发送获取排行榜请求
        string json = "{"action":"get_rank"}";
        ws.Send(json);
    }
}

Le code ci-dessus crée une instance WebSocket dans la fonction Démarrer et se connecte au serveur. Dans la fonction de rappel OnOpen, nous pouvons gérer le succès de la connexion. Dans la fonction de rappel OnMessage, nous recevons les données de classement envoyées par le serveur et les traitons en conséquence. Dans les fonctions UpdateRank et GetRank, nous envoyons des requêtes au serveur pour mettre à jour les classements et obtenir les classements.

4. Test d'exécution

  1. Démarrez le serveur

Exécutez la commande suivante dans la ligne de commande pour démarrer le serveur :

php rank_server.php start
  1. Test dans Unity3D

Dans l'éditeur Unity3D, créez une scène de classement et ajoutez-la. dans Ajoutez le script RankClient à la scène. Dans un script, vous pouvez tester cela en appelant les fonctions UpdateRank et GetRank. Les classements peuvent être mis à jour en fonction de la logique du jeu et les dernières données de classement peuvent être obtenues.

Grâce à la combinaison de PHP et Unity3D avec le framework Workerman, nous pouvons facilement implémenter la fonction de classement en temps réel. Les hautes performances de Workerman et ses fonctionnalités asynchrones basées sur les événements nous permettent de répondre et de gérer rapidement un grand nombre de demandes d'utilisateurs et d'offrir une meilleure expérience de jeu. J'espère que cet article vous sera utile !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn