一、游戏地图初始化
新建一个游戏物体命名为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
然后再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;
}
}
}
将这两个方法写好之后方便创建其他 地图物体时调用。