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

第四章:任务系统


这部分主要对任务系统进行设计,游戏的关键因素之一就是任务系统与玩家的交互,但在代码实现中并不算复杂。本篇博客主要通过一下几个方面实现任务系统。
  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脚本中的数据。


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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352793.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

GoodTask 6.6.0 计划提醒任务管理工具

GoodTask是一款基于Apple提醒和日历、功能强大的任务/项目管理工具。它既可以用作简单的待办事项检查列表&#xff0c;也可以用作复杂的项目管理工具&#xff0c;帮助完成重大项目。GoodTask让您通过各种不同的视角来观看自己关注且需要完成的事务。有了GoodTask&#xff0c;您…

超黑光摄像机可以有多“黑“?

目前&#xff0c;市场标准黑光级IPC能在0.0005Lux(照度单位)的低照下维持彩色&#xff0c;但星光级或普通红外条件则必须依赖补光灯。那么有没有一款摄像机能达到超黑光的标准&#xff0c;能够在更暗环境下&#xff0c;不需要额外补光的情况下维持彩色呢&#xff1f; 超低照成像…

如何处理亿级图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池&#xff0c;存有1亿图片。给一张目标图片&#xff0c;在图片池中做匹配。 判断一张图片是否在图片池中出现过。&#xff08;完全一样&#xff09;判断有没有相似的出现过。比如两张图相似度90&#xff0c;两张图片是在描述一件事情。 …

【初识Spring框架】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. Spring框架是什么&#xff1f; 2. IOC 容器…

mDNS实现之Bonjour与Avahi(二)——win/linux/arm交叉编译

0.Part1&#xff1a; mDNS实现之Bonjour与Avahi&#xff08;一&#xff09;——win/linux/arm交叉编译_平凡之路-CSDN博客官网&#xff1a;Bonjour - Apple Developerhttps://developer.apple.com/bonjour/1.WindowsBonjour SDK for Windowshttps://developer.apple.com/downlo…

Android Says Bonjour

转载自&#xff1a; https://blog.csdn.net/innost/article/details/8629139 Android Says Bonjour 很高兴能在农历蛇年刚开始的这期《程序员》杂志上继续为读者奉上Android的故事。初来咋到&#xff0c;首先要向大家说声”你好“。有意思的是&#xff0c;Android也很通人情&a…

iOS 之 Bonjour 协议简单抓包分析

引子 因在学习iOS编程之bonjour编程的过程中&#xff0c;对bonjour产生了一些些的好奇&#xff0c;因此就查 阅了各种资料以及自己抓包分析该协议。 注&#xff1a;文章作为个人学习记录&#xff0c;不一定准确&#xff0c;如有错误请多多指教&#xff0c;共同进步&#xff01;…

1.7 基于XML配置方式使用Spring MVC

一、基于XML配置与注解的方式使用Spring MVC 1、创建Maven项目 Maven项目 - SpringMvcDemo01 单击【Finish】按钮 2、添加相关依赖 在pom.xml文件里添加支持Spring MVC的相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmln…

硬件工程师-BOOST升压电源设计

一、Boost变换原理 开关闭合时&#xff0c;电感电压等于输入电压 开关断开时&#xff0c;电感电压输出电压-输入电压&#xff0c; 电感的感生电动势&#xff0c;N ΔΦ磁通的变化率&#xff0c;Δt时间 假设开关闭合与开关断开&#xff0c;开关断开时能量全部释放光 将第三个式…

【Python】深度理解Class类、Object类、Type元类的概念和关系

深度理解Class类、Object类、Type元类 1.Class类、Object类、Type元类的表面关系2.Class、Object、Type解释3.关系详解4.那么如何看待object、type在Python面对对象概念中的一席之地呢&#xff1f;5.那么object、type扮演了什么样的角色呢&#xff1f;他们对class又分别做了什么…

MongoDB(学习笔记1.0)

最近在学非关系型数据库MongoDB&#xff0c;猛地用起来的真的没关系型数据库方便啊。 首先还是数据库的安装&#xff1a; 安装直接去官网安装即可&#xff0c;官网地址&#xff1a;MongoDB: The Developer Data Platform | MongoDB 当前也有免安装版的&#xff0c;这里就不再…

京东数据分析软件工具(京东618销量查询)

这一期&#xff0c;我们主要分享今年618京东美妆的预售数据&#xff0c;包括面部护肤、香水彩妆、男士面部护肤品类。 -面部护肤- 今年618&#xff0c;面部护肤品类在京东累计预售量达到130万件&#xff0c;预售额达到13亿元。预售期间&#xff0c;护肤品类均价在1010元左右。期…

Android 使用第三方字体

先看下图 一.全局替换方式 1.新建assets引入资源 2. 自定义application&#xff0c;将第三方的字体&#xff0c;替换当前系统默认字体 class App : Application() {override fun onCreate() {super.onCreate()initTypeface()}private fun initTypeface() {val typefaceByson…

Android 字体大小(fontScale)不随系统设置变化

需求 App字体大小不变 如果用户将系统字体大小设置的非常大&#xff0c;可能导致APP的文字大小显示异常。 目标效果是&#xff0c;APP内字体大小不随系统设置的 字体大小 变化。 原始效果 系统的字体大小设置为 超大 时&#xff1a;&#xff08;字体大小 可变&#xff09; 目…

Android 自带的字体库、字体样式

1、设置字体 android:fontFamily“字体样式” 1、sans-serif-smallcaps &#xff08;左边只设置字体&#xff0c;右边设置加粗&#xff09; 2、sans-serif 3、cursive 4、sans-serif-black 5、sans-serif-condensed-light 6、sans-serif-thin 7、serif 8、serif-monospa…

android屏幕大小字体大小,Android字体大小自适应不同分辨率的解决办法

Android字体大小自适应不同分辨率的解决办法 今天有人问我&#xff0c;Android系统不同分辨率&#xff0c;不同大小的手机&#xff0c;字体大小怎么去适应呢&#xff1f;其实字体的适应和图片的适应是一个道理的。 一、原理如下&#xff1a; 假设需要适应320x240&#xff0c;48…

Android切换字体

有时候需要根据UI需求切换项目字体&#xff0c;步骤如下&#xff1a; 准备字体文件&#xff0c;示例使用ttf文件&#xff0c;新建font文件夹&#xff1a; 将ttf文件放到res/font目录下 设置全局字体&#xff0c;系统主题添加 <item name"android:fontFamily">f…

Android 字体颜色设置及颜色表

1、在android中经常看到设置的颜色为八位的十六进制的颜色值&#xff0c;例如&#xff1a; public static final class color { public static final int lightblue0x7f040000; } 或者在Java中tx.setTextColor(0xffff00f); 说明&#xff1a; 0xffff00ff是int类型的数据&#…

IOS字体与安卓字体渲染不一致

IOS字体与安卓字体渲染不一致 问题: 前端开发中经常会遇到各种各样的兼容问题,记录一次IOS字体与安卓字体渲染不一致,当字体包名字中包含’-Bold’时 错误代码如下: font-family: DINAlternate-Bold ; font-weight: bold;IOS: 不会渲染’font-weight: bold’只是加载了’…

android中文字体加粗,android TextView设置中文字体加粗实现方法

android TextView设置中文字体加粗实现方法 英文设置加粗可以在xml里面设置: 复制代码 代码如下: android:textStyle="bold" 英文还可以直接在String文件里面直接这样填写: 复制代码 代码如下: Plain, bold, italic, bold-italic b代码加粗,i代表倾斜 中文设置加粗就…