Unity3D项目四:牧师与魔鬼(动作分离版)

UNITY3D 动作游戏开发教程《怪物猎人》 UNITY3D动作游戏《怪物猎人》开发教程 阅读详情

Unity3D项目四:牧师与魔鬼(动作分离版)

基本介绍

动作管理是游戏的重要内容,全部都放在游戏对象里显得十分笨重,所以本次项目需要将动作从对象中提取出来写成单独的动作控制器。动作控制器来管理控制所有的游戏对象移动,通过场景控制器将需要移动的游戏对象和位置等信息传递给动作控制器,动作控制器负责实现具体的移动。当动作很多或是需要做同样动作的游戏对象很多的时候,使用动作管理器可以让动作很容易管理,也提高了代码复用性。

具体实现

完成ActionControllor.cs
  • ISSActionCallback(动作事件接口)

    使用了枚举变量定义动作类型,执行还是完成。

    定义了事件处理接口,动作组合类和动作管理类都需要实现这个接口,来实现接收其子动作的消息以实现动作的调度管理。当动作完成的时候会调用该接口通知管理者该动作完成。

    public enum SSActionEventType : int { Started, Competeted }
    
    public interface ISSActionCallback {
        void SSActionEvent(
            SSAction source, SSActionEventType events = SSActionEventType.Competeted,
            int intParam = 0, string strParam = null, Object objectParam = null
        );
    }
    
  • SSAction(动作基类)

    代表一个动作,继承了ScriptableObject,是不需要绑定GameObject的可编程基类,受到Unity管理。

    /*动作基类*/
    public class SSAction : ScriptableObject {
        public bool enable = true;                      //是否进行
        public bool destroy = false;                    //是否删除
    
        public GameObject gameobject;                   //动作对象
        public Transform transform;                     //动作对象的transform
        public ISSActionCallback callback;              //回调函数
    
        //防止用户自己new对象
        protected SSAction() { }                      
    
        public virtual void Start() {
            throw new System.NotImplementedException();
        }
    
        public virtual void Update() {
            throw new System.NotImplementedException();
        }
    }
    
  • SSMoveToAction(移动位置子类)

    继承动作基类,实现移动到指定位置的子类。

    /*子类 - 移动到指定位置*/
    public class SSMoveToAction : SSAction {
        public Vector3 target;  
        public float speed;
    
        public static SSMoveToAction GetSSAction(Vector3 _target, float _speed) {
            //让unity自己创建一个SSMoveToAction实例确保内存正确回收
            SSMoveToAction action = ScriptableObject.CreateInstance<SSMoveToAction>();
            action.target = _target;
            action.speed = _speed;
            return action;
        }
    
        //C#必须显示声明重写父类虚函数
        public override void Start() {
            //该动作建立时无需任何操作
        }
    
        public override void Update() {
            this.transform.position = Vector3.MoveTowards(this.transform.position, target, speed * Time.deltaTime);
            //动作完成,通知动作管理者或动作组合
            if (this.transform.position == target) {
                this.destroy = true;
                this.callback.SSActionEvent(this);      
            }
        }
    }
    
  • SequenceAction(组合动作类)

    组合类中实现回调函数的接口ISSActionCallback,动作列表中每一个动作完成之后通知组合动作类,并且所有动作完成后也会通知该这个类的上一层组合类,被组合的对象和组合对象属于同一种类型,之后我们的动作也都是通过组合动作实现的,这样的结构稳固而可延展,可以实现我们所需要的绝大部分动作管理。

    /*动作组合*/
    public class SequenceAction : SSAction, ISSActionCallback {
        public List<SSAction> sequence;    //动作的列表
        public int repeat = -1;            //-1就是无限循环做组合中的动作
        public int start = 0;              //当前做的动作的索引
    
        public static SequenceAction GetSSAcition(int repeat, int start, List<SSAction> sequence) {
            //让unity自己创建一个SequenceAction实例
            SequenceAction action = ScriptableObject.CreateInstance<SequenceAction>();
            action.sequence = sequence;
            action.repeat = repeat;
            action.start = start;
            return action;
        }
    
        public override void Start() {
            //对每个动作执行
            foreach (SSAction action in sequence) {
                action.gameobject = this.gameobject; 
                action.transform = this.transform;
                action.callback = this;                 //每一个动作的回调函数为该动作组合
                action.Start();
            }
        }
    
        public override void Update() {
            if (sequence.Count == 0) return;
            if (start < sequence.Count) {
                sequence[start].Update();               //start在回调函数中递加
            }
        }
    
        //实现接口ISSActionCallback
        public void SSActionEvent(
            SSAction source, SSActionEventType events = SSActionEventType.Competeted,
            int intParam = 0, string strParam = null, Object objectParam = null
        ) {
            source.destroy = false;                     //可能会无限循环所以先不删除
            this.start++;                               //下一个动作
            if (this.start >= sequence.Count) {
                this.start = 0;
                if (repeat > 0) repeat--;               //repeat<0就不会再减小
                if (repeat == 0) {                      //动作组合结束
                    this.destroy = true;                //删除
                    this.callback.SSActionEvent(this);  //通知管理者
                }
            }
        }
    
        void OnDestroy() {
            //如果自己被删除则应该释放自己管理的动作   
        }
    }
    
  • SSActionManger(动作管理基类)

    负责管理所有的动作或动作组合,给他们绑定游戏对象并且控制动作的执行或者完成后删除,也实现了ISSActionCallback接口,用于接受动作是否完成的消息,不过在我们的游戏之中对象仅有移动位置这个动作,所以回调函数不需要做任何事情。

    /*动作管理基类*/
    public class SSActionManager : MonoBehaviour, ISSActionCallback {
        private Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>();    //动作字典
        private List<SSAction> waitingAdd = new List<SSAction>();                       //等待执行的动作列表
        private List<int> waitingDelete = new List<int>();                              //等待删除动作的key的列表                
    
        protected void Update() {
            //获取动作实例将等待执行的动作加入字典并清空待执行列表
            foreach (SSAction ac in waitingAdd) {
                actions[ac.GetInstanceID()] = ac;                                       
            }
            waitingAdd.Clear();
    
            //对于字典中每一个pair,看是执行还是删除
            foreach (KeyValuePair<int, SSAction> kv in actions) {
                SSAction ac = kv.Value;
                if (ac.destroy) {
                    waitingDelete.Add(ac.GetInstanceID());
                }
                else if (ac.enable) {
                    ac.Update();
                }
            }
    
            //删除所有已完成的动作并清空待删除列表
            foreach (int key in waitingDelete) {
                SSAction ac = actions[key];
                actions.Remove(key);
                Object.Destroy(ac);
            }
            waitingDelete.Clear();
        }
    
        public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager) {
            action.gameobject = gameobject;
            action.transform = gameobject.transform;
            action.callback = manager;
            waitingAdd.Add(action);
            action.Start();
        }
    
        public void SSActionEvent(
            SSAction source, SSActionEventType events = SSActionEventType.Competeted,
            int intParam = 0, string strParam = null, Object objectParam = null) {
        }
    }
    
  • PADSceneActionManager(牧师与魔鬼场景的动作管理类)

    先与对应的场景控制器绑定,然后实现两个具体动作:

    1. 船移动:一个动作,从当前位置以speed的速率移动到endPos。
    2. 角色移动:两个动作,从当前位置以speed的速率移动到middlePos,再以speed的速率移动到endPos。
    /*本次游戏场景中动作管理类*/
    public class PADSceneActionManager : SSActionManager {
        public FirstControllor sceneController;
    
        private SequenceAction boatMove;
        private SequenceAction roleMove;
    
        protected void Start() {
            sceneController = (FirstControllor)SSDirector.GetInstance().CurrentScenceController;
            sceneController.actionManager = this;
        }
    
        protected new void Update() {
            base.Update();
        }
    
        public void moveBoat(GameObject boat, Vector3 endPos, float speed) {
            SSAction action1 = SSMoveToAction.GetSSAction(endPos, speed);
            boatMove = SequenceAction.GetSSAcition(0, 0, new List<SSAction> { action1 });
            this.RunAction(boat, boatMove, this);
        }
    
        public void moveRole(GameObject role, Vector3 middlePos, Vector3 endPos, float speed) {
            //两段移动
            SSAction action1 = SSMoveToAction.GetSSAction(middlePos, speed);
            SSAction action2 = SSMoveToAction.GetSSAction(endPos, speed);
            //repeat=1,start=0,两个动作
            roleMove = SequenceAction.GetSSAcition(1, 0, new List<SSAction> { action1, action2 });
            this.RunAction(role, roleMove, this);
        }
    }
    

    至此动作管理的代码都已实现。

修改已有代码
  • 将MoveCortrollor.cs删除,有了动作管理类就不再需要移动控制器了。

  • 将BoatModel和RoleModel中的与运动相关的方法删去,添加各自的speed。

  • 在FirstCortrollor类中加入动作管理类

    public PADSceneActionManager actionManager; //添加动作管理类

    并且修改MoveBoat和MoveRole,使用动作管理器来实现,场景控制器只负责传递游戏对象和位置信息。

新增裁判类
  • 将原来的check从用户接口中删除,check的实现从FirstCortrollor.cs中删除

  • 新增Check.cs

    using UnityEngine;
    
    namespace CheckApplication {
        public class Check : MonoBehaviour {
            public FirstControllor sceneController;
    
            protected void Start() {
                sceneController = (FirstControllor)SSDirector.GetInstance().CurrentScenceController;
                sceneController.gameStatusManager = this;
            }
    
            public int CheckGame() {
                //0-游戏继续,1-失败,2-成功
                int startPriests = (sceneController.startLand.GetRoleNum())[0];
                int startDevils = (sceneController.startLand.GetRoleNum())[1];
                int endPriests = (sceneController.endLand.GetRoleNum())[0];
                int endDevils = (sceneController.endLand.GetRoleNum())[1];
                if (endPriests + endDevils == 6) return 2;
                int[] boatNum = sceneController.boat.GetRoleNumber();
                //加上船上的人
                if (sceneController.boat.GetBoatSign() == 1) {
                    startPriests += boatNum[0];
                    startDevils += boatNum[1];
                }
                else {
                    endPriests += boatNum[0];
                    endDevils += boatNum[1];
                }
                if ((endPriests > 0 && endPriests < endDevils) || (startPriests > 0 && startPriests < startDevils)) {
                    return 1;
                }
                return 0;
            }
        }
    }
    
  • 在FirstCortrollor中增加裁判:public Check gameStatusManager;

github项目地址->?

演示视频地址->?

视频与原版无任何差别。

再次感谢师兄的博客供参考学习->?

Unity3d入门之路-牧师与魔鬼 动作分离版 文章目录牧师与魔鬼 动作分离版实现过程Action模块Judge实现代码与视频 牧师与魔鬼 动作分离版 【2019新要求】:设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束 实现过程 什么是动作分离版呢?还记得我们上个版本的牧师与魔鬼为了实现character与boat的移动,实现了一个Moveable的脚本,并把此脚本作为组件加到character与boat上了。然而这样的实现方... 阅读详情

相关推荐

unity3D-牧师与魔鬼

源码传送门 运行说明:将Controllor.cs挂载Main Camera上,然后点击运行即可 阅读以下游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the .

Edith的博客 344

Unity实现牧师与魔鬼动作分离版

牧师与魔鬼动作分离版 动作管理器的设计 程序设计框架: 为了用一组简单的动作组合成复杂的动作,我们采用 cocos2d 的方案,建立与 CCAtion 类似的类。 通过门面模式(控制器模式)输出组合好的几个动作,共原来程序调用。 好处,动作如何组合变成动作模块内部的事务 这个门面就是 CCActionManager 通过组合模式实现动作组合,按组合模式设计方法 必须有一个抽象事物表示该类事物的共性,例如 SSAction,表示动作,不管是基本动作或是组合后动作 基本动作,用户设计的基本动作类。

m0_50547440的博客 1899

Unity3D学习笔记(4)—— 牧师和魔鬼游戏

牧师和魔鬼游戏是一款益智类游戏,游戏的目标是将3个牧师和3个魔鬼从河的一端安全地送到河的另一端。在运送过程中,船可以搭载两个人,而且必须有一人掌船。无论何时,只要河一边的魔鬼数量多于牧师的数量,游戏就会以失败结束。想玩玩的话请走传送门:Priests and Devils         游戏需要的对象: 游戏角色:3个牧师、3个魔鬼 游戏场景:2个河岸、1艘小船

Simba_Scorpio的专栏 5893

Unity优化——批处理的优势

在3D图形和游戏中,批处理是一个非常通用的术语,它描述了将大量任意数据块组合在一起并将它们作为单个大数据块进行处理的过程。这对于CPU,特别是GPU来说是理想的,因为它可以使用多个内核同时粗粝多个任务。在内存中不同位置来回切换内核是需要时间的,因此切换内核所花的时间越少越好。在某些情况下,批处理的对象指的是网格、顶点、边、UV坐标和其他用于描述3D对象的不同数据类型的大集合。然而,该术语也可以简单代表批处理音频文件、精灵、纹理文件和其他大数据集的行为。

m0_63024355的博客 1806

步进电机 cia402协议 报文自己的理解 (笔记)

步进电机 cia402协议 报文自己的理解 (笔记)

she666666的博客 3809

从jieba分词到BERT-wwm——中文自然语言处理(NLP)基础分享系列(12)

今天是本系列的最后一期,完整代码呈现Huggingface transformers平台上微调BERT-wwm-ext的过程方法。

weixin_49518391的博客 3764

Unity3d牧师与魔鬼动作分离版

关于牧师与魔鬼动作分离版,这里只介绍动作管理器的部分,有需要者请结合我的上一篇博客:牧师与魔鬼,加深理解。 动作管理器的设计: 一开始,我们先创建一下几个类: 1. 动作基类:public class SSAction : ScriptableObject{} 2. 简单动作实现类: public class SSMoveToAction : SSAction {} 3. 组合动作实现类...

hellowangld的博客 550

Spine动画在Unity里卡顿、闪烁、排序错乱?这些性能优化与渲染问题一次讲清

本文深入解析了Spine动画在Unity中常见的卡顿、闪烁和排序错乱问题,提供了全面的性能优化与渲染解决方案。从性能瓶颈诊断到材质合并、动态合批优化,再到层级错乱与Alpha闪烁的处理,帮助开发者提升动画表现和运行效率。特别针对Unity和Spine的协同工作进行了详细的技术探讨。

weixin_29967445的博客 381

unity2017分离动作

http://tsubakit1.hateblo.jp/entry/2015/06/01/235939 using UnityEngine; using UnityEditor; using System.IO; public class Copy { [MenuItem("Assets/Copy")] static void AssetCopy () { // Animat

N的专栏 1118

手把手教你用nRF52832+RFX2401C设计远距离蓝牙模块(附完整原理图/PCB文件)

本文详细介绍了如何利用nRF52832 SoC与RFX2401C射频前端芯片设计远距离蓝牙模块,涵盖芯片选型、阻抗匹配、PCB布局等关键环节。通过实战指南和完整原理图/PCB文件,帮助工程师实现输出功率可达20dBm的蓝牙模块设计,适用于智能家居、运动追踪等物联网应用。

weixin_29214199的博客 287

银河麒麟V11 + KVM/QEMU + GT 710 GPU直通 Win10 完整操作流程文档

宿主机:RTX 5080专门运行ollama大模型服务,通过SSH/VNC远程管理Win10虚拟机:GT 710直通,物理键盘专属,通过物理显示器处理视频应用硬件隔离:两个系统完全隔离,互不干扰,性能最大化两种不同的直通方式直通方式 配置方法 设备在宿主机的状态 典型应用场景PCIe设备直通 vfio-pci.ids=10de:128b,10de:0e0f 设备完全从宿主机消失,被vfio-pci驱动接管 GPU、网卡、NVMe硬盘。

weixin_45285654的博客 1154

Unity3D游戏——魔鬼与牧师(动作分离版)实现

受限于篇幅原因,所有的代码实现就不一一赘述了。在该游戏实现中,我们主要采用了MVC架构将游戏的各个部件拆分开来实现,同时添加了动作分离,将对象的运动分离到了CCAction中,从控制器中分离了出来,大大减轻了控制器的任务以及代码量。

a161949的博客 1028

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

struggle2025的博客 1750

作业四:牧师与魔鬼(动作分离版)

文章目录基本操作演练下载 Fantasy Skybox FREE 构建自己的游戏场景写一个简单的总结,总结游戏对象的使用常见游戏对象及渲染编程实践牧师与魔鬼 动作分离版新添加文件 基本操作演练 下载 Fantasy Skybox FREE 构建自己的游戏场景 游戏场景如上,大部分还是天空盒的功劳,从网上找到素材,然后布局一下就好。 写一个简单的总结,总结游戏对象的使用 常见游戏对象及渲染 使用这些游戏对象构造场景 常见游戏对象 Camera 摄像机 Skyboxes 天空盒 3D 物体显示 地形构造

liuqiang的博客 272

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2027

ABAP BDC 处理踩坑笔记:把错误挡在录制之前,把稳定做进每一行 BDCDATA

本文总结了SAP BDC(批输入)开发中的常见问题和解决方案。重点包括:1)理解BDCDATA本质是模拟人工操作而非直接操作数据库;2)数据格式化技巧,如金额、日期、物料号等字段的标准化处理;3)通过CTU_PARAMS参数控制执行环境,确保屏幕尺寸和更新模式一致;4)不要依赖sy-subrc,应通过解析MESSTAB消息判断业务是否成功;5)录制阶段的常见陷阱及解决方法;6)疑难问题的系统性解决思路;7)建议建立完善的错误处理机制,包括日志记录和重跑功能。文章提供了实用的ABAP代码示例和配置建议,帮助开

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

Unity3d HW4-动作分离版牧师与魔鬼

一、简答并用程序验证 1.游戏对象运动的本质是什么? 答:游戏对象运动的本质是对象在空间中每一帧不同位置的链接。我们在unity中对物体运动的描述其实就是让物体在一个个离散的时间点在空间中的位置不同,例如: this.transform.position += Vector3.left * Time.deltaTime; 2.请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transfo...

wzycxy的博客 328

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Unity3d学习之路-牧师与魔鬼

Unity3d学习之路-牧师与魔鬼 游戏基本介绍 游戏规则: Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at ...

C486C的博客 2675

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

游戏对象与图形基础——牧师与魔鬼(动作分离版)

文章目录游戏对象与图形基础——牧师与魔鬼(动作分离版)一、基本操作演练1.1 下载 Fantasy Skybox FREE, 构建自己的游戏场景1.2 总结:二、牧师与魔鬼(动作分离版)2.1 UML图2.2 程序实现: 游戏对象与图形基础——牧师与魔鬼(动作分离版) 一、基本操作演练 1.1 下载 Fantasy Skybox FREE, 构建自己的游戏场景 首先在Asset Store中,下载Fantasy Skybox FREE素材包,之后再unity中导入。 之后,我们可以看到素材包中包含了天空盒

weixin_43960457的博客 707

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

unity3D游戏——魔鬼与牧师(Devil and Priest)动作分离版本的实现

魔鬼与牧师(Devil and Priest)是一个经典的智力解谜游戏,玩家需要帮助三位魔鬼和三位牧师,将所有的牧师带过河,同时还要确保牧师不会被魔鬼吃掉。下面是游戏的规则和背景故事:规则:1. 在河的一边有三个魔鬼、三个牧师以及一条船。2. 船最多可以承载两个角色(牧师或魔鬼)且必须承载一个角色。3. 当河的一侧的魔鬼数量大于牧师数量时,魔鬼会吃掉牧师。4. 玩家需要将所有的牧师都安全地运送到另一侧的河岸,而且保证没有牧师被魔鬼吃掉。

Y2807593076的博客 469

unity3D_牧师与魔鬼

成品图 球体代表牧师,正方体代表魔鬼。 目的 ​ 使用unity3D做出一个牧师与魔鬼的游戏,程序需要满足以下要求: play the game ( http://www.flash-game.net/game/2535/priests-and-devils.html ) 列出游戏中提及的事物(Objects) 用表格列出玩家动作表(规则表),注意,动作越少越好 请将游戏中对象做...

qq_36184359的博客 807

Unity3d--牧师与魔鬼

一.游戏基本规则 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of...

TempterCyn的博客 971

用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)

用Unity3D实现简单的牧师与魔鬼游戏(动作分离版) 项目地址 牧师与魔鬼游戏(动作分离版) 完成效果图 上次博客链接 牧师与魔鬼游戏 实现心得 这次作业是在上次作业的基础上完成的,具体做出的改变是添加了一个裁判类和一个行为类,将其它控制类中涉及到判断游戏状态的代码都封装到了裁判类中,并在主控制类添加了一个裁判类的成员变量,在主控制器中使用裁判类的相关方法对游戏状态和游戏对象状态进行判断: /* 裁判控制类 */ public class JudgeController { private int g

StuGeek的博客 1160

Unity3D 牧师与魔鬼游戏

Unity3D 牧师与魔鬼游戏题目要求阅读游戏脚本程序需要满足的要求游戏中的对象玩家动作表格游戏结构游戏运行截图 题目要求 阅读游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within t...

Passenger317_的博客 462

Unity3D-魔鬼与牧师游戏(动作分离版)开发

动作管理器就是一个对象,管理整个场景中所有的动作。一个SceneController(场景管理器)只配备一个动作管理器对象。不管是游戏角色的移动还是船的移动,都归这个对象管;动作管理器可以添加动作(添加的时候要指定动作所作用的GameObject),监测已经完成的动作并清除。

weixin_63734223的博客 221

【3D游戏编程与设计】四 游戏对象与图形基础 : 构建游戏场景+牧师与魔鬼 动作分离版

【3D游戏编程与设计】四 游戏对象与图形基础 :牧师与魔鬼 动作分离版

STcyclone的博客 564
上一篇: Unity3D作业四:材料与渲染练习
下一篇: Unity3D作业四:游戏对象与图形基础
Tifinity
博客等级 码龄9年 18粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值