array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Unity3D游戏-愤怒的小鸟游戏源码和教程(二) - Chinar - 爱码网
chinarbolg

Unity3D游戏-愤怒的小鸟游戏源码和教程(二)

Unity愤怒的小鸟游戏教程(二)


本文提供全流程,中文翻译。

Chinar坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



AngryEva游戏效果:

这里写图片描述



教程一,请点击↓↓

Unity3D游戏-愤怒的小鸟游戏源码和教程(一)


1

LevelFrameSelect —— 关卡框选择



用来控制关卡框的解锁,页面跳转

举个栗子黑白88

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


/// <summary>
/// 关卡框架选择 —— 用来控制关卡的解锁与否
/// </summary>
public class FrameSelect : MonoBehaviour
{
    public  int        StarNum;           //行星数量
    public  bool       isSelect;          //是否可选
    public  GameObject LocksGameObject;   //枷锁
    public  GameObject StarsGameObject;   //星星
    public  GameObject AllFramePanel;     //所有选关界面
    public  GameObject MapLevelPanel;     //关卡界面
    private Button     SelectButton;      //按钮组件
    public  Text       LevelStarsText;    //关卡星星数量
    public  int        LevelStarNum  = 0; //关卡开始数量
    public  int        LevelEndCount = 2; //关卡结束数量


    void Start()
    {
        //PlayerPrefs.DeleteAll();

        SelectButton = GetComponent<Button>();
        SelectButton.onClick.AddListener(ToMapLevel); //绑定选关按钮事件

        SelectButton = GameObject.Find("ExitGameButton").GetComponent<Button>();
        SelectButton.onClick.AddListener(ExitGame); //绑定退出游戏按钮事件

        SelectButton = GameObject.Find("BackStartPanelButton").GetComponent<Button>();
        SelectButton.onClick.AddListener(BackStarPanel); //绑定按钮事件

        if (PlayerPrefs.GetInt("AllStarNum", 0) >= StarNum) //声明一个所有星星数量>0
        {
            isSelect = true; //可以选择
        }
        if (isSelect)
        {
            LocksGameObject.SetActive(false); //关闭枷锁
            StarsGameObject.SetActive(true);  //开启星星计数
            //显示星星
            int counts = 0; //用来计数关卡的总星星个数
            for (int i = LevelStarNum; i <= LevelEndCount; i++)
            {
                counts += PlayerPrefs.GetInt("Level (" + i + ")", 0);
            }
            LevelStarsText.text = counts + "/9";
        }
    }


    /// <summary>
    /// 跳转到关卡界面
    /// </summary>
    public void ToMapLevel()
    {
        if (isSelect)
        {
            AllFramePanel.SetActive(false); //关闭选关界面
            MapLevelPanel.SetActive(true);  //开启关卡界面
        }
    }


    /// <summary>
    /// 退出游戏
    /// </summary>
    public void ExitGame()
    {
        Application.Quit();
    }


    /// <summary>
    /// 返回开始界面
    /// </summary>
    public void BackStarPanel()
    {
        SceneManager.LoadScene(0);
    }
}

这里写图片描述

这里写图片描述


2

MapLevel —— 关卡页面脚本



用来控制每个关卡的解锁,和跳转到游戏场景

举个栗子黑白88Chinar的GitHub工程案例

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


/// <summary>
/// 关卡选择脚本
/// </summary>
public class MapLevel : MonoBehaviour
{
    public  bool         isSelect;      //可选状态
    public  Sprite       LevelSprite;   //替换关卡图
    private Image        LeveLImage;    //UI关卡图组件
    public  GameObject   AllFramePanel; //选关场景界面
    private Button       BackButton;    //返回按钮
    public  GameObject[] Stars;         //星星数组
    public  string       BiaoShiString; //标示
    public  bool         isDevelop;     //是否开发


    private void Awake()
    {
        LeveLImage = GetComponent<Image>();
    }


    void Start()
    {
        BackButton = transform.parent.parent.transform.Find("Map1_BackButton").GetComponent<Button>();
        BackButton.onClick.AddListener(ToFrame); //绑定按钮事件
        BackButton = GetComponent<Button>();
        BackButton.onClick.AddListener(Selected);                 //绑定按钮事件
        if (transform.parent.GetChild(0).name == gameObject.name) //判断是否是第一关
        {
            isSelect = true;
        }
        else //判断前一关的分数
        {
            if (BiaoShiString == "0")
            {
                int beforeNum = transform.GetSiblingIndex() - 1;
                if (PlayerPrefs.GetInt("Level ("            + beforeNum + ")") > 0)
                {
                    isSelect = true;
                }
            }
            else if (BiaoShiString != null && isDevelop)
            {
                int beforeNum = transform.GetSiblingIndex() - 1;
                if (beforeNum < 2) //限定前三个
                {
                    if (PlayerPrefs.GetInt("Level (" + BiaoShiString + beforeNum + ")") > 0) //判断并解开后一关关卡
                    {
                        isSelect = true;
                    }
                }
            }
        }


        if (isSelect) //处理关卡显示效果
        {
            LeveLImage.overrideSprite = LevelSprite;               //替换图片
            transform.Find("LevelNum").gameObject.SetActive(true); //开启关卡名
            int num = PlayerPrefs.GetInt(gameObject.name);         //关卡名:对应行星数量
            if (num > 0)                                           //显示几颗星
            {
                for (int i = 0; i < num; i++)
                {
                    Stars[i].SetActive(true);
                }
            }
        }
    }


    /// <summary>
    /// 跳转到选关场景界面
    /// </summary>
    public void ToFrame()
    {
        AllFramePanel.SetActive(true);                       //关闭选关界面
        transform.parent.parent.gameObject.SetActive(false); //开启关卡界面
    }


    /// <summary>
    /// 进入关卡
    /// </summary>
    public void Selected()
    {
        if (isSelect)
        {
            PlayerPrefs.SetString("NowLevel", gameObject.name);
            SceneManager.LoadScene(2);
        }
        else
        {
            if (isDevelop == false) //未曾开发
            {
                GameObject obj = Instantiate(Resources.Load<GameObject>("Prefabs/HintPanel")); //提示页面
                obj.transform.SetParent(GameObject.Find("Canvas").transform);
                obj.transform.localPosition = Vector3.zero;
                Destroy(obj, 2);
            }
        }
    }
}

这里写图片描述

这里写图片描述





Chinar


支持

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!


先点击领取 —— 阿里全产品优惠卷 (享受最低优惠)


1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !





技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

分类:

技术点:

相关文章: