unity 3D RPG高级教程(十四)

2023-11-14

目录

声明

1. QuestGiver 控制任务对话显示

2.GiveRewards 拿到任务奖励

3.SaveQuestManager 保存任务数据


声明

本教程学习均来自U3D中文课堂麦扣老师

1. QuestGiver 控制任务对话显示

现在来实现NPC能根据我任务的情况给我不同的对话,比如说第一次对话的时候是开始任务,任务过程进行当中要返回进行当中的对应的对话,结束的时候要有结束任务的,完成这个任务拿到奖励之后我再去找他对话的时候又是另外一个对话,所以可以看到我们需要在这里面不断地切换我们的Dialog Data,那么我们会创建一个代码来实时的替换我当前NPC要说的那个对话的数据,那我们先创建一下这个代码:

我们去到我们的Quest当中,我们在我们的Logic里面创建代码QuestGiver:

挂载到NPC身上

 可以看到现在我们的NPC身上有一个DialogController,所以我们的Giver也要拿到Controller的使用权,然后将QuestGiver里保存的数据实时更新到我的currentData,那么我每次跟它对话的时候就会显示不同的内容了,所以我的任务也需要做一些更改,比如说我的NewTalk,我要给它改个名字,Hero Start,也就是Hero第一次开始的时候对话的内容,然后我也会创建更多的Data去检测它任务进行中的对话和结束的对话,

先来写一下QuestGiver:

[RequireComponent(typeof(DialogueController))]
public class QuestGiver : MonoBehaviour
{
    DialogueController controller;
    QuestData_SO currentQuest;

    public DialogueData_SO startDialogue;
    public DialogueData_SO progressDialogue;
    public DialogueData_SO completeDialogue;
    public DialogueData_SO finishDialogue;

    #region 获得任务进度
    public bool IsStarted
    {
        get
        {
            if (QuestManager.Instance.HaveQuest(currentQuest))
            {
                return QuestManager.Instance.GetTask(currentQuest).isStarted;
            }
            else return false;
        }
    }

    public bool IsComplete
    {
        get
        {
            if (QuestManager.Instance.HaveQuest(currentQuest))
            {
                return QuestManager.Instance.GetTask(currentQuest).isComplete;
            }
            else return false;
        }
    }

    public bool IsFinished
    {
        get
        {
            if (QuestManager.Instance.HaveQuest(currentQuest))
            {
                return QuestManager.Instance.GetTask(currentQuest).isFinished;
            }
            else return false;
        }
    }
    #endregion

    private void Awake()
    {
        controller = GetComponent<DialogueController>();
    }

    private void Start()
    {
        controller.currentData = startDialogue;//开始对话数据
    }
}

DialogueData_SO:

    public QuestData_SO GetQuest()
    {
        QuestData_SO currentQuest = null;
        foreach(var piect in dialoguePieces)
        {
            if(piect.quest != null)
            {
                currentQuest = piect.quest;
            }
        }

        return currentQuest;
    }

QuestGiver:

    private void Start()
    {
        controller.currentData = startDialogue;//任务开始的对话
        currentQuest = controller.currentData.GetQuest();
    }

    private void Update()
    {
        if(IsStarted)
        {
            if(IsComplete)
            {
                controller.currentData = completeDialogue;//任务完成的对话
            }
            else
            {
                controller.currentData = progressDialogue;//任务进行的对话
            }
        }

        if(IsFinished)
        {
            controller.currentData = finishDialogue;//领取完奖励的对话
        }
    }

 设置对话内容:

 当我们离开NPC的时候对话窗口关闭:

DialogueController:

    private void OnTriggerExit(Collider other)
    {
        if(other.CompareTag("Player"))
        {
            DialogueUI.Instance.dialoguePanel.SetActive(false);//Player离开关闭对话窗口
        }
    }

这样在Player脱离NPC的范围之后就自动关闭对话窗口了

2.GiveRewards 拿到任务奖励

接下来实现完成任务后要领取我们任务的奖励,在我们写这个逻辑的时候我直接将我们的任务设计成一个比较复杂的情况,就是我们收集物品之后我们获得奖励的同时也要减少对应的物品,那这样我们直接添加对应的物品的奖励,奖励的数量是-2,

在Hero Complete当中就是我们当完成任务的时候再次跟NPC对话,这时候它会跟我说:你有这个任务,你已经完成了,takeQuest ,我希望用这个takeQuest按钮,也就是屏幕上的某一个选项就是谢谢你,点击这个Option之后,它要做的就是到我的当前的QuestData当中拿到所有的Reward,然后给我的Inventory,

 找到OptionUI://判断是否完成给予奖励

                //添加到任务列表里
                //判断是否已经有任务
                if (QuestManager.Instance.HaveQuest(newTask.questData))
                {
                    //判断是否完成给予奖励
                    if (QuestManager.Instance.GetTask(newTask.questData).isComplete)
                    {

                    }
                }

QuestData_SO:创建拿到任务奖励的方法

    public void GiveRewards()//拿到任务奖励
    {
        foreach(var reward in rewards)
        {
            if(reward.amount < 0)
            {

            }
            else
            {
                InventoryManager.Instance.InventoryData.AddItem(reward.ItemData, reward.amount);//添加物品到背包中
            }

            InventoryManager.Instance.inventoryUI.RefreshUI();//刷新UI
            InventoryManager.Instance.actionUI.RefreshUI();//刷新UI
        }
    }

InventoryManager:

    //检测背包和任务栏物品
    public InventoryItem QuestItemInBag(ItemData_SO questItem)
    {
        return InventoryData.items.Find(i => i.ItemData == questItem);
    }

    public InventoryItem QuestItemInAction(ItemData_SO questItem)
    {
        return actionData.items.Find(i => i.ItemData == questItem);
    }

QuestData_SO:在拿到任务奖励的方法中检测背包交出任务物品

    public void GiveRewards()//拿到任务奖励
    {
        foreach (var reward in rewards)
        {
            if (reward.amount < 0)
            {
                int requireCount = Mathf.Abs(reward.amount);//需要交出的物品的数量

                if (InventoryManager.Instance.QuestItemInBag(reward.ItemData) != null)//背包里有物品
                {
                    if (InventoryManager.Instance.QuestItemInBag(reward.ItemData).amount <= requireCount)//物品部分在背包里
                    {
                        requireCount -= InventoryManager.Instance.QuestItemInBag(reward.ItemData).amount;
                        InventoryManager.Instance.QuestItemInBag(reward.ItemData).amount = 0;
                        if(InventoryManager.Instance.QuestItemInAction(reward.ItemData) != null)
                        {
                            InventoryManager.Instance.QuestItemInAction(reward.ItemData).amount -= requireCount;
                        }

                    }
                    else//物品全在背包里
                    {
                        InventoryManager.Instance.QuestItemInBag(reward.ItemData).amount -= requireCount;
                    }
                }
                else//物品全在快捷栏
                {
                    InventoryManager.Instance.QuestItemInAction(reward.ItemData).amount -= requireCount;
                }
            }
            else
            {
                InventoryManager.Instance.InventoryData.AddItem(reward.ItemData, reward.amount);//添加物品到背包中
            }

            InventoryManager.Instance.inventoryUI.RefreshUI();//刷新UI
            InventoryManager.Instance.actionUI.RefreshUI();//刷新UI
        }
    }

OptionUI:拿到任务奖励并将任务状态改为Finish

                //添加到任务列表里
                //判断是否已经有任务
                if (QuestManager.Instance.HaveQuest(newTask.questData))
                {
                    //判断是否完成给予奖励
                    if (QuestManager.Instance.GetTask(newTask.questData).isComplete)
                    {
                        newTask.questData.GiveRewards();//拿到任务奖励
                        //将当前的任务状态改成Finish
                        QuestManager.Instance.GetTask(newTask.questData).isFinished = true;
                    }
                }

要加一个ItemUI的判断,如果数量是小于0的那么不应该显示这个Item,

 ItemUI:

    public void SetupItemUI(ItemData_SO item,int itemAmount)//显示UI
    {
        if(itemAmount == 0)//物品数量为0则消失
        {
            Bag.items[Index].ItemData = null;
            icon.gameObject.SetActive(false);
            return;
        }

        if(itemAmount < 0)//物品数量小于0不显示
        {
            item = null;
        }

        if(item != null)
        {
            currentItemData = item;
            icon.sprite = item.itemIcon;
            amount.text = itemAmount.ToString();
            icon.gameObject.SetActive(true);
        }
        else
        {
            icon.gameObject.SetActive(false);
        }
    }

 还有一个小的内容可以解决,就是当我的任务完成之后我现在仍然显示2/2,接下来我去拿到更多的蘑菇的话它也会继续在这里面显示这个数据,我希望完成的时候这里显示完成就可以了,结束的任务就不追踪了,另外我们可以检测一下我继续跟NPC对话的话它就会显示Finish那句,我也不会重复接到这个任务了,

QuestRequirement:

    public void SetupRequirement(string name,bool isFinished)//完成任务则任务需求物品显示完成
    {
        if(isFinished)
        {
            requireName.text = name;
            progressNumber.text = "完成";
            //文字变灰
            requireName.color = Color.gray;
            progressNumber.color = Color.gray;
        }
    }

QuestUI:

    public void SetupRequireList(QuestData_SO questData)//刷新任务需求
    {
        questContentText.text = questData.description;//任务描述

        foreach (Transform item in requirTransform)
        {
            Destroy(item.gameObject);
        }

        foreach (var require in questData.questRequires)
        {
            var q = Instantiate(requirement, requirTransform);
            if(questData.isFinished)
            {
                q.SetupRequirement(require.name,true);//完成任务则任务需求物品显示完成
            }
            else
            {
                q.SetupRequirement(require.name, require.requireAmount, require.currentAmount);//更新任务需求的文字
            }
          
        }
    }

这样就完成了交任务,接任务,完成任务所有的内容了。

3.SaveQuestManager 保存任务数据

把我们的任务也保存到我们的进度当中,这样的话我点击Continue可以加载回我之前已经做过的任务,并且能够确定它们的任务状态,那么在做这一步保存之前,还有一个小内容要做一个更改,首先第一个我的鼠标在UI面板上移动的时候我们的鼠标的指针,我们的Cursor仍然会根据它背后的物品产生变化,那这个时候怎么办呢?我们做一个小的修改,去到我们的

MouseManager:

    void SetCursorTexture() //设置指针的贴图
    {
        ...

        if(InteractWithUI())//判断是否与UI互动,
        {
            Cursor.SetCursor(point,Vector2.zero, CursorMode.Auto);
            return;
        }

        if(Physics.Raycast(ray,out hitInfo))
        {
            //切换鼠标贴图
            ...
    }

这样的话能够在UI面案显示小手的那个造型了,另外我们还要做一个简单的修改就是QuestManager当中,与其说是修改,不妨说我们不希望看到的一种情况就是以后我们接了多个任务之后,假如跟以前完成过的任务有相同的元素,那我不希望这些所有的数值影响我在我的List列表当中显示的样子,因为一旦任务完成之后,我的任务名字后面有个括号完成,所以在我们的循环判断,也就是说UpdateQuestProgress里面我们现在执行的方法是无论你有多少个task我都循环里面的每一个,然后去更新它里面的进度,在上面我们可以加一个判断:

QuestManager:

    //敌人死亡、拾取物品的时候调用
    public void UpdateQuestProgress(string requireName,int amount)//更新任务进度
    {
        foreach(var task in tasks)
        {
            if(task.isFinished)
            {
                continue;//跳过检测去到下一个检测
            }
            var matchTask = task.questData.questRequires.Find(r => r.name == requireName);
            if(matchTask != null)
            {
                matchTask.currentAmount += amount;
            }

            task.questData.CheckQuestProgress();//检测任务进度
        }
    }

完成保存任务系统,像这种非ScriptableObject我们要如何保存

SaveManager当中写了2个保存的方法,他们这里调用的都是Object类, 很多Monobehaviour以及我们手写的类型都是Object衍生的类,但是List并不在内,所以我们的列表并不能称之为Object,也就是不能用这种方法去保存,在这里提供一个新的思路,我当前是有一个task,比如说我的这个task里有2个任务了,那我可以逐一保存这2个任务,因为我们的这个QuestData它是一个ScriptableObject,我们可以用之前写过的Save的方法去保存它,然后我把它按照当前task的序号去保存起来当读取的时候再把它逐一读取回来,加载到task当中这样就实现了读取和加载,

QuestManager:

    private void Start()
    {
        LoadQuestManager();//加载任务
    }
    public void LoadQuestManager()//加载任务
    {
        var questCount = PlayerPrefs.GetInt("QuestCount");//读取任务数量
        for (int i = 0; i < questCount; i++)
        {
            var newQuest = ScriptableObject.CreateInstance<QuestData_SO>();//生成QuestData_SO的一个实例
            SaveManager.Instance.Load(newQuest, "task" + i);//读取任务数据
            tasks.Add(new QuestTask { questData = newQuest });//将任务添加到任务列表
        }
    }
    public void SaveQuestManager()//保存任务
    {
        PlayerPrefs.SetInt("QuestCount", tasks.Count);//保存任务数量
        for (int i = 0; i < tasks.Count; i++)
        {
            SaveManager.Instance.Save(tasks[i].questData, "task" + i);//保存任务数据
        }
    }

SceneController:

    IEnumerator Transition(string sceneName,TransitionDestination.DestinationTag destinationTag)//传送目标场景、目标点
    {
        //TODO:保存数据
        SaveManager.Instance.SavePlayerData();//保存Player数据
        InventoryManager.Instance.SaveData();//保存背包数据
        QuestManager.Instance.SaveQuestManager();//保存任务

        ...
    }

 这样就保存我们的数据了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity 3D RPG高级教程(十四) 的相关文章

  • CSS3“曲面”3D 变换/透视帮助

    我正在尝试为我的网站创建一种有观点的人群 它实际上是一个充满平面图像的 ul 我想创建一种 弯曲 的感觉 就像圆形的人群一样 它向内并且向内明显变小 并向末端弯曲 海报圈的例子是我能找到的最接近的http www webkit org bl
  • 3d 表面的凸包算法 z = f(x, y)

    我有一个以一组三元组 x i y i z i 形式给出的 3D 表面 其中 x i 和 y i 大致位于网格上 并且每个 x i y i 都有一个关联的 z i 值 典型的网格是20x20 我需要在给定的公差范围内找到哪些点属于曲面的凸包
  • Blender 与 Unity [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Unity 3D 中使用触摸输入在地形上移动相机

    我是 Unity 新手 我正在尝试弄清楚如何使用触摸输入在地图 地形上移动相机 摄像机将以 90 0 0 的旋转角度俯视地形 地形位于第 8 层 我用键盘移动它没有问题 现在我尝试移动到触摸 如果你想在 iOS 上保持预期的使用情况 那就非
  • 如何在 OpenCV 中绘制图像的 3D 直方图

    更新 我找到更多例子 我现在可以做到 我可以在 3d 中绘制多个直方图吗 https stackoverflow com questions 35210337 can i plot several histograms in 3d 我知道这
  • 如何在SceneKit中实现逼真的景深效果?

    我正在尝试渲染具有真实景深效果的帧 我已经尝试过景深属性camera节点 但它不会产生可用的结果 是否可以切换到景深效果的最大渲染质量 性能不是一个因素 我只需要渲染一帧 用户可以等待它 SceneKit 中逼真的景深效果 在SceneKi
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • 如何知道一个点是否在复杂的 3D 形状内(.ply 文件)

    我正在研究一个Java女巫项目真是要了我的命 经过几天在不同论坛上的研究 寻找我真正需要的东西 我来寻求你的帮助 我的数据 ply 文件 包含由许多三角形组成的 3D 形状 一个点 3D坐标 我想知道这个点是否包含在复杂的 3D 形状内 我
  • 如何仅剪切剪切平面的交集(而不是并集)?

    在 OpenGL JOGL 中 当使用多个剪切平面时 似乎会应用所有剪切平面的并集 我想要的是路口要应用的所有剪裁平面 这可能吗 请参阅下面的简化二维示例 Edit An example of clipping by vertex shad
  • 在 RGL 中将立方体绘制到 3D 散点图中

    我正在尝试向 3D 散点图添加较小的立方体 网格 具有指定边长 我希望立方体位于原点 我该怎么做呢 我已经玩过cube3d 但我似乎无法将立方体正确定位 也无法使其成为网格 因此我可以看到它包含的数据点 这是我所拥有的 library rg
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 3D 空间中两个盒子之间的交集

    我想为我的图形引擎实现一个碰撞检测系统 我不知道这是否是常见的方法 但我的想法是将任何实体对象 如网格或相机 绑定在 3D 盒子内 这会给我比球体更准确的结果 这个盒子由八个顶点定义 x0 min vertices x off parsin
  • 如何使用 matplotlib 将 3d 数据单位转换为显示单位?

    这可能有点疯狂 但我正在尝试使用 matplotlib v1 1 0 创建 3d 散点图的可点击图像图 我已经阅读了如何对二维图进行操作 参见这个博客 http hackmap blogspot com 2008 06 pylab matp
  • 使用开源 3D 引擎从 Openstreetmap 数据渲染地图? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从 Openstreetmap 数据渲染 3D 地图可能会很漂亮麻烦的 https gis stack
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • java3d 中的面部着色

    使用java3d 如何不在每个顶点基础上着色 而是在每个面基础上着色 我尝试学习 java3d 但我生成的 Shape3d 看起来并不符合预期 我想用不同的颜色给不同的三角形着色 但我不知道该怎么做 纹理看起来有点大材小用 而且我根本没有掌

随机推荐

  • UA分享

    之前自架短地址服务搜集到的UA 感觉很乱没法分析 看看大佬们有没有兴趣 Mozilla 5 0 Linux U Android 4 4 2 zh cn GT I9500 Build KOT49H AppleWebKit 537 36 KHT
  • Opencl入门Demo

    最近负责的几个项目需要使用opencl进行编程 进行了学习 并将学习后编写的主要Demo代码记录下来 供大家初步入门使用 opencl的介绍 原理等这里就不说了 百度一下有很多 直接切入主题 这个demo实现两个数组的相加操作 1 进行平台
  • 初探BlockChain——哈希和电子签名

    昨天在B站学习到北京大学肖臻老师的 区块链技术与应用 的公开课 感到豁然开朗 BlockChain涉及到密码学的两个方面 哈希和电子签名 1 哈希 有计算机基础的童鞋都比较清楚其机制 这里再简单说一下其基本原理 哈希的意思就是引入随机数量的
  • 一对一和一对多的关联查询(该实体类中存在实体类属性和实体类集合属性,将关联的实体类详细信息查询出来,但没有查询所有该实体类信息)

    一 高级查询 高级查询主要是一对一查询 一对多查询 多对多查询 1 一对一查询 有用户和订单两个表 用户对订单是1对1查询 也就是订单中有一个外键是指向用户的 先创建实体类 User java public class User priva
  • c语言文件的方式写通讯录,用c语言多文件编写1000人的通讯录

    实现一个通讯录 通讯录可以用来存储1000个人的信息 每个人的信息包括 姓名 性别 年龄 电话 住址 提供方法 1 添加联系人信息 2 删除指定联系人信息 3 查找指定联系人信息 4 修改指定联系人信息 5 显示所有联系人信息 6 清空所有
  • Redis —— 设置密码

    文章目录 Redis 设置密码 简介 需要修改两处 1 命令行进入Redis进行密码修改 2 修改Redis配置 redis conf 修改后重启redis Redis 设置密码 简介 没有密码 设置密码 需要修改两处 1 命令行进入Red
  • linux添加硬盘扫描

    查看host个数 ls sys class scsi host 重新扫描 echo gt sys class scsi host host编号 scan 可以形成脚本 也可以设置别名 简化操作
  • cmake获取当前编译器的类型与版本

    在使用cmake编译程序的时候 如何获取当前使用的编译器的类型 例如是clang 还是gcc cmake提供了很多相关的编译参数 可以查看当前使用的编译器的类型 当前使用的c 编译器 message CMAKE CXX COMPILER C
  • LLVM源码调试

    一 编译LLVM debug版本 调试LLVM代码需要基于debug版本 编译LLVM时 将build type设为Debug即可 cmake DCMAKE BUILD TYPE Debug 二 GDB调试 调试OPT reference
  • Linux下磁盘分区与扩容

    虚拟机增加磁盘进行磁盘分区 查看磁盘情况 root localhost df 查看设备 root localhost ls dev sd 增加磁盘 root localhost ls dev sd 找到对应增加的设备 假设增加的sdb ro
  • 【2】Qt的MainWindow的能看不能吃的框架 以及 添加图片资源

    就是加上菜单栏 窗口 这些东西 而且没做回调函数 没有做button 所以h文件没有改动 mainwindow cpp include mainwindow h include
  • selenium爬取药监总局

    url http 125 35 6 84 81 xk from selenium import webdriver from lxml import etree from time import sleep page text list d
  • python 复杂表达式

    复杂表达式 使用for循环的迭代不仅可以迭代普通的list 还可以迭代dict 假设有如下的dict d Adam 95 Lisa 85 Bart 59 完全可以通过一个复杂的列表生成式把它变成一个 HTML 表格 tds tr td s
  • LeetCode·每日一题·1177. 构建回文串检测·前缀和

    作者 小迅 链接 https leetcode cn problems can make palindrome from substring solutions 2309940 qian zhui he zhu shi chao ji xi
  • Jina Hub:一站式神经搜索系统组件分享平台

    Hub 是 Jina 全家桶中非常重要的一个成员 本期推文我们将详细介绍 Hub 的相关内容 在过往推文中 我们介绍过 高度适配深度学习任务的可扩展数据结构 DocArray 开源神经搜索框架 Jina 神经搜索系统结果调优工具 Finet
  • 嵌入式Web项目(二)——CGI的引入

    文章目录 静态网页工作原理 动态网页工作原理 CGI的概念 CGI工作原理 boa配置静态文件与CGI文件访问路径 静态文件 CGIPath 动态网页 以shell语言 实现动态网页案例 第一次访问测试 第二次测试 C语言测试 静态网页工作
  • C++ 原始指针、shared_ptr、unique_ptr分别在什么场景下使用

    开发中一直萦绕我的一个困惑是 智能指针和原始指针什么场景怎么用 现在终于有了答案 2020 03 22 增加了unique ptr指针的使用 1 智能指针天生负责对象生命期管理 所以生命期对象全都由unique ptr和shared ptr
  • Redis详解

    1 键值数据库的基本架构 不同键值数据库支持的key类型一般差异不大 而value类型则有较大差别 我们在对键值数据库进行选型时 一个重要的考虑因素是它支持的value类型 例如 Memcached支持的value类型仅为String类型
  • C语言小游戏——贪吃蛇

    贪吃蛇 1 游戏界面 2 游戏说明 3 程序源代码 1 游戏界面 2 游戏说明 贪吃蛇游戏按键说明 按方向键上下左右 可以实现蛇移动方向的改变 3 程序源代码 代码如下 示例 include
  • unity 3D RPG高级教程(十四)

    目录 声明 1 QuestGiver 控制任务对话显示 2 GiveRewards 拿到任务奖励 3 SaveQuestManager 保存任务数据 声明 本教程学习均来自U3D中文课堂麦扣老师 1 QuestGiver 控制任务对话显示