unity学习笔记

一、游戏地图初始化

新建一个游戏物体命名为MapCreation,作为地图的创造器。

首先要去示例化我的预制体,将所以的预制体都要拿到,让后将其的克隆体实例化在地图上。

所以呢我们就需要一个用来装饰地图所需物体的一个数组。

    用来装饰初始化地图所需物体的数组
    0.老家1.墙2.障碍3.出生效果4.河流5.草6.空气墙
    public GameObject[ ] item;

然后按照上面的顺序进行预制体的关联

开始在脚本里面实例化,由于实例化物体要优先于所以物体,因此要在Awake方法里面实例化。

先实例化老家并在周围实例化墙将其围住

      //实例化老家
        Instantiate(item[0],new Vector3(0,-8,0),Quaternion.identity);
        //用墙把老家围起来
        Instantiate(item[1],new Vector3(-1,-8,0),Quaternion.identity); 
        Instantiate(item[1],new Vector3(1,-8,0),Quaternion.identity);
        for (int i = -1; i < 2; i++)
        {
           Instantiate(item[1],new Vector3(i,-7,0),Quaternion.identity);
        }

其中的Quaternion.identity,代表实例化物体没有旋转。运行效果如下:

每次实例化出来的物体像将其都作为MapCreation的子物体,因此单独写一下方法来用于实例化,用于简化代码。

    private void CreatItem(GameObject CreateGameObject,Vector3 createPosition,Quaternion quaternion)
    {
        GameObject itemGo = Instantiate(CreateGameObject, createPosition, quaternion);
        //设置当前的游戏物体作为父物体
        itemGo.transform.SetParent(gameObject.transform);
    }

每次设置预制体时就调用这个方法,那么生成的预制体就会把当前物体作为父物体。

再将外围的墙实例化出来,防止敌人跑出地图。

 //实例化外围墙
        for (int i = -11; i < 12; i++)
        {
            CreatItem(item[2],new Vector3(i,9,0),Quaternion.identity);
        }
        for (int i = -11; i < 12; i++)
        {
            CreatItem(item[2], new Vector3(i,-9,0),Quaternion.identity);
        }
        for (int i = -8; i < 9; i++)
        {
            CreatItem(item[2], new Vector3(-11, i,0),Quaternion.identity);
        }
        for (int i = -8; i < 9; i ++ ){
            CreatItem(item[2], new Vector3(11, i, 0),Quaternion.identity);
        }

运行效果如下:

对于其他物体,每次实例化的地图是不一样,要让其物体实例化的位置是随机的而不是固定位置,因此就需要一些产生随机位置的方法,每次实例化一个物体都要告诉unity该位置是被使用过的,避免同时在一个地方产生两个物体。因此我们需要一个变量,来存储我们使用过的位置。

//已经有东西的位置列表
private List<Vector3> itemPositionList = new List<Vector3>();

然后再CreatItem方法中添加一行代码,每次调用这个方法时都将位置存储进去。

itemPositionList.Add(createPosition);

后面每次产生随机位置就遍历一下这个List,如果不存在相同的就表示这个位置可以使用,使用后将这个位置添加到这个集合中。

写一个判断位置是否存在集合的方法。

 private bool HasThePosition(Vector3 createPs)
    {
        for(int i = 0; i< itemPositionList.Count; i++)
        {
            if(createPs == itemPositionList[i])
            {
                return true;
            }
        }
        return false;
    }

不存在返回false,存在返回true。

下面写产生随机位置方法,并判断是否可用。

    private Vector3 CreateRandomPosition()
    {
        while (true)
        {
            Vector3 createPosition = new Vector3(Random.Range(-9, 10), Random.Range(-7, 8), 0);
            if (!HasThePosition(createPosition))
            {
                return createPosition;
            }
        }
    }

将这两个方法写好之后方便创建其他 地图物体时调用。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-25 12:58:02       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-25 12:58:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-25 12:58:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-25 12:58:02       18 阅读

热门阅读

  1. vscode windows下 tasks.json 和 launch.json

    2023-12-25 12:58:02       36 阅读
  2. SQL分类

    SQL分类

    2023-12-25 12:58:02      30 阅读
  3. mysql全局事务变量GTID

    2023-12-25 12:58:02       23 阅读
  4. leetcode 131. 分割回文串

    2023-12-25 12:58:02       36 阅读
  5. [网络安全] NTFS权限

    2023-12-25 12:58:02       42 阅读
  6. 《PCI Express体系结构导读》随记 —— 前言

    2023-12-25 12:58:02       32 阅读
  7. Mybatis使用详解

    2023-12-25 12:58:02       40 阅读
  8. Linux 文件管理命令----pwd 命令

    2023-12-25 12:58:02       38 阅读
  9. C/C++编译问题

    2023-12-25 12:58:02       25 阅读
  10. (c语言)素数的判断方法

    2023-12-25 12:58:02       45 阅读
  11. 力扣labuladong——一刷day79

    2023-12-25 12:58:02       36 阅读