zoukankan      html  css  js  c++  java
  • [游戏开发-学习笔记]菜鸟慢慢飞(二)-迷宫

    简介:练手Demo,《走出迷宫》,文章主要说说如何创建迷宫。

    学习Unity3D有一段时间了,自己想了一个项目来练手手。然后就有了这篇。

    一.固定的格数,开局后随机生成。

    说明:这个迷宫10*10,开始后随机生成,四周留下一个空做出口。

    先说如何实现:

    • 主要准备了三个Prefab:横墙,竖墙,柱子,墙高度是10,宽度是10,厚度是1,柱子高度是10.宽度和厚度都是10.

    手动按照10*10排列(参考下图)

    • 脚本 
    #region
    //初始化游戏
    #endregion
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class StartSet : MonoBehaviour
    {
        public GameObject[] aroundWalls;
        public GameObject[] walls;
        public int maxi=2;
        // Use this for initialization
        void Start()
        {
            //出口
            int i=Random.Range(1, aroundWalls.Length);
            aroundWalls[i].SetActive(false);
            //生成迷宫
            for (int j = 0; j < walls.Length; j++)
            {
                int x = Random.Range(0, maxi);
                if (x==0)
                {
                    walls[j].SetActive(false);
                }
                else
                {
                    walls[j].SetActive(true);
                }
            }
    
        }
    }
    View Code
    • 把四周的墙拖给Around Walls,里面的墙拖给Walls。

    下面是部分图:

    • 测试

     下面,把脚本StartSet挂到Camera上,可以点开始游戏看效果了。
     下面几个图是我这里的运行效果:

    小结:

    1.  竖墙/横墙。其实是一样的,只是角度相差90。我这里为了脚本代码方便就做了两个。
    2.  这样的迷宫没有路径可言,完全是随机的。不一定走得到出口。我的想法是可以让角色带有“击穿墙”类似的功能。
    3.  public int maxi=2 如果调大这个数,可以让迷宫难度升级。我最初的想法是制定 maxi=1,实际上却不是。

     二. 随机大小迷宫

    参照上面的内容我继续想,能不能做成随机大小的迷宫。
    比如,我输入10,生成一个10*10的迷宫给我,输入25,生成一个25*25的迷宫给我。
    延续上面的思路,生成“格子”,再用上面的脚本修改成迷宫。

    1. 先看看效果:分别是13*13,27*27,50*50 

       2. 如何实现         

    • 还是三个Prefab,横墙,竖墙,柱子。这里的大小比上面的大了10倍,偷懒少算点小数点^.^。
    • 脚本:
       1 using UnityEngine;
       2 
       3 /// <summary>
       4 /// 初始化迷宫
       5 /// </summary>
       6 public class InitializeMaze : MonoBehaviour
       7 {
       8     public GameObject WallH;
       9     public GameObject WallV;
      10     public GameObject pillar;
      11     public int sidenumber = 100;
      12 
      13     // Use this for initialization
      14     void Awake()
      15     {
      16         int sidexy = sidenumber * 11;      
      17 
      18         for (int i = 0; i < (sidenumber + 1); i++)
      19         {
      20             for (int j = 0; j < (sidenumber + 1); j++)
      21             {               
      22                 int pillarx = i * 110;
      23                 int wallHx = 55 + 110 * i;
      24                 int pillarz = j * 110;
      25                 int wallVz = 55 + 110 * j;
      26 
      27                 if (i== sidenumber && j== sidenumber)
      28                 {
      29                     Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity);
      30                     continue;
      31                 }
      32                 if (i == sidenumber)
      33                 {
      34                     Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity);
      35                     Instantiate(WallV, new Vector3(pillarx, 50, wallVz), Quaternion.identity);
      36                     continue ;
      37                 }
      38                 if (j== sidenumber)
      39                 {
      40                     Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity);
      41                     Instantiate(WallH, new Vector3(wallHx, 50, pillarz), Quaternion.identity);                              
      42                 }
      43                 else
      44                 {
      45                     Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity);
      46                     Instantiate(WallH, new Vector3(wallHx, 50, pillarz), Quaternion.identity);
      47                     Instantiate(WallV, new Vector3(pillarx, 50, wallVz), Quaternion.identity);
      48                 }
      49             }
      50         }
      51     }
      52 }
      View Code

      3.测试

     把三个Prefab拖到脚本对应位置,在Sidernumber中输入边。开始游戏就可以得到网格了。
     得到网格后,第一个例子中的StartSet代码中,添加一段查找GameObject的代码,就能得到想要的迷宫了(可以试试,代码就不贴了)

    总结:
    1. 挺有意思的是生成网格的时候,很绕人,需要去掉边边角角。睡觉前灵感突然就来了,就想通了,挺有意思的。
    2. Quaternion这个API看不懂,先放到学习清单中,如果会这个,应该就可以横墙,竖墙只用一个。


    水平有限,欢迎指教:workhai@outlook.com
    许愿:希望自己能找到一份全职游戏开发的工作。

  • 相关阅读:
    Spring
    华为OJ题目:扑克牌大小
    冒泡排序算法总结
    华为OJ题目:刷题
    求立方根
    假硬币问题求解
    SQL in Qt (一)
    Qt3D教程
    (Qt 翻译) QGLAbstractScene
    (Qt 翻译) QGLSceneNode
  • 原文地址:https://www.cnblogs.com/workhai/p/6230290.html
Copyright © 2011-2022 走看看