第四章:任务系统

这部分主要对任务系统进行设计,游戏的关键因素之一就是任务系统与玩家的交互,但在代码实现中并不算复杂。本篇博客主要通过一下几个方面实现任务系统。
  1. 任务模型的导入与任务UI界面的创建
  2. 任务的接受与完成
  3. 针对不同对象的指针修改(提高可玩性)

4.1 任务NPC模型的导入、任务UI界面的设计

首先添加接受任务信息的老爷爷,在Model中找到NPC老爷爷,拖入场景Map中,并调整朝向。因为NPC不参与具体战斗,不需要精确点击,因此创建一个Box Collider,使其包围住老爷爷即可。
之后要设计任务对话框,在UI Root界面中导入Atlas,在Sprite中添加游戏任务背景,将背景图片导入。之后对这个背景添加一个tween——>position,修改红框处,其中from 1000~169表示一个运动方向,即对话框从视线之外运动进来,下面的曲线表示运动速度。

4.2 任务的接受与完成

任务界面应包括如下几个方面
  1. 点击NPC时,出现任务描述
  2. 接受任务后,出现任务提示
  3. 完成任务后,提交获取奖励

4.2.1 点击NPC后,应出现提示信息

在任务面板中添加一个Label实现该功能,设计如下
为了在点击任务面板时不移动,给UI控件attach一个box collider,在PlayerDirection中加入判断,即在鼠标点击后判断鼠标是否碰到UI控件,如果碰到,则不移动。
if (Input.GetMouseButtonDown (0) && UICamera.hoveredObject == null)
即可实现。
为了实现点击老爷爷显示界面的效果,我们给NPC老爷爷新建一个脚本BarNPC,代码如下
using UnityEngine;
using System.Collections;
public class BarNPC : MonoBehaviour {public TweenPosition questTween;void OnMouseOver()    //当鼠标发出射线发生碰撞{if (Input.GetMouseButtonDown(0))    //此时点下鼠标{ShowQuest();}}void ShowQuest(){questTween.gameObject.SetActive (true);    //将quest激活questTween.PlayForward ();    //显示动画}
}
即可
为了实现点击“X”按钮隐藏并播放动画,我们对X按钮进行代码设计
    public void CloseQuest(){HideQuest ();}void HideQuest(){questTween.PlayReverse ();    //与PlayForward相反,实现关闭的动画效果}
即可

4.2.2 点击Accept后,出现任务提示

在点击Accept之后,Accept和Cancel按钮应当消失,并且任务描述应当改为任务更新。并出现OK按钮用于在完成任务时提交任务。
接下来这段BarNPC中的代码表示接受任务到完成任务这一系列的所有操作
using UnityEngine;
using System.Collections;
public class BarNPC : MonoBehaviour {public TweenPosition questTween;public bool isOnTask = false;    //是否处于任务状态的标志位public int killWolfNumber = 0;    //当前杀死的狼    public int wolfKilledAcquire = 10;    //需要杀死狼的个数public UILabel describeLabel;    //控制任务描述与进度显示public GameObject AcceptBtnGO;    //控制三个按钮public GameObject OKBtnGO;public GameObject CancelBtnGO;void OnMouseOver(){if (Input.GetMouseButtonDown(0)){if(isOnTask)    //如果处在任务状态,即按下Accept,显示任务进度{ShowTaskProgress();}else    //否则显示任务描述{ShowTaskDes();}ShowQuest();}}void ShowQuest()    //任务界面的动画效果{questTween.gameObject.SetActive (true);questTween.PlayForward ();}void HideQuest(){questTween.PlayReverse ();}void ShowTaskDes()    //任务描述{describeLabel.text = "任务:\n杀死" + wolfKilledAcquire+"只小野狼\n\n奖励:\n1000金币";AcceptBtnGO.gameObject.SetActive (true);OKBtnGO.gameObject.SetActive (false);}void ShowTaskProgress()    //任务进度{describeLabel.text = "任务:\n你已经杀死了" + killWolfNumber + "/"+wolfKilledAcquire+"只小野狼\n\n奖励:\n1000金币";AcceptBtnGO.gameObject.SetActive (false);OKBtnGO.gameObject.SetActive (true);}public void OnCloseQuest()    //点击关闭按钮{HideQuest ();}public void OnAcceptQuest()    //点击接受按钮{isOnTask = true;ShowTaskProgress ();}
}
如下图所示

4.2.3 完成任务后,获取任务奖励并更新任务描述

如果任务完成,点击OK按钮可以提交任务,获得奖励,并把Label显示为新的任务描述
接下来要实现任务奖励的获取和任务更新,首先需要在Magician的PlayerStatus的脚本中添加一段函数,用以控制金币变化
    public void GetCoin(int coinNumber){coin += coinNumber;}
之后需要在BarNPC中调用这个函数
    private PlayerStatus state;void Start()    //在Start中找到对应的脚本{state = GameObject.FindGameObjectWithTag (Tags.player).GetComponent<PlayerStatus> ();}
并在OK的按钮功能中加入
public void OnOKQuest(){if (killWolfNumber >= wolfKilledAcquire)    //若完成目标,即杀死的狼数量大于等于任务目标{state.GetCoin(1000);    //调用GetCoin()增加金币killWolfNumber = 0;    //进度归零ShowTaskDes();    //显示新的任务描述}else{HideQuest();    //若没完成,隐藏界面}}

4.3 点击不同对象出现不同指针

为了让玩家在点击不同对象时出现不同的鼠标,作为提示。我们将所有用到的鼠标指针(RPG——>GUI——>mouse cursor)存到一个类中。脚本编辑为
using UnityEngine;
using System.Collections;
public class MouseSetting : MonoBehaviour {public static MouseSetting _instance;    //一个单例,到时候通过单例调用不同指( ps:单例是用来取代以前的全局函数变量)
相比全局函数,单例不会重名,应用域明确,可以管理生命周期,可封装,可以通过继承扩展(重要!)public Texture2D cursor_normal;    //所有功能的鼠标指针外观public Texture2D cursor_npcTalk;public Texture2D cursor_attack;public Texture2D cursor_pick;public Texture2D cursor_lockTarget;public Vector2 hotspot = Vector2.zero;public CursorMode mode = CursorMode.Auto;void Start(){_instance = this;}public void SetNormalCursor(){Cursor.SetCursor (cursor_normal, hotspot, mode);}public void SetNPCTalkCursor(){Cursor.SetCursor (cursor_npcTalk, hotspot, mode);}
}
为了让每个NPC都能适用于鼠标变换,我们在Script——NPC中新建一个CommonNPC脚本表示对所有NPC都适用的操作,添加
using UnityEngine;
using System.Collections;
public class NPC : MonoBehaviour {void OnMouseEnter()    //碰撞到GUI控件时调用一次,不同于OnMouseOver的每帧调用{MouseSetting._instance.SetNPCTalkCursor ();}void OnMouseExit(){MouseSetting._instance.SetNormalCursor ();}
}
即可,再将public class BarNPC :MonoBehaviour改为public class BarNPC : CommmonNPC ,即BarNPC中的所有NPC能继承CommonNPC脚本中的数据。

总结:任务系统是游戏的重要组成部分,但从代码实现来说,难度并不大。之后会陆续更新面板、道具、装备、系统设置等信息。

RPG游戏《黑暗之光》流程介绍与代码分析之(四):任务系统的实现相关推荐

  1. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(上)

    最近开始接触游戏制作,用Unity制作一些简单的游戏进行入门.这几篇博客总结了Space Shooter的制作流程,并对代码进行了分析.一是方便自己日后进行回顾与补充,二是为了让让更多的游戏爱好者接触 ...

  2. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(下)

    这部分内容关注的是游戏性的提升,包括音效.计分等功能的实现. 传送门: 太空射击(Space Shooter)流程介绍与代码分析(上) 太空射击(Space Shooter)流程介绍与代码分析(中) ...

  3. RPG游戏《黑暗之光》流程介绍与代码分析之(一):游戏载入界面的创建

    <黑暗之光>是一款中等大小的RPG游戏,在入门Unity后适合用来上手,了解一整套游戏开发流程以及游戏内的各种功能.借助几篇博客整理一下整体的开发步骤以及代码,方便自己回顾,也便于各位交流 ...

  4. RPG游戏《黑暗之光》流程介绍与代码分析之(二):角色创建界面的实现

    第二章 角色创建 上一章中完成了初始化的场景界面的创建,本章就接着上一篇博客的内容,介绍角色创建的方法. 2.1 角色创建的UI界面 角色创建的背景采用与加载界面所用背景相同,并且Camera不需要移 ...

  5. RPG游戏《黑暗之光》流程介绍与代码分析之(五):背包系统的实现(上)

    第五章:背包系统 背包系统作为游戏中的一个重要功能,与游戏存在着诸多的交互性,购买商品.怪物掉落等各种情形都需要访问背包系统,结构较为复杂.因此背包系统将通过两篇博客进行分析. (上)部分包括 功能面 ...

  6. RPG游戏《黑暗之光》流程介绍与代码分析之(十四):角色技能系统的实现

    十四章:角色技能系统的实现 技能系统是本游戏开发的最后一部分内容,与普通攻击系统不同,我们需要添加释放技能的特效.动画以及播放时间.并将动画分为回复.Buff.单体和群体. 14.1添加技能的特效名称 ...

  7. RPG游戏《黑暗之光》流程介绍与代码分析之(十三):角色攻击系统的实现

    十三章:角色攻击系统 角色攻击是杀怪时的核心功能,攻击模式又可细分为普通攻击和技能攻击,其中技能攻击的信息存储在SkillInfoInList,本章节只涉及普通攻击部分. 为Magician添加一个P ...

  8. RPG游戏《黑暗之光》流程介绍与代码分析之(十五):主角受攻击效果以及场景切换

    十五章:主角受攻击效果以及场景切换 本篇博客将<黑暗之光>开发的最后工作做完,包括之前未实现的主角被击效果,以及实际运行中的场景切换. 15.1 主角的受攻击效果 我们参照WolfBaby ...

  9. RPG游戏《黑暗之光》流程介绍与代码分析之(六):背包系统的实现(下)

    接着(上)部分的内容,本节关注物品栏中一些功能的实现,及 拾取操作的模拟 背包的显示与隐藏 物品提示信息 5.4 拾取模拟 有了(上)部分的铺垫,本节的目标是实现物品拾取功能. 物品拾取功能的逻辑分为 ...

最新文章

  1. 【强烈推荐】如何给TortoiseGit 配置密钥?
  2. How Many Answers Are Wrong HDU - 3038(带权并查集经典题,满满的都是注释)
  3. linux管理用户和文件权限
  4. 九个步骤让你成为PHP专家
  5. FreeCodeCamp学习之数组查找去重
  6. php 四维数组_PHP 多维数组
  7. matlab多种分配方案_基于MATLAB的水资源优化分配问题动态规划解法
  8. JVM学习笔记-03-类加载器及双亲委派机制
  9. 华为云文字识别深层算法突破 助力复产复工
  10. 如何写程序自动下载BBC Learning English的所有在线课程
  11. 关于Y400 电源管理 Win10解决方案
  12. 架构方案(9) 如何构建一套高可用的 APP 消息推送平台
  13. html5中display flex,详解CSS中的display:flex||inline-flex属性
  14. 白城师范学院计算机系鲍金玲,企业绩效考核方法的比较与借鉴.pdf
  15. 手机号 mysql 索引_mysql索引以及优化
  16. S3C2440的中断体系结构
  17. 【嵌入式Linux驱动开发】十五、实操Linux开发中的中断,编写第一个按键驱动程序
  18. python批量建立文件夹
  19. torch.nn.Embedding的使用
  20. Arduino运行FreeRTOS操作系统

热门文章

  1. 绝唱----《命运交响曲》
  2. AD集成库元件简写中英文对照表
  3. 为什么输入法显示中文打不出中文_输入法为什么打不出汉字_电脑输入法打不出汉字如何解决-win7之家...
  4. vis.js网络拓扑图自定义图片
  5. 经典的webshell提权
  6. 快速理解Lambda表达式
  7. JCBD - 4 - JCBD - CRUD操作 即:JDBC常用接口详解
  8. java的内容好复杂_Java I/O 好复杂,傻傻分不清楚,别担心,我们有线索了……...
  9. 阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)
  10. 很久之前的诗三首,系列诗,听一个MM得,发到这里.