unity学习笔记

一、游戏地图初始化

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

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

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

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

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

unity学习笔记_第1张图片

开始在脚本里面实例化,由于实例化物体要优先于所以物体,因此要在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);
    }

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

unity学习笔记_第2张图片

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

 //实例化外围墙
        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学习笔记_第3张图片

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

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

然后再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;
            }
        }
    }

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

你可能感兴趣的:(unity,学习,笔记)