一个完整的游戏项目肯定是要做新手引导的,而引导做的好坏可能会影响玩家的留存。那么怎么简单的实现个简有效的引导呢!先不说废话,先看看效果,这是一个基于UGUI做的一个简单的引导!

怎么样,看着是那么回事吧?看起来确实有点丑,如果给按钮边缘加上缩放或者流光特效,那么逼格瞬间就上去了,可惜,没找到资源。最重要的是实现起来灰常简单,就一个函数搞定。

1,如何实现引导:

  1,首先创建一个Mask遮罩,保证任意地方接受不到点击,适当的调整下Alpha。

2,将要点击的按钮高亮,保证引导按钮可以响应到点击事件。

  3,引导类型判断:如果是强制引导,没办法,那就老老实实的点高亮的引导按钮吧!如果是非强制引导,触发引导事件后开始计时,如果计时超过5秒自动解除引导。

  4,引导回掉处理,如果该步引导是本引导组的最后一步,那么回掉事件处理正常游戏逻辑。

  5,引导存档。前天我们游戏在测试时发现,玩家在85级开启交易行功能了,引导完成后下线再上线该引导又来了一边,这是非常讨厌的,很有可能因为这个导致玩家流失。所     以存档是必不可少的,无论是单机还是网游。

2,引导如何流程化:

  在我们这个游戏中引导我们走的是配表,程序做好引导机制,策划直接配置Excel表格即可。引导按照功能划分,也就有了所谓的引导组。一个功能内部原子化细分这样每个功能有多少步引导就非常详细了。这里就体现出了所谓的软件的工艺流程!

3,引导如何自动化:

  自动引导这个到底有没有必要呢?当一个游戏的功能和复杂度极高时,这个是十分必要的。就拿我们游戏来说吧,翅膀功能200级开启,翅膀强化遇到一个bug,用GM命令setlevel 200,好了等级到了,1-200级的引导要一个一个去点开,简直是要命啊!所以引导的自动化是十分必要的,自动完成引导节省了很多时间。如何实现自动化引导,那么引导组加上引导步骤id使用强制引导的方式很简单就实现了!

4,具体实现

  这里使用的是Canvas + Graphic Raycaster的方式。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System; public class LoginGuid : MonoBehaviour
{
public GameObject prb_mask;
public GameObject btn_menue1;
public GameObject btn_menue2;
private GameObject mask; public LoginPanelView loginPanel;
public static Action GuidCallback; // Use this for initialization
void Start()
{
GuidCallback += GuidFinsih; EventTriggerListener.GetListener(btn_menue1).onPointerClick += go =>
{
if (loginPanel != null)
{
loginPanel.gameObject.SetActive(true);
GuidStep2();
}
else
Debug.LogError("panel_login is not found!");
}; EventTriggerListener.GetListener(btn_menue2).onPointerClick += go =>
{
GuidStep3();
}; GuidStep1();
} /// <summary>
/// 第一步引导
/// </summary>
void GuidStep1()
{
Debug.Log("<color=red>开始第一步引导</color>"); //创建遮罩Mask
mask = Instantiate(prb_mask) as GameObject;
mask.transform.parent = this.gameObject.transform;
mask.transform.localPosition = Vector3.zero;
mask.transform.localScale = Vector3.one;
mask.transform.SetAsLastSibling(); btn_menue1.AddComponent<Canvas>().overrideSorting = true;
SetMaskAndBtnHiglight(null, btn_menue1);
} void GuidStep2()
{
Debug.Log("第二步引导");
SetMaskAndBtnHiglight(btn_menue1, btn_menue2);
} void GuidStep3()
{
Debug.Log("第三步引导");
SetMaskAndBtnHiglight(btn_menue2, loginPanel.btn_login);
} /// <summary>
/// 还原上一个引导
/// 设置下一个引导
/// </summary>
/// <param name="lastBtn">上一个引导按钮</param>
/// <param name="nextStep">下一个引导按钮</param>
void SetMaskAndBtnHiglight(GameObject lastStep, GameObject nextStep)
{
if (lastStep)
{
lastStep.GetComponent<Canvas>().overrideSorting = false;
Destroy(lastStep.GetComponent<GraphicRaycaster>());
}
Canvas nextCanvas = nextStep.GetComponent<Canvas>();
if (nextCanvas)
nextCanvas.overrideSorting = true;
else
nextStep.AddComponent<Canvas>().overrideSorting = true;
nextStep.AddComponent<GraphicRaycaster>();
} void GuidFinsih()
{
Debug.Log("<color=red>引导完成</color>");
Destroy(mask);
}
}

一个简单而实用的引导就实现了,下一篇研究下NGUI的引导实现!如有问题或者建议,欢迎交流!

项目地址:https://git.oschina.net/wuzhang/uguinewguid.git

如何简单的实现新手引导之UGUI篇的更多相关文章

  1. 基于PHP——简单的WSDL的创建(WSDL篇)

    1.建立WSDL文件      建立WSDL的工具很多,eclipse.zendstudio.vs都可以,我个人建议自己写,熟悉结构,另外自动工具对xml schame类型支持在类型中可能会报错. 下 ...

  2. 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

    转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc03-feign/ 本文出自方志朋的博客 最新Finchley版本请访问: ...

  3. 写简单游戏,学编程语言-python篇:大鱼吃小鱼

    很常见的游戏之一,实现原理并不复杂,并且参考了几个相关的代码.这边主要还是以学习编程语言和学习编程思路为重点记录一下吧.最近时间有点吃紧,只能匆忙记录一下.用pygame做的大鱼吃小鱼的游戏截图如下: ...

  4. 写简单游戏,学编程语言-python篇:传说哥大战剧毒术士

    上篇写的动画示例其实算不上一个游戏,顶多算是利用pygame进行的图形操作,今天着手实现一个小游戏:传说哥大战剧毒术士.名字很玄乎,其实就是最简单的一个射击游戏.好了废话不多说,先上截图吧: 一.初始 ...

  5. 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)

    转载请标明出处: 原文首发于 https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f10-eureka/ 本文出自方志朋的博客 文章 史上最简单 ...

  6. 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f3-feign/ 本文出自方志朋的博客 上一篇文章,讲述了如 ...

  7. 【C/C++学院】0724-堆栈简单介绍/静态区/内存完毕篇/多线程

    [送给在路上的程序猿] 对于一个开发人员而言,可以胜任系统中随意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并能够运用到系统中.由此简化系统的开发.是其架构生涯的第一步. ...

  8. 原来rollup这么简单之 rollup.generate + rollup.write篇

    大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. 计划 rollup系列打算 ...

  9. v86.01 鸿蒙内核源码分析 (静态分配篇) | 很简单的一位小朋友 | 百篇博客分析 OpenHarmony 源码

    本篇关键词:池头.池体.节头.节块 内存管理相关篇为: v31.02 鸿蒙内核源码分析(内存规则) | 内存管理到底在管什么 v32.04 鸿蒙内核源码分析(物理内存) | 真实的可不一定精彩 v33 ...

随机推荐

  1. 常用的CI笔记

    1. thinkphp 封装好的$this->success(),就直接实现成功跳转,$this->error(),错误跳转.CI有show_error(),但是却不能直接实现跳转,所以需 ...

  2. eval全局作用域和局部作用域的坑!

    1.eval 是个函数,他可以被赋值给变量,例如   var evalg = eval;  evalg("alert(1)"); 2.eval被赋值时,也会把当前eval所处的变量 ...

  3. JDBC进阶

    PreparedStatement的使用: conn = DriverManager.getConnection("jdbc:mysql://localhost/mydata?" ...

  4. swift学习 - 分类(Extensions)

    在oc中为了增强已有类的功能,我们经常使用分类.使用分类,我们可以在不破坏原有类的结构的前提下,对原有类进行模块化的扩展. 但是在swift中没有分类这种写法了.相对应的是swift中只有扩展(Ext ...

  5. 字符串时间和NSDate相互转换的坑

    项目中服务器传回来的时间是这种格式的 Sep 5, 2016 6:59:05 PM 现在要将这段字符串转换成 2016-09-05 06:59 被坑的地方有2个点 服务器传回来的英文的Sep,调试的时 ...

  6. C#中的委托(一)

    一.委托 把方法作为参数传给其他方法: 二.声明委托 在C#中使用一个类时,分两个阶段.首先,需要去定义一个类,然后实例化类的一个对象(只需要静态方法除外). 使用委托也需要经过这2个步骤,首先必须定 ...

  7. nodejs集成sqlite

    正在物色node上面的轻量级嵌入式数据库,作为嵌入式数据库的代表,sqlite无疑是个理想的选择方案.npm上集成sqlite的库主要有两个——sqlite3和realm. realm是一个理想的选择 ...

  8. 互联网“剁手”新方向,VR全景购物忙——全景智慧城市常诚

    随着VR和AR技术的兴起,各行各业都在寻求VR+的对接方式,除了游戏和社交平台,另一大对VR有着浓厚兴趣的就是电商平台了,阿里.京东等电商巨头纷纷成立VR事业部,如何让亿万用户在VR中愉快的买买买,已 ...

  9. JavaSE教程-04Java中循环语句for,while,do···while-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看

  10. [python标准库]Pickle模块

    Pickle-------python对象序列化 本文主要阐述以下几点: 1.pickle模块简介 2.pickle模块提供的方法 3.注意事项 4.实例解析 1.pickle模块简介 The pic ...