You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WWWForm向WebService传递HashSet?求替代实现方案

解决方案:Unity HashSet 传递到 PHP WebService

当然可以用WWWForm传递你的HashSet数据,甚至还有更灵活的替代方案,结合你说的列表长度大概20的场景,我给你两种实用的实现方式:


方法1:直接遍历HashSet添加到WWWForm

这是最直观的方式,PHP会自动把相同键名的表单字段识别为数组。我们只需要遍历HashSet里的每个元素,用同一个键名(比如user_items[])添加到表单里就行。

Unity 代码示例

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Networking;

public class UserDataSender : MonoBehaviour
{
    string CreateUserURL = "localhost:81/ARFUR/InsertUser.php"; 

    void Start () 
    {
        HashSet<string> userSet = new HashSet<string>();
        // 模拟添加业务数据
        userSet.Add("user_001");
        userSet.Add("user_002");
        userSet.Add("user_003");

        // 开启协程发送数据(Unity网络请求必须在协程里执行)
        StartCoroutine(SendHashSetToPHP(userSet));
    }

    IEnumerator SendHashSetToPHP(HashSet<string> dataSet)
    {
        WWWForm form = new WWWForm();
        // 遍历HashSet,逐个添加到表单
        foreach(string item in dataSet)
        {
            form.AddField("user_items[]", item);
        }

        // 用UnityWebRequest发送(比旧的WWW类更稳定,官方推荐)
        using(UnityWebRequest www = UnityWebRequest.Post(CreateUserURL, form))
        {
            yield return www.SendWebRequest();

            if(www.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError("请求失败:" + www.error);
            }
            else
            {
                Debug.Log("数据发送成功!PHP返回:" + www.downloadHandler.text);
            }
        }
    }
}

对应的PHP 处理代码

<?php
// 检查是否接收到表单数据
if(isset($_POST['user_items'])){
    $userItems = $_POST['user_items'];
    // $userItems 是一个包含所有HashSet元素的数组
    foreach($userItems as $item){
        echo "收到用户ID:" . $item . "<br>";
        // 这里写你的插入数据库等业务逻辑
    }
    echo "数据处理完成";
} else {
    echo "未接收到有效数据";
}
?>

方法2:序列化为JSON字符串传递

如果以后你的数据结构可能扩展(比如需要传递更复杂的对象),用JSON序列化的方式会更灵活。不过要注意:Unity自带的JsonUtility不能直接序列化HashSet,所以我们先把它转成List再序列化。

Unity 代码示例

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Networking;
using System;

public class UserDataSenderJSON : MonoBehaviour
{
    string CreateUserURL = "localhost:81/ARFUR/InsertUser.php"; 

    void Start () 
    {
        HashSet<string> userSet = new HashSet<string>();
        userSet.Add("user_001");
        userSet.Add("user_002");
        userSet.Add("user_003");

        StartCoroutine(SendHashSetAsJSON(userSet));
    }

    IEnumerator SendHashSetAsJSON(HashSet<string> dataSet)
    {
        // 把HashSet转成List,适配JsonUtility的序列化要求
        List<string> userList = new List<string>(dataSet);
        // 用辅助类包装后序列化为JSON
        string jsonData = JsonUtility.ToJson(new JsonWrapper { items = userList });

        WWWForm form = new WWWForm();
        form.AddField("json_data", jsonData);

        using(UnityWebRequest www = UnityWebRequest.Post(CreateUserURL, form))
        {
            yield return www.SendWebRequest();

            if(www.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError("JSON请求失败:" + www.error);
            }
            else
            {
                Debug.Log("JSON数据发送成功!PHP返回:" + www.downloadHandler.text);
            }
        }
    }

    // 辅助类:用来包装List,让JsonUtility可以正确序列化
    [Serializable]
    private class JsonWrapper
    {
        public List<string> items;
    }
}

对应的PHP 处理代码

<?php
if(isset($_POST['json_data'])){
    $jsonString = $_POST['json_data'];
    // 解码JSON为关联数组
    $data = json_decode($jsonString, true);
    $userItems = $data['items'];
    
    foreach($userItems as $item){
        echo "收到用户ID(JSON方式):" . $item . "<br>";
        // 执行你的业务逻辑
    }
    echo "JSON数据处理完成";
} else {
    echo "未接收到JSON数据";
}
?>

小提示

两种方法都完全适配你20个元素的场景:

  • 方法1适合简单字符串集合,代码更简洁直观;
  • 方法2适合未来可能扩展的复杂数据结构,通用性更强。

另外记得Unity里的网络请求必须放在协程里执行,不然会阻塞主线程哦~

内容的提问来源于stack exchange,提问作者Med yacine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:02:38