前言
在上一篇教程中,我们主要学习了新手教程框架的三个部分,在这一篇文章中,我们将学习: - 新手引导界面的搭建 - 圆形遮罩和方形遮罩shader的使用 - 使用框架完成第一个新手引导
新手引导界面的搭建
新手引导界面主要分为以下几块:
- BlackBG - 黑色半透明背景
- MaskContainer - 圆形遮罩和方形遮罩
- Role - 角色图标
- CloneContainer - 用来存放克隆出来的物体
- DialogBgSprite - 对话框背景
- Finger - 手指
- Arrow - 引导箭头
- ClickArea 点击区域
接下来是引导界面的脚本,总结一下流程
GuideEvent中检测新手教程触发条件->
调用GuidePanel的SetDataByID->
解析GuideInfo并且显示在面板上->
调用UImanager的ShowPanel->
触发教程开始Event->
点击->
调用点击事件->
SetDataByID(NextID)->
直到nextID是0为止, 这样就走完了一套新手教程。
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GuidePanel : BasePanel
{
public static GuidePanel Instance = null;
public GameObject fingerObj;
public Image leftRoleSprite, rightRoleSprite, dialogBgSprite;
public Text dialogText;
public CircleGuidanceController circleMask;
public RectGuidanceController rectMask;
public GameObject maskContainer;
public GameObject bg;
//public Transform clickAreaTrans,bg;
//public BoxCollider clickAreaBox;
//public GameObject arrow,leftDialog,rightDialog;
//public GuideDialogTextShow dialogTextShow;
public bool isInLoading = false;
private int curGuideId = 0;
private GameObject curCloneGameObj;
public RectTransform cloneContainer;
public RectTransform clickArea;
public GameObject arrow;
public override void Init()
{
Instance = this;
base.Init();
GuideEvent.Instance.Init();
}
public override void Show()
{
//Debug.Log ("GuidePanel show");
base.Show();
}
public override void Hide()
{
base.Hide();
gameObject.SetActive(false);
}
public void SetDataById(int id)
{
if (curCloneGameObj != null)
{
Destroy(curCloneGameObj);
}
curGuideId = id;
GuideInfo guideInfo = GuideEvent.Instance.GetGuideInfo(id);
PlayerData.Instance.playerData.guideInfo.guideId = curGuideId;
bool isShowBG = GuideTextData.Instance.GetIsShowBG(curGuideId);
bg.gameObject.SetActive(isShowBG);
if (!string.IsNullOrEmpty(guideInfo.guideText))
{
dialogText.gameObject.SetActive(true);
dialogText.text = guideInfo.guideText;
dialogBgSprite.gameObject.SetActive(true);
if(guideInfo.dialogDir!=DialogDir.Mid){
RectTransform.Edge edge = (RectTransform.Edge)guideInfo.dialogDir;
int size = 0;
switch (edge)
{
case RectTransform.Edge.Bottom:
case RectTransform.Edge.Top:
size = Screen.height/3;
break;
case RectTransform.Edge.Left:
case RectTransform.Edge.Right:
size = Screen.width / 3;
break;
}
dialogBgSprite.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(edge, 0, size);
}else
{
dialogBgSprite.GetComponent<RectTransform>().localPosition = Vector3.zero;
dialogBgSprite.GetComponent<RectTransform>().sizeDelta = new Vector2(Screen.width/3,Screen.height/3);
}
}
else
{
dialogBgSprite.gameObject.SetActive(false);
}
Sprite roleSprite = guideInfo.roleSprite;
if (roleSprite != null)
{
leftRoleSprite.sprite = roleSprite;
rightRoleSprite.sprite = roleSprite;
leftRoleSprite.gameObject.SetActive(true);
rightRoleSprite.gameObject.SetActive(true);
}
else
{
leftRoleSprite.gameObject.SetActive(false);
rightRoleSprite.gameObject.SetActive(false);
}
//50的偏差为手指动画的位移
Vector3 fingerPos = guideInfo.trans == null ? Vector3.zero : new Vector3(guideInfo.trans.position.x + 50, guideInfo.trans.position.y - 50, guideInfo.trans.position.z);
if (fingerPos != Vector3.zero)
{
fingerObj.SetActive(true);
fingerObj.transform.p