手把手教你写抖音爆火小-游戏之激战突围(三):主角登场,从零开始创建玩家

【Claude Code · VibeCoding】13|实战演示:水果消消乐 VibeCoding 用「水果消消乐」走一遍 VibeCoding:提示、生成、试玩、改需求、再生成。 阅读详情

阅读前请先下载项目源码,边读边看源码以加深理解和实操,
源码地址已放于文章末尾!

Hello,各位代码世界的冒险家们!欢迎来到第三章!在上一章,我们成功地为游戏注入了灵魂,让它从一堆静态文件变成了一个能够跑起来的“活物”。但是,一个没有主角的世界是孤独的,今天,我们就来创造这个世界的主角——我们那支英勇无畏、所向披靡的玩家队伍!
在这里插入图片描述

准备好了吗?咱们要开始“捏人”了!

第一步:谁负责创建玩家?—— RoleLayer登场!

在咱们的“施工队”里,有一个专门负责管理所有角色(包括玩家和敌人)的“包工头”,它就是 Game/Script/Custom/RoleLayer.ts。当关卡管家 LevelManager 吹响开工的号角时,就会调用 RoleLayer 的 setData 方法,命令它开始创建角色。

assets/Game/Script/Custom/RoleLayer.ts - setRoles 方法:

setRoles(d?) {
    // 每次新开一局,都把计数器清零
    this.roleSumCount = 0;
    this.normalRoleNum = 0;

    // 从“仓库”(存档)里拿出玩家数据
    let asset = StorageSystem.getData().userAssets;
    this.curWeapon = asset.chooseWeapon; // 玩家上次选了什么武器

    // --- 根据存档数据,计算要创建多少小兵、多少巨人 ---
    // 比如,巨人等级是5级,每3级合成一个满级巨人,那就有 5/3=1个满级巨人,和 5%3=2个2级巨人
    let giantLv = asset.props.GiantLv - 1;
    let maxLvGiantNum = Math.floor(giantLv / 3);
    let lastGiantLv = giantLv % 3;
    let hasUnMaxLvGiant = lastGiantLv != 0;

    // 小兵数量直接从存档读
    let roleNum = asset.props.RoleNumLv;

    // --- 开始创建!---
    this.createRoles(roleNum, false); // 先创建普通小兵 (isGiant = false)
    this.createRoles(maxLvGiantNum, true, 3); // 再创建满级(3级)巨人
    if (hasUnMaxLvGiant) {
        this.createRoles(1, true, lastGiantLv); // 最后创建那个未满级的巨人
    }
}

代码解读:
setRoles 的逻辑就像一位将军在阅兵前清点自己的部队:

  1. 清点人数:先把当前的总人数、小兵人数清零。
  2. 读取档案:从 StorageSystem(你可以理解为小程序的 wx.getStorageSync)里获取玩家的“兵力”数据。
  3. 排兵布阵:精打细算地计算出应该上场多少小兵、多少满级巨人和多少“半成品”巨人。
  4. 执行创建:分批调用 createRoles 方法,把光秃秃的“数字”变成活生生的角色。

第二步:“捏人”的艺术 —— createRoles 详解

createRoles 方法就像一个高效的“兵工厂”,你给它一个数量和类型,它就能“唰唰唰”地给你造出一队士兵来。

assets/Game/Script/Custom/RoleLayer.ts - createRoles 方法:

createRoles(n: number, isGiant = false, GaintLv = 1) {
    let maxLen = GlobalConfig.Formation.length; // 阵型表里定义了最多能站多少人
    if (this.roleSumCount >= maxLen) {
        console.warn('玩家已达最大数量:', maxLen);
        return;
    }

    // 所有角色都围绕着一个中心点(followPos),这个中心点会沿着道路前进
    let initPos = v3(this.followPos).add(GlobalTmpData.Player.offset);
    // 根据是否是巨人,选择不同的“模具”(预制体名字)
    let name = isGiant ? 'playerGiant' : 'player';

    for (let i = 0; i < n; i++) {
        if (this.roleSumCount >= maxLen) break; // 防止中途超出人口上限

        // 1. 从对象池里拿出预制体实例
        let e = GlobalPool.get(name);
        e.parent = this.node; // 把它放到场景里

        // 2. 计算它在队伍里的位置(阵型)
        const p = GlobalConfig.Formation[this.roleSumCount];
        // p是从配置里读出来的2D坐标,需要转换成3D空间里的偏移量
        let offset = v3(p.x * GlobalConfig.Scale2DTo3D, 0, -p.y * GlobalConfig.Scale2DTo3D).multiplyScalar(GlobalConfig.FormationScale);

        // 3. 创建角色的“灵魂” (逻辑类实例)
        let role = isGiant ? new RoleGiant() : new Role();
        // 4. 初始化角色的各种属性
        role.init(e, initPos, offset, this.pathLineVec, isGiant);
        role.setWeapon(this.curWeapon); // 给他发武器
        if (isGiant) {
            role.setGiantLv(GaintLv); // 如果是巨人,设置等级
        }

        // 5. 登记在册
        this.allRoles[e.uuid] = role;
        this.roleSumCount++; // 总人口+1
    }
}

这个“捏人”的过程,就像开一个手办工厂:

  1. 取出模具:从 GlobalPool 里 get 一个预制体实例。
  2. 安排工位:根据当前队伍的总人数,从 GlobalConfig.Formation(一个预设的坐标数组)里查出新成员应该站的相对位置 offset。
  3. 注入灵魂:new Role()!注意,这里的 Role 是一个普通的 TypeScript 类,而不是 Cocos 的组件。我们用它来管理角色的所有逻辑和数据,而 Cocos 的 Node 对象(e)只负责显示。这种数据与视图分离的模式,在复杂项目里非常好用,能让你的代码结构更清晰。
  4. 出厂设置:调用 role.init() 方法,把角色的所有初始状态都设置好。
  5. 登记入库:把 role 逻辑实例存到 this.allRoles 这个大对象里,方便之后 RoleLayer 在 update 里统一驱动它们。

第三步:角色的“灵魂”—— Role.init 方法

role.init() 就像是角色的“新生儿洗礼”,它决定了这个角色“从哪里来,要到哪里去”。

assets/Game/Script/Custom/Role.ts - init 方法:

init(node: Node, initPos: Vec3, offset: Vec3, pathLineVec, isGiant) {
    this.isGiant = isGiant; // 记录自己是不是巨人
    this.node = node; // 持有自己的“身体”(视图Node)
    
    // 获取挂在Node上的脚本,用来做一些视觉表现,比如修改顶点颜色
    this.modfiyMsCmp = this.node.getComponent(BasicModifyMesh);
    
    // 记录自己的阵型偏移和初始位置
    this.offset.set(offset);
    this.pathLineVec = pathLineVec; // 记录当前道路的前进方向
    this.curPos.set(initPos); // 设置自己的当前世界坐标

    // 初始化动画控制器
    this.roleAnim = new RoleAnim(this.node);
    this.roleAnim.init(this);

    // 初始化自身属性(血量、攻速等)
    this.initProp();

    // 获取并初始化手部武器控制器
    this.roleHand = this.node.getComponent(RoleHand);
    this.roleHand.init(...);

    // 初始化移动和状态机
    this.initMoveData();
    this.setStateData(); // 重点:设置角色的初始状态
    this.setCollider();  // 创建碰撞体
    this.initShadow();   // 创建脚底的阴影
}

init 方法做的事情非常饱满,它把一个 Role 实例所需的所有外部依赖(视图Node、初始位置、配置等)和内部模块(动画、状态机、碰撞体等)全部准备就绪。执行完 init,这个 role 对象就成了一个功能完备、随时可以战斗的单位。

第四步:让角色听指挥 —— 触摸控制的秘密

现在角色已经出现在屏幕上了,但还是一群“木头人”。怎么让他们响应我们的操作呢?秘密就藏在 Game/Script/Common/Touch/HorizonTouch.ts 里。

这其实是一个非常经典的输入控制模型,我称之为“皮筋模型”。想象一下,你手里牵着一根无形的“皮筋”,皮筋的另一头连着咱们的角色队伍中心。

assets/Game/Script/Common/Touch/HorizonTouch.ts 核心代码:

@ccclass('HorizonTouch')
export class HorizonTouch {
    // ... 各种属性定义 ...
    ctrlPos = v3();      // 皮筋拉着的那个点,也是队伍的实际中心偏移
    touchDistX = 0;      // 手指期望皮筋被拉到的目标X坐标
    minX = -3; maxX = 3; // 道路的左右边界

    // 构造函数,在RoleLayer里被new
    constructor(initPos: Vec3, minX: number, maxX: number) {
        // ...
        this.onEvents(); // 开始监听触摸事件
    }
    
    // 监听到手指移动
    protected onTouchMove(p1, p2) { // p1是上一帧位置, p2是当前位置
        this.isTouch = true;
        this.isMoveFinished = false;
        // 计算手指从按下时到现在的总横向位移
        let subX = p2.x - this.touchStartPos.x;

        // 核心公式:目标位置 = 队伍初始位置 + 手指总位移 * 灵敏度
        this.touchDistX = subX * 0.02 + this.prePos.x;
        // 把目标位置限制在道路边界内
        this.touchDistX = clamp(this.touchDistX, this.minX, this.maxX);
    }

    // 每帧调用
    public update(dt) {
        this.move(dt); // 平滑移动
        // ...
    }

    protected move(dt) {
        // 如果当前位置和目标位置不一致
        if (this.ctrlPos.x != this.touchDistX) {
            let sign = this.touchDistX > this.ctrlPos.x ? 1 : -1; // 判断方向
            // 根据距离动态调整速度,实现“皮筋”的拉扯感
            let dist = Math.abs(this.touchDistX - this.ctrlPos.x);
            let rate = dist / 3;
            this.curSpdX = this.spdX * clamp(rate, 0.1, 10);
            
            // 计算这一帧应该移动到的位置
            let tx = this.curSpdX * sign * dt + this.ctrlPos.x;
            
            // 防止移动过头
            if (sign > 0 && tx > this.touchDistX || sign < 0 && tx < this.touchDistX) {
                tx = this.touchDistX;
            }
            // 更新实际位置
            this.ctrlPos.x = tx;
        }
    }
}

代码解读:

  • 我们并没有直接在 onTouchMove 里去修改角色的坐标,而是设置一个“目标点” touchDistX。
  • 然后在 update 里,通过 move 方法,让实际位置 ctrlPos 去平滑地追赶这个目标。
  • 追赶的速度还不是恒定的,而是和距离成正比,这就完美模拟了“皮筋”越长,拉力越大的效果,手感非常好。

这个 ctrlPos.x 最终会被 RoleLayer 用来计算 GlobalTmpData.Player.offset,也就是整个队伍的横向偏移量,从而驱动所有 Role 实例的位置更新。

今日总结

今天我们完成了最激动人心的部分——创造了游戏的主角!我们从“项目经理” RoleLayer 开始,追踪到了“兵工厂” createRoles,学习了如何使用对象池和阵型表来高效地创建和管理我们的玩家队伍。我们还深入 Role.init,了解了一个角色是如何被“初始化”的。最后,我们揭开了触摸控制的秘密,理解了如何通过一个巧妙的“皮筋模型”来实现丝滑的角色操控。

现在,我们的英雄们已经整装待发,听候调遣了!但是,没有武器的英雄怎么能叫英雄呢?

下一期,咱们就要给他们“发枪”了!我们将深入探讨武器系统和子弹的实现,让我们的队伍真正拥有“biubiubiu”的能力。准备好迎接枪林弹雨了吗?

敬请期待:《手把手教你写抖音爆火小游戏之激战突围(四):火力全开!biubiubiu的子弹系统》!咱们下期见!

游戏源码下载地址:
https://wwuj.lanzoul.com/i4N1n33e9dib
验证码hack

激战突围 休闲闯关 类小游戏源码,完整游戏源码.rar 激战突围 休闲闯关 类小游戏源码,完整游戏源码 立即下载

相关推荐

cocos小游戏源码 激战突围 完整精品小游戏源码,亲测可运行

cocos小游戏源码 激战突围 完整精品小游戏源码,亲测可运行

【Unity知识速递】第7期 Unity 6.6 深度解析:WebGPU 正式版与 WebAssembly64,Web 游戏的内存革命

如何启用 Wasm64?需要注意的是,Wasm64 需要浏览器支持 Memory64 提案,目前主流浏览器的最新版本都已支持。一句话总结: Unity 6.6 用 WebGPU 转正、Wasm64 16GB 内存和渐进式加载三连击,将 Web 游戏的体验天花板又往上推了一大截——Web 平台不再是"妥协版",正在成为真正的一等公民。Unity 6.6 新增了 WebAssembly64(Wasm64) 构建选项,这可能是本次更新中对 Web 游戏开发者影响最大的一项升级。

crystal_WJT的博客 427

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

重点在supplier part是立创商城的编号,可以搜到。

2301_80397661的博客 3262

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 102

OpenTCS打造移动机器人交通管制系统(四)

先分析下OpenTCS的一些策略方面的东西,这是OpenTCS的基础。 首先需要先明确下OpenTCS内核中的三个概念: 路由(Route) : 决定了车辆通过什么样的方式和算法来获得一段路径,未来车辆将沿着此路径运行。 派遣(Dispacher): 决定了一个订单应该关联哪一辆小车,即为订单分配车辆和为车辆分配订单。 调度(schedule):狭义上的调度,交通管制的核心,决定了何时分配...

白色冰激凌的技术专栏 5272

脑影像分析入门:如何用一般线性模型(GLM)处理fMRI数据?

本文为神经影像研究入门者详细解析了如何运用一般线性模型(GLM)处理fMRI数据。文章从GLM的核心原理出发,逐步拆解了从实验设计、构建稳健设计矩阵、模型估计与统计推断,到高阶分析及多重比较校正的全流程,并指出了常见陷阱与结果解读要点,是掌握fMRI数据分析基础的关键指南。

weixin_29091445的博客 400

我给 DeepSeek 大肥鱼做了一款马里奥式闯关游戏

当全网都在把大肥鱼做成直播虚拟主播的时候,我决定给她做一款横版闯关游戏。

2301_79028807的博客 901

阿里巴巴-AI Agent工程师面试题精选:10道高频考题+答案解析(附PDF)

阿里巴巴AIAgent技术面试要点摘要(149字) 阿里巴巴在AIAgent领域布局完整,面试重点考察系统架构、幻觉治理、成本优化等核心能力。候选人需掌握分层架构设计、多Agent协作死锁处理、Token成本优化策略等关键技术。面试强调工程落地能力,包括工具调用容错、记忆系统设计、安全防护等实践要点。评估体系需覆盖效果、效率、成本多维度指标。未来趋势关注垂直领域专业化、多模态融合等方向。建议准备实际项目案例,突出技术深度与业务价值的结合,展现系统思维和工程能力。

ZHHHHH15的博客 619

Claude Fable 5.2 登顶:65 分、单发做游戏,和一份 $26.54 一单的账单

Anthropic 发布 Claude Fable 5.2:AA 智能指数 65 分登顶历史第一,但性能 #71、成本 #73、冗余度 #72——最强能力、最贵成本、最慢速度的矛盾体。同底层 Mythos 5.2 无护栏反而更强。文章拆解:65 分构成、官方实战验收、基准提升真伪、一条提示词一晚做出街机游戏的完整流水线(自写机器人跑完 12 关自检)、$26.54 账单与 98% 缓存折扣下的真实成本重估。

johnsong2009的博客 238

android mtk camera如何自定义默认拍照与录像分辨率

本文详细解析了在Android MTK平台上自定义相机默认拍照与录像分辨率的方法。通过分析Camera2应用默认选择逻辑,定位并修改PictureSize.java与VideoQualityCaptureRequestConfig.java中的关键代码,实现绕过系统智能选择,强制指定最高或特定分辨率。文章还提供了进阶的可配置化方案与验证避坑指南,帮助开发者精准控制相机行为。

weixin_29194817的博客 433

Qt入门教程【高级控件篇】QModelIndex索引

QModelIndex索引

小鱼酱的博客 4466

Unity 数据存储指南:本地存储、个性化设置、缓存与 Resources/StreamingAssets 的区别

在 Unity 开发中,“数据存到哪里”、“缓存能不能清”、“打包后资源有什么区别” 是新手最容易混淆、老手也经常踩坑的问题。Unity 本地存储机制(包括 Unity 放在 C 盘的内容);Unity 个性化设置(编辑器首选项 Editor Preferences);Unity 缓存的打开、关闭与清理;打包后 Resources 与 StreamingAssets 的区别;其他可自定义存储的内容汇总。为方便理解,本文配有一个可直接运行的演示工程,所有代码见文末"配套工程说明"。

zhchyun 216

基于simulink的多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、氢燃料电池、锂电池、能量管理和电机驱动等模块,通过Simulink实现各模块的协同控制。文章详细说明了从模型创建到性能评估的完整流程,包括驾驶循环输入设置、燃料电池和锂电池子系统建模、能量管理策略设计等关键步骤。该仿真模型可验证不同工况下的系统响应和能量利用效率,为优化混合动力汽车的能量管理策略提供有效工具。通过引入更复杂的物理细节和环境因素,可进一步提升模型的实用性和准确性。

xiaoheshang_123的博客 368

Claude Code做Unity项目移植(三): 使用SKILL进行自动化Git提交

本文介绍基于ClaudeCodeSkill的Unity自动化Git提交助手——unity-git-commit,通过四大模块实现提交前的智能检查与安全修复:1)校验Git仓库状态;2)验证Unity项目文件(如排除Library/Temp,确保.meta文件完整);3)依据可配置的C#命名规范自动识别并安全修复命名问题(避免序列化、反射等高危场景误改);4)生成精准提交注释,但强制人工确认。全程仅本地commit,不自动推送或破坏性操作,保障安全。核心思想为“机械化工作交AI,关键决策留人工”,显著提升提交

Aman1984的博客 644

ABAP Cloud 里的高性能日志:CL_BALI_LOG、XCO_CP_BAL 与 AML 的性能对比与选型指南

ABAP日志框架性能对比与选型建议 本文对比了ABAP Cloud中三种主流日志框架的性能表现与适用场景: 标准BALI:适合明确需要保存日志的场景,保存路径短,性能较好 XCO_CP_BAL:API更现代但性能较低,适合需要即时可见性的场景 AML:开源框架,擅长消息缓冲,适合批量处理时暂存消息 测试结果表明: 纯记录不落库时AML最快 需要保存时BALI性能最优 second connection不提升性能但能确保日志留存 选型建议: 高频批处理优先AML+BALI组合 故障诊断考虑XCO的即时可见性

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 215

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HarmonyOS 游戏与图形渲染入门:Canvas、渲染管线与掉帧排查

本文详解鸿蒙图形渲染选型与优化,指出多数“游戏感”需求仅需Canvas+requestAnimationFrame即可实现。通过deltaTime保证跨设备流畅性,优先使用animateTo声明式动画,避免逐帧绘制开销。强调性能优化应从主线程长任务、过度绘制、对象分配入手,结合Profiler排查掉帧。XComponent适用于高负载场景,但需权衡开发成本。最后提醒引擎迁移三要点:性能模型差异、打包流程匹配、版本兼容。核心结论:先用简单方案验证,再决定是否上引擎。

信息安全领域优质创作者|操作系统领域专家 425

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Windows远程桌面实现之二十:实现 moonlight 游戏串流协议之(一)

本文介绍在xdisp_virt中集成Moonlight游戏串流协议的实现过程。基于开源项目Sunshine逆向的GameStream协议,作者从零研究并自研实现Moonlight服务端网络通信部分,涵盖mDNS设备发现、nvhttp/nvhttps加密通信、nvrtsp协议交互及三类UDP数据通道(视频、音频、控制)。重点解决多客户端并发问题,采用串行处理机制确保连接一致性。通过自定义证书验证与密钥管理,完成配对与安全通信,最终实现低延迟、高性能的游戏串流体验,显著优于WebRTC浏览器方案。

fanxiushu的专栏 168

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

二进制木马免杀-游戏嵌套与图标替换

二进制木马免杀-游戏嵌套与图标替换

2503_94637398的博客 238

Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解

UGUI 自动布局是一套的 C# 排版系统,和 Transform 原生锚点完全隔离;整套布局;最终输出只有对 RectTransform 的sizeDelta的赋值。

m0_63330263的博客 264

mark 黑塞《玻璃球游戏》

【最近在读黑塞的《玻璃球游戏》-“ai预言“ - 优快云 App】

2502_94306440的博客 192

Cocos Creator3.8.8 + Xcode27.2 编译运行失败

Cocos Creator3.8构建IOS工程后,使用最新的Xcode27.2版本进行真机调试,遇到C++标准库冲突,如is_floating_point、is_arithmetic和is_signed失败,以及webp对齐失败等问题。

HYNN12的博客 402

给 AI 一台贴图工厂:TexGen 程序化贴图引擎与 MCP 架构实践

但它很快就撞墙——一张贴图往往是多层叠加的:底色 + 噪波 + 砖缝 + 暗角 + 高光。所以 TexGen 的核心抽象是图层栈 + JSON 指令表codeTgSpec├── 几何: shape(8 种) + center / size / radius / rotation / cornerRadius├── 绘制: fill(7 种) + color / edgeColor / 渐变 + pattern + warp└── 合成: blend(11 种) + opacity / blur。

邹杭特的博客 375

(开源)游戏攻略分享系统实战指南 基于 Java + SpringBoot + uni-app + Vue + MySQL

这是一个基于 Java + SpringBoot + uni-app + Vue + MySQL 构建的完整游戏攻略分享系统,功能持续优化中...游戏攻略管理 游戏分类管理 旅游资讯管理 用户管理 管理员管理

小小码农身兼魔法师职位!除你武器~ 344

itch.io 用开源模拟器 Ruffle 恢复 Flash 游戏支持

itch.io 创始人宣布平台已用开源 Flash 模拟器 Ruffle 重新实现 Flash 游戏支持,现有 2,581 款 Flash 游戏,开发者无需改动现有项目。

老孙正经胡说 109

老题新解|NOIP 2008 普及组 T3:传球游戏

传球游戏是 NOIP 2008 普及组 T3,核心是「环形边界用取模处理」的二维 DP。本文给出状态定义 + 转移推导 + C++14 代码 + 易错点清单,代码可直接提交主流评测平台。

ZLOJ 346

游戏支付通道安全吗?靠谱吗?

资质之外,商家还可以查看通道方的清算背景和合作机构,多方信息交叉验证,判断更准确,正规的通道方经得起多方核实,信息越透明,合作越放心,这是选择安全通道的基本功课,交叉验证后的判断更可靠,正规通道的信息透明,查证过程本身就是信心的来源,合作更踏实,每一步都有依据,核实越细,信心越足。安全配合要落到实处,商家如实上报异常情况,通道方及时处理反馈,双方信息互通,风险才能及时化解,安全不是单方面的承诺,而是双方协作的结果,配合越紧密,保障越到位,双方信息互通,安全网越牢固,风险越小,信息互通有无,风险共同化解。

jingyun_2026的博客 84
上一篇: 手把手教你写抖音爆火小游戏之激战突围(二):注入灵魂,游戏主循环与场景管理
下一篇: 手把手教你写抖音爆火小游戏之激战突围(四):火力全开!biubiubiu的子弹系统
THMAIL
博客等级 码龄10年 2435粉丝 432原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值