个人技术总结——Unity中对于Http的进一步封装

222000316谭楷 2023-06-08 20:51:27

技术概述

更简单的在Unity中使用Http方法。

这个技术是做什么的

用来更为优雅的实现对网络请求以及对后端数据的处理。

什么情况下会使用到这个技术

需要通过http方法从网络上请求数据时会用到。

学习该技术的原因

方便代码编写,是代码更为易懂,更为简洁。

技术的难点在哪里

cookie的设置,类本身的设计,以及对于易用性的考虑。

技术详述

img

img

img

基本思路就是将向协程中传入地址、序列化好的body以及处理响应结果的action。

对于登陆的问题,由于我自己测试时后端返回的setcookie无法生效,所以需要对登录token进行单独的获取。

image-20230608204616056

代码

public static IEnumerator PostWithHeader(string url, string content, Action action = null, string contentType = "application/json;charset=utf-8")
    {
        Debug.Log("GetWithHeader" + "<color=darkblue>" + content);
        UnityWebRequest www = UnityWebRequest.Post(url, content);
        byte[] bodyRaw = Encoding.UTF8.GetBytes(content);
        www.uploadHandler = new UploadHandlerRaw(bodyRaw);
        www.SetRequestHeader("Cookie", loginToken);

        www.SetRequestHeader("Content-Type", contentType);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log("Post on" + url + "Error" + www.responseCode);
        }
        else
        {
            Debug.Log("Post on" + url + "finished");
#if UNITY_EDITOR
            Debug.Log(www.downloadHandler.text);
#endif
            //T value = JsonConvert.DeserializeObject<Response<T>>(www.downloadHandler.text).data;
            action?.Invoke();
        }

    }
class Response<T>
{
    public int code { get; set; }
    public string msg { get; set; }
    public T data { get; set; }
}
    public IEnumerator LoginRequest(string url, string content, Action<string> messageHandler = null, string contentType = "application/json;charset=utf-8")
    {
        UnityWebRequest www = UnityWebRequest.Post(url, content);
        byte[] bodyRaw = Encoding.UTF8.GetBytes(content);
        www.uploadHandler = new UploadHandlerRaw(bodyRaw);
        www.SetRequestHeader("Content-Type", contentType);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log("Poston " + url + " Error " + www.responseCode);
        }
        else
        {
            Debug.Log("<color=green>Poston " + url + " finished");
#if UNITY_EDITOR
            Debug.Log(www.downloadHandler.text);
#endif
            string setCookie = www.GetResponseHeader("Set-Cookie");
            Debug.Log(setCookie.Substring(0,setCookie.IndexOf(";")));
            string value = JsonConvert.DeserializeObject<Response<UserResponse>>(www.downloadHandler.text).msg;
            GlobalData.userInfo = JsonConvert.DeserializeObject<Response<UserResponse>>(www.downloadHandler.text).data.user;
            Debug.Log(GlobalData.userInfo.name);
            if (value == "登录成功")
            {
                WebBase.loginToken = setCookie.Substring(0, setCookie.IndexOf(";"));
                eventCenter.EventTrigger<Action>("DialogAction", ActionToHomeScene);
            }
            messageHandler?.Invoke(value);
        }
    }

总结

由于本次项目功能特别多,所以需要在封装上多下一点功夫,不然庞大的代码我自己找起来都有些麻烦,于是就诞生了这个封装。我认为在今后的学习中还是要多多编写这样的功能组件,丰富自己的代码库。

...全文
462 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
Unity引擎下的经典平台游戏实现剖析》 在当代游戏开发实践Unity引擎凭借其高效的三维图形处理能力、多平台适配特性以及直观的脚本编写界面,已成为广泛采用的工具之一。本文将以一个具体的案例——基于Unity环境重新构建的经典平台跳跃游戏为例,系统阐述该引擎在复刻传统游戏过程技术应用与实现逻辑。 Unity采用组件化设计理念,游戏内的每个实体均由多种功能模块组合而成。在本案例,游戏角色、地形模块及敌对单位均通过添加相应组件实现其基础功能。以主角为例,其视觉呈现依赖于精灵渲染组件,二维刚体组件负责模拟物理运动规律,而自定义编写的行为脚本则定义了角色的移动、跳跃及交互响应等核心逻辑。 项目主目录通常包含完整的源代码资源,其C#脚本构成了游戏行为控制的基石。开发者通过定义“主角控制类”来封装角色的状态管理与动作响应,同时设计“关卡管理类”用于统筹场景布局与进度控制,“道具效果类”则处理角色能力强化等特殊事件。项目说明文档一般会提供详细的环境配置指引与代码结构说明,帮助使用者快速理解项目架构并掌握修改方法。 在Unity,场景作为游戏世界的容器,承载了所有对象的空间关系与属性配置。本案例可能包含多个独立场景,分别对应不同难度或主题的关卡,每个关卡内均预设了平台排布、敌对单位生成点及通关条件等要素。动画系统的运用进一步丰富了角色表现,通过状态机控制器可实现行走、跳跃、受伤等动作间的平滑过渡。 音效与背景音乐是塑造游戏氛围的关键要素。借助Unity的音频管理模块,开发者能够根据游戏进程动态触发对应的声效资源,重现原版游戏的听觉体验。物理引擎在二维平台游戏尤为重要,通过为对象添加矩形或圆形碰撞体,可实现精确的接触检测与力学反馈。 总体而言,该案例不仅展示了利用Unity引擎重构经典游戏的技术路径,更为学习者提供了深入理解二维游戏开发流程的实践样本。从脚本编写到系统集成,从资源管理到交互设计,该项目全面呈现了现代游戏开发工具在传承经典玩法过程的方法论价值,为不同阶段的开发者提供了可借鉴的技术范本与设计思路。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

585

社区成员

发帖
与我相关
我的任务
社区描述
软件工程-2022-23学年(第二学期)
软件工程 高校
社区管理员
  • LinQF39
  • promisekoloer
  • 异梦1
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧