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的专栏 5892

Unity优化——批处理的优势

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

m0_63024355的博客 1806

RTAB-MAP实战:用Realsense D435i在ROS中搭建室内3D地图(附避坑指南)

本文详细介绍了如何在ROS环境下,使用Intel Realsense D435i深度相机和RTAB-MAP算法进行室内3D地图构建的完整实战流程。内容涵盖环境配置、核心节点数据流解析、关键参数调优、地图保存与重定位,并提供了实用的避坑指南,帮助机器人开发者和研究者快速实现稳定的视觉SLAM应用。

weixin_29095049的博客 490

深入瑞芯微SDK:手把手解析Uboot、Kernel到Rootfs的镜像生成与烧录

本文深入解析瑞芯微SDK中从Uboot、Kernel到Rootfs的镜像生成与烧录全流程,揭示编译背后的技术细节。通过详细分析SDK架构、镜像生成流水线、分区表定制、Rootfs构建及烧录科学,帮助开发者从会编译进阶到懂原理,掌握系统级开发的关键技术。

weixin_29193359的博客 273

Unity3d牧师与魔鬼动作分离版

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

hellowangld的博客 550

JSSIP实战:5分钟搞定WebRTC电话功能(附完整代码示例)

本文通过JSSIP库实战演示如何在Web应用中快速集成WebRTC电话功能。文章提供了从环境准备、SIP服务器连接到完整代码示例的详细步骤,涵盖用户注册、拨号接听、媒体流处理等核心环节,并针对常见问题给出排查方案,帮助开发者高效实现网页端实时语音通信。

u8v9w0x1y的博客 517

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

汽车ECU诊断刷写和OTA升级中的验签和校验

汽车ECU诊断刷写和OTA升级中的验签和校验

天赐好车的博客 619

Open3D 使用RANSAC分割平面【2026最新版】

使用RANSAC从点云中分割平面,用segement_plane函数。博客长期更新,本文最新更新时间为:2026年2月28日。

点云侠的博客 37万+

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

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

a161949的博客 1028

OData V2 消息在 SAP UI5 中的生成、传播与治理全解

SAP UI5 的 OData V2 消息机制通过自动解析服务端响应头(sap-message)或错误体,将消息推送到全局 MessageModel,实现数据质量保障。关键点包括:1)消息通过目标路径与控件绑定联动,触发高亮等反馈;2)生命周期管理需注意避免自动刷新导致消息丢失;3)常见陷阱如批处理错误重复、内外层消息冲突等可通过精准目标路径或自定义处理器解决。代码示例展示了如何配置模型、消息模型及 MessagePopover 实现端到端消息展示,同时支持控件通过 refreshDataState 自定义

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

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

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

liuqiang的博客 272

【38】OpenCV C++实战篇——基于多项式插值的亚像素边缘定位算法

亚像素边缘定位算法实现 本文介绍了一种基于多项式插值的亚像素边缘定位算法,用于提高图像边缘检测的精度。文章首先分析了传统像素级边缘检测方法(如Canny、Sobel)的局限性,指出其在测量应用中的精度不足问题。 算法核心 梯度计算:使用8个方向模板进行卷积运算生成梯度图像 亚像素定位:采用多项式插值方法改进边缘定位精度 实现步骤: 生成8个方向的卷积模板(0°、45°、90°等) 利用filter2D函数计算各方向梯度 通过归一化处理显示梯度图像 代码特点 提供完整的C++实现代码 包含模板生成、梯度计算和

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1099

js逆向第3例:蝉妈妈大屏实时数据formDataSign加密

蝉妈妈大屏抖音直播实时数据是抓取抖音直播间数据的实时数据,有类似需求的公司但没有能力去搞定抖音,抓取蝉妈妈数据也是一个不错的选择。接下来就是调试找到加密点,说句题外话蝉妈妈的所有js文件打包方式用的都是webpack5,那如何区分打包方式可以阅读这篇文章。时间戳 ,经过观察发现加密参数是实时变化的。这个函数扣下来,在浏览器控制台中测试一下。言归正传,打断点找到变量。继续打断点向上找又发现了。查看请求参数,可以看到。请求的内容,那么这个。

花臂不花Home 1540

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

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

wzycxy的博客 328

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

文章目录游戏对象与图形基础——牧师与魔鬼(动作分离版)一、基本操作演练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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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、付费专栏及课程。

余额充值