unity学习笔记

发布时间:2023年12月25日

一、游戏地图初始化

新建一个游戏物体命名为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;
? ? ? ? ? ? }
? ? ? ? }
? ? }

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

文章来源:https://blog.csdn.net/2301_79022588/article/details/135187430
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。