unity3d 关卡选择_unity3d关卡切换 - CSDN
  • Unity3D解锁关卡功能

    千次阅读 2018-03-13 23:23:16
    1.创建多个button(关卡数)->创建Button数组存button(代码)+目前达到第几关卡(默认为1)levelReached->达到那一关,那一关的Button才可用levelReached=button可用public class LevelSelect : ...

    1.创建多个button(关卡数)->创建Button数组存button(代码)+目前达到第几关卡(默认为1)levelReached->达到那一关,那一关的Button才可用levelReached=button可用

    public class LevelSelect : MonoBehaviour {
        public Button[] levelButton;//关卡数组
        
    	// Use this for initialization
    	void Start () {
             int levelReached = PlayerPrefs.GetInt("levelReach",1);//获取值,不存在返回1(初始第一关)
            for (int i = 0; i < levelButton.Length; i++)
            {
                if (i > levelReached-1)//达到那一关,那一关的Button才可用
                {
                    levelButton[i].interactable = false; //Interactable(是否可用)
                }
            }
    	}

    2.UI(另起一个场景存)

    添加UI->Scroll View->

     ->content加两个组件->Content Size Fitter会根据多少内容来调整Scroll的大小,Grid根据什么方式排布

     

    ->在content里面加Button,作为关卡选项

    http://blog.csdn.net/gcs6564157/article/details/54884809

    注:Scroll View的大小在此处调(调一下上下左右的边距)


    Button的脚本

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    
    public class LvButtonInfo : MonoBehaviour {
        public Image[] stars;
        public string lvName;
    	void Start () {
            PlayerPrefs.SetInt(lvName,0);
            int lvStarNumber = PlayerPrefs.GetInt(lvName);
    
            for (int i = 0; i < stars.Length; i++)
            {
                stars[i].enabled = false;
            }
    
            for(int i=0;i<lvStarNumber;i++)
            {
                stars[i].enabled = true;
            }
    	}
        public void EnterLv()
        {
            SceneManager.LoadScene(lvName);
        }
    } 

    lvName在Inspect面板写即可。

    展开全文
  • 目标:实现关卡选择界面 这一篇里没有新的内容,全是前面5讲知识点的综合,如何用GUITexture做背景,如何用GUISkin做个性化的按钮,如何添加游戏背景音乐,如何修改鼠标样式,这些都是前面提到的知识点,在...

    目标:实现关卡选择界面



    这一篇里没有新的内容,全是前面5讲知识点的综合,如何用GUITexture做背景,如何用GUISkin做个性化的按钮,如何添加游戏背景音乐,如何修改鼠标样式,这些都是前面提到的知识点,在这里大家用这个界面把之前的都巩固下吧。

    #pragma strict
    
    var customSkin : GUISkin;
    
    function Start () {
    
    }
    
    function Update () {
    
    }
    
    function OnGUI () {
    	GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, 
    		Vector3(Screen.width / 800.0, Screen.height / 600.0, 1));
    	
    	GUI.skin = customSkin;
    	
    	if (GUI.Button(Rect(125, 100, 150, 150), "", "Level1")) {
    		Application.LoadLevel(3);
    	}
    	
    	if (GUI.Button(Rect(325, 100, 150, 150), "", "Level2")) {
    	}
    	
    	if (GUI.Button(Rect(525, 100, 150, 150), "", "Level3")) {
    	}
    	
    	if (GUI.Button(Rect(125, 300, 150, 150), "", "Level4")) {
    	}
    	
    	if (GUI.Button(Rect(325, 300, 150, 150), "", "Level5")) {
    	}
    	
    	if (GUI.Button(Rect(525, 300, 150, 150), "", "Level6")) {
    	}
    	
    	if (GUI.Button(Rect(70, 500, 100, 80), "", "Back")) {
    		Application.LoadLevel(1);
    	}
    }

    OK,运行下试试吧!


    源码下载地址: http://download.csdn.net/detail/ariel7321/4421702



    展开全文
  • Unity3D游戏开发之快速打造流行的关卡系统

    万次阅读 热门讨论 2015-12-01 08:22:18
    今天想和大家分享的是目前在移动平台上较为流行的关卡系统,关卡系统通常是单机手机游戏如《愤怒的小鸟》、《保卫萝卜》中对游戏内容的组织形式,玩家可通过已解锁的关卡(默认第一关是已解锁的)获取分数进而解锁新的...

    各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei。
    今天想和大家分享的是目前在移动平台上较为流行的关卡系统,关卡系统通常是单机手机游戏如《愤怒的小鸟》、《保卫萝卜》中对游戏内容的组织形式,玩家可通过已解锁的关卡(默认第一关是已解锁的)获取分数进而解锁新的关卡,或者是通过付费购买解锁新的关卡。那么好了,在今天的文章中博主将带领大家快速实现一个可扩展的关卡系统,这个实例的灵感来自博主最近的工作经历,希望对大家学习Unity3D游戏起到一定帮助性的作用。

    原理

    在本地配置一个Xml文件,在这个文件中定义当前游戏中关卡的相关信息,通过解析该文件并和UI绑定最终实现一个完整的关卡系统。

    1、定义关卡

    首先我们来定义一个关卡的基本结构:

    public class Level
    {
        /// <summary>
        /// 关卡ID
        /// </summary>
        public string ID;
    
        /// <summary>
        /// 关卡名称
        /// </summary>
        public string Name;
    
        /// <summary>
        /// 关卡是否解锁  
        /// </summary>
        public bool UnLock = false;
    }

    在这里,我们假定关卡的名称和该关卡在Unity3D中场景名称一致。其中最为重要的一个属性是UnLock,该值是一个布尔型变量,表明该关卡是否解锁,因为在游戏中,只有解锁的场景是可以访问的。

    2、定义关卡配置文件

    从关卡的基本结构Level可以定义出如下的配置文件,这里使用Xml作为配置文件的存储形式:

    <?xml version="1.0" encoding="utf-8"?>
    <levels>
      <level id="0" name="level0" unlock="1" />
      <level id="1" name="level1" unlock="0" />
      <level id="2" name="level2" unlock="0" />
      <level id="3" name="level3" unlock="0" />
      <level id="4" name="level4" unlock="0" />
      <level id="5" name="level5" unlock="0" />
      <level id="6" name="level6" unlock="0" />
      <level id="7" name="level7" unlock="0" />
      <level id="8" name="level8" unlock="0" />
      <level id="9" name="level9" unlock="0" />
    </levels>

    和关卡结构定义类似,这里使用0和1来表示关卡的解锁情况,0表示未解锁,1表示解锁,可以注意到默认情况下第一个关卡是解锁的,这符合我们在玩《愤怒的小鸟》这类游戏时的直观感受。那么好了,在完成了关卡的结构定义和配置文件定义后,接下来我们开始思考如何来实现一个关卡系统,因为此处并不涉及到Unity3D场景中的具体逻辑,因此我们在关卡系统中主要的工作就是维护好主界面场景和各个游戏场景的跳转关系,我们可以注意到这里要完成两件事情,即第一要将配置文件中的关卡以一定形式加载到主界面中,并告诉玩家哪些关卡是已解锁的、哪些关卡是未解锁的,当玩家点击不同的关卡时可以得到不同的响应,已解锁的关卡可以访问并进入游戏环节,未解锁的关卡则需要获得更多的分数或者是通过付费来解锁关卡;第二是要对关卡进行编辑,当玩家获得了分数或者是支付一定的费用后可以解锁关卡进入游戏环节。这两点综合起来就是我们需要对关卡的配置文件进行读写,因为我们注意到一个关卡是否解锁仅仅取决于unlock属性,那么好了,明白了这一点后我们来动手编写一个维护关卡的类。

    3、编写一个维护关卡的类

    这里直接给出代码,因为从严格的意义上来说,这段代码并非我们此刻关注的重点,可能这让大家感到难以适应,因为文章明明就是在教我们实现一个关卡系统,可是此刻博主却说这部分不重要了,请大家稍安勿躁,因为这里有比代码更为深刻的东西。

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.Xml;
    
    public static class LevelSystem 
    {
        /// <summary>
        /// 加载Xml文件 
        /// </summary>
        /// <returns>The levels.</returns>
        public static List<Level> LoadLevels()
        {
            //创建Xml对象
            XmlDocument xmlDoc = new XmlDocument();
            //如果本地存在配置文件则读取配置文件
            //否则在本地创建配置文件的副本
            //为了跨平台及可读可写,需要使用Application.persistentDataPath
            string filePath = Application.persistentDataPath + "/levels.xml";
            if (!IOUntility.isFileExists (filePath)) {
                xmlDoc.LoadXml (((TextAsset)Resources.Load ("levels")).text);
                IOUntility.CreateFile (filePath, xmlDoc.InnerXml);
            } else {
                xmlDoc.Load(filePath);
            }
            XmlElement root = xmlDoc.DocumentElement;
            XmlNodeList levelsNode = root.SelectNodes("/levels/level");
            //初始化关卡列表
            List<Level> levels = new List<Level>();
            foreach (XmlElement xe in levelsNode) 
            {
                Level l=new Level();
                l.ID=xe.GetAttribute("id");
                l.Name=xe.GetAttribute("name");
                //使用unlock属性来标识当前关卡是否解锁
                if(xe.GetAttribute("unlock")=="1"){
                    l.UnLock=true;
                }else{
                    l.UnLock=false;
                }
    
                levels.Add(l);
            }
    
            return levels;
        }
    
        /// <summary>
        /// 设置某一关卡的状态
        /// </summary>
        /// <param name="name">关卡名称</param>
        /// <param name="locked">是否解锁</param>
        public static void SetLevels(string name,bool unlock)
        {
            //创建Xml对象
            XmlDocument xmlDoc = new XmlDocument();
            string filePath=Application.persistentDataPath + "/levels.xml";
            xmlDoc.Load(filePath);
            XmlElement root = xmlDoc.DocumentElement;
            XmlNodeList levelsNode = root.SelectNodes("/levels/level");
            foreach (XmlElement xe in levelsNode) 
            {
                //根据名称找到对应的关卡
                if(xe.GetAttribute("name")==name)
                {
                    //根据unlock重新为关卡赋值
                    if(unlock){
                        xe.SetAttribute("unlock","1");
                    }else{
                        xe.SetAttribute("unlock","0");
                    }
                }
            }
    
            //保存文件
            xmlDoc.Save (filePath);
        }
    }

    这里我们首先将关卡配置文件levels.xml放置在Resources目录下,这是因为我们可以使用Resources.Load()这种方式来加载本地资源,这种方式对于Unity3D来说有着得天独厚的优势:
    * 它使用相对于Resources目录的相对路径,所以在使用的时候不用考虑是相对路径还是绝对路径的问题
    * 它使用名称来查找一个本地资源,所以在使用的时候不用考虑扩展名和文件格式的问题
    * 它可以是Unity3D支持的任意类型,从贴图到预制体再到文本文件等等,可以和Unity3D的API完美地结合

    说了这么多它的优点,我们自然要痛心疾首地说说它的缺点,它的缺点是什么呢?那就是不支持写入操作,这当然不能责怪Unity3D,因为当Unity3D导出游戏的时候会将Rsources目录下的内容压缩后再导出,我们当然不能要求在一个压缩后的文件里支持写入操作啦,所以我们是时候来总结下Unity3D中资源读写的常见方案了,那么Unity3D中常见的资源读写方案由哪些呢?

    1、Resources.Load:只读,当我们的资源不需要更新且对本地存储无容量要求的时候可以采用这种方式
    2、AssetBundle:只读,当我们的资源需要更新且对本地存储有容量要求的时候可以采用这种方式
    3、WWW:只读,WWW支持http协议和file协议,因此可以WWW来加载一个网络资源或者本地资源
    4、PlayerPrefs:可读可写,Unity3D提供的一种的简单的键-值型存储结构,可以用来读写float、int和string三种简单的数据类型,是一种较为松散的数据存储方案
    5、序列化和反序列化:可读可写,可以使用Protobuf、序列化为Xml、二进制或者JSON等形式实现资源读写。
    6、数据库:可读可写,可以使用MySQL或者SQLite等数据库对数据进行存储实现资源读写。

    好了,在了解了Unity3D中资源读写的常见方案后,我们接下来来讨论下Unity3D中的路径问题:
    1、Application.dataPath:这个路径是我们经常使用的一个路径,可是我们真的了解这个路径吗?我看这里要打个大大的问号,为什么这么说呢?因为这个路径在不同的平台下是不一样的,从官方API文档中可以了解到这个值依赖于运行的平台:
    * Unity 编辑器:<工程文件夹的路径>/Assets
    * Mac:<到播放器应用的路径>/Contents
    * IOS: <到播放器应用的路径>/

    4、编写入口文件

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine.UI;
    using System.Xml.Serialization;
    
    public class Main : MonoBehaviour 
    {
        //关卡列表
        private List<Level> m_levels;
    
        void Start () 
        {
            //获取关卡
            m_levels = LevelSystem.LoadLevels ();
            //动态生成关卡
            foreach (Level l in m_levels) 
            {
                GameObject prefab=(GameObject)Instantiate((Resources.Load("Level") as GameObject));
                //数据绑定
                DataBind(prefab,l);
                //设置父物体
                prefab.transform.SetParent(GameObject.Find("UIRoot/Background/LevelPanel").transform);
                prefab.transform.localPosition=new Vector3(0,0,0);
                prefab.transform.localScale=new Vector3(1,1,1);
                //将关卡信息传给关卡
                prefab.GetComponent<LevelEvent>().level=l;
                prefab.name="Level";
            }
    
            //人为解锁第二个关卡
            //在实际游戏中玩家需要满足一定条件方可解锁关卡
            //此处仅作为演示
            LevelSystem.SetLevels ("level1", true);
    
        }
    
    
        /// <summary>
        /// 数据绑定
        /// </summary>
        void DataBind(GameObject go,Level level)
        {
            //为关卡绑定关卡名称
            go.transform.Find("LevelName").GetComponent<Text>().text=level.Name;
            //为关卡绑定关卡图片
            Texture2D tex2D;
            if(level.UnLock){
                tex2D=Resources.Load("nolocked") as Texture2D;
            }else{
                tex2D=Resources.Load("locked") as Texture2D;
            }
            Sprite sprite=Sprite.Create(tex2D,new Rect(0,0,tex2D.width,tex2D.height),new Vector2(0.5F,0.5F));
            go.transform.GetComponent<Image>().sprite=sprite;
        }
    }

    在这段脚本中,我们首先加载了关卡信息,然后将关卡信息和界面元素实现绑定,从而实现一个简单的关卡选择界面,并人为地解锁了第二个关卡。好吧,如果这是一个正式游戏的配置关卡配置文件,相信大家都知道怎么免费玩解锁的关卡了吧,哈哈!当然,我不推荐大家这样做,因为作为一个程序员,当你全身心地投入到一个项目中的时候,你就会明白完成一款软件或者游戏需要投入多少精力,所以大家尽量还是不要想破解或者盗版这些这些事情,毕竟作为开发者可能他的出发点是想做出来一个让大家都喜欢的产品,可是更现实的问题是开发者一样要生活,所以请善待他们吧。好了,言归正传,这里的UI都是基于UGUI实现的,不要问我为什么不用NGUI,因为我就是喜欢UGUI!我们知道我们需要为每个关卡的UI元素绑定一个响应的事件,因此我们需要为其编写一个LevelEvent的脚本:

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    public class LevelEvent : MonoBehaviour
    {
        //当前关卡
        public Level level;
    
        public void OnClick()
        {
            if(level.UnLock){
                //假设关卡的名称即为对应场景的名称
                //Application.LoadLevel(level.Name);
                Debug.Log ("当前选择的关卡是:"+level.Name);
            }else{
                Debug.Log ("抱歉!当前关卡尚未解锁!");
            }
    
        }
    
    }

    记得在本文开始的时候,博主提到了一个假设,就是关卡的名称和其对应的游戏名称一致的假设,相信到此处大家都知道为什么了吧!为了让每个关卡的UI元素知道自己对应于哪个关卡,我们设置了一个level变量,这个变量的值在加载关卡的时候已经完成了初始化,所以此时我们可以在这里知道每个关卡的具体信息,从而完成事件的响应。好了,今天的内容就是这样了,我们来看看最终的效果吧!

    DEMO1

    DEMO2

    可以注意到在第二次打开游戏后,第二个关卡已经解锁了,说明我们在最开始设计的两个目标都达到了,那么内容就是这样子啦,如果大家有什么好的想法或者建议,欢迎在文章后面给我留言,谢谢大家!

    2015年12月1日更新:
    最近有朋友反映需要我给出IOHelper这个类的实现,可是事实上这个类仅仅是对System.IO这个命名空间下的相关方法进行了简单的封装,我一直觉得不管学习什么技术,我们都要有一个完整的系统性的学习路线。虽然Unity3D入门十分简单,可说到底它本质上仍然是C#的技术范畴,所以我们不能把眼光局限在Unity3D这个引擎和它丰富的插件上面,学插件、使用插件不过是邯郸学步,真正能让你成长的却是自己掌握的知识。我知道我说这些,大部分人都不会看,因为你觉得来看我博客是给我面子,直接抄你博客里的代码是看得起你。呵呵,我写这个博客的目的可不是为了给懒人提供代码库,懒人真正的代码库是Github。罢了,给这些懒人给出源代码吧!

    
    /*
     * Unity3D脚本(C#)
     * Author:
     * Date:
     */
    
    using UnityEngine;
    using System.Collections;
    using System.IO;
    
    public static class IOUntility
    {
        /// <summary>
        /// 创建文件夹    
        /// </summary>
        /// <param name="path">文件夹路径</param>
        public static void CreateFolder(string path)
        {
            if(!Directory.Exists(path)){
                Directory.CreateDirectory(path);
            }
        }
    
        /// <summary>
        /// 创建文件
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <param name="content">文件内容</param>
        public static void CreateFile(string filePath,string content)
        {
            //文件流
            StreamWriter writer;
            //判断文件目录是否存在
            //不存在则先创建目录
            Debug.Log (filePath);
            string folder = filePath.Substring (0, filePath.LastIndexOf ("//"));
            CreateFolder (folder);
            //如果文件不存在则创建,存在则追加内容
            FileInfo file=new FileInfo(filePath);
            if(!file.Exists){
                writer=file.CreateText();
            }else{
                file.Delete();
                writer=file.CreateText();
            }
    
            //写入内容
            writer.Write(content);
            writer.Close();
            writer.Dispose();
        }
    
        /// <summary>
        /// 判断文件是否存在
        /// </summary>
        /// <param name="path">文件路径</param>
        public static bool isFileExists(string path)
        {
            FileInfo file=new FileInfo(path);
            return file.Exists;
        }
    
        public static void DeleteFile(string fileName)
        {
            if(!File.Exists(fileName)) return;
            File.Delete(fileName);
        }
    }
    
    展开全文
  • Unity中如何实现关卡制作(C#)

    千次阅读 2017-08-02 11:16:50
    Unity的脚本编辑中,可以使用命令Application.LoadLevel(string);... 当需要选择关卡的时候,去选择加载不同的场景就可以实现关卡功能。当然如果游戏占用内存高的话,就需要自动生成关卡的算法。

           在Unity的脚本编辑中,可以使用命令Application.LoadLevel(string);来进行重新加载场景,其中string参数为需要加载的场景名。

           当需要选择关卡的时候,去选择加载不同的场景就可以实现关卡功能。当然如果游戏占用内存高的话,就需要自动生成关卡的算法。

    展开全文
  • 用于Unity 游戏的关卡选择 集成度非常高,非常方便使用 而且还有很别致的动画!
  • Unity关于选关界面的制作

    千次阅读 2019-09-30 10:33:42
    通过调节组件中的属性可以管理子物体的大小与间距(这里指关卡按钮) 创建关卡按钮在Content下; 2、创建LevelItem脚本,挂载到每个Button上; 添加引用: 代码: public class LevelItem : MonoBehaviour { ///...
  • unity自动生成关卡 我们的关卡由充当图块的不同块组成。 硬编码所有职位不仅对我本人,开发人员,而且对游戏设计师而言都是一种痛苦。 我需要使设计和测试水平足够快的东西。 并独立于开发人员。 因此,游戏设计师...
  • Unity5的关卡切换

    千次阅读 2017-11-17 14:21:45
    一、Unity关卡 Unity 使用过程中关卡加载和卸载是大多数三维引擎都要提供的基本功能。  因为关卡切换在游戏中非常常用。  在之前的版本中Unity关卡切换使用的是: Application.loadedLevel()11 看看...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 可很好的创建游戏关卡,节省游戏创作时创作关卡的时间
  • 比如《Candy Crush》、《Angry Birds》、《P V Z》、《小鳄鱼顽皮爱洗澡》、《Tiny Thief》等经典休闲游戏,鉴于很多圈内人士预测2014年是手游爆发年,且重点在ARPG类型,似乎会冒出很多横版过关或者全3D的过关动作...
  • 第一部分介绍了如何设置Unity3D ,第二部分介绍了如何 使用C#控制Unity3D 。 在本系列的最后一篇文章中,我们将深入研究如何使用Unity3D将代码实际制作成一个简单的游戏。 让我们开始吧 让我们建立一...
  • 当某一关通过以后 则再次进入关卡选择界面时 相应的图标显示激活状态 否则为未激活状态 如愤怒的小鸟 这里使用unity3d内置GUI系统 绘制按钮之前我们需要知道哪些关卡是已经通过了的 在unity3d中可以使用...
  • 1.将场景导出为素材文件 [code="javascript"] //指定将要导出的场景 @MenuItem("Assets/ExportScene"...选择要导出的场景文件","","unity"); ...
  • 介绍: 编辑器导出的数据为2进制数据,并经过gzip压缩,体积非常小。 ...将游戏中的道具等做成预制体,将MSBaseObject拖到预制体上并保存。...关卡编辑器只能识别挂有MSBaseObject脚本的物体。 具有特殊属性的
  • Unity3D中构建3D模拟

    2020-06-16 02:53:16
    第一部分介绍了如何设置Unity3D ,第二部分介绍了如何 使用C#控制Unity3D 。 在本系列的最后一篇文章中,我们将深入研究如何使用Unity3D将代码实际制作成一个简单的游戏。 让我们开始吧 让我们建立一些关卡,...
  • 原文地址:http://www.rocket5studios.com/tutorials/make-a-2d-game-with-unity3d-using-only-free-tools-part-2/ 原版翻译,转载请注明出处:http://blog.csdn.net/ariel7321/article/details/7771638 ...
  • Unity3d不久之前正式发布了Unity3d 2017.1, 这个版本的发布也宣告了Unity3d正式告别了5.x时代,并且开始已年份直接命名,开启了新的纪元。那么Unity3d 2017相较上一版本到底有哪些改进呢?这介绍这些改进之前先放出...
1 2 3 4 5 ... 20
收藏数 3,020
精华内容 1,208
关键字:

unity3d 关卡选择