• 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

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

  • 相关阅读:
    Red Hat Enterprise Linux 7.2下使用RPM包安装SQL Server vNext
    VS2015解决方案资源管理器空白,不显示内容
    ArcEngine调用FeatureToLine工具传参问题
    ArcEngine调用GP里的Merge工具传参问题
    ArcGIS GP服务的发布及调用
    利用 Chrome 原生工具进行网页长截图
    关于ueditor与arcgis js api同用会报错的问题
    关于ueditor使用说明
    bootstraptable为行中的按钮添加事件
    关于html与body的高度问题
  • 原文地址:https://www.cnblogs.com/chinarbolg/p/9601462.html
Copyright © 2020-2023  润新知