目录
ObjectPool.cs
之前没有做记录,现在开始记一下进展
目前写完了对象池,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 创建对象池、
/// 因为没有对象池的话,我们一直生成平台会很占内存
/// 因为我们后面的平台是会掉落的,掉落了我们便将其隐藏起来
/// 然后我们默认把我他们放进List里面隐藏掉
/// 需要的时候我们再将其调取出来
/// List里面没有的话我们再生成,生成完了再放进List里面
/// </summary>
public class ObjectPool : MonoBehaviour {
/// 我们将ObjectPool携程单例模式
/// 在Awake时进行赋值,见(1)
public static ObjectPool Instance;
public int initSpawnCount = 5;
private List<GameObject> normalPlatformList = new List<GameObject>();
private List<GameObject> commonPlatformList = new List<GameObject>();
private List<GameObject> grassPlatformList = new List<GameObject>();
private List<GameObject> winterPlatformList = new List<GameObject>();
private List<GameObject> spikePlatformLeftList = new List<GameObject>();
private List<GameObject> spikePlatformRightList = new List<GameObject>();
private ManageVars vars;
private void Awake()
{
Instance = this;//(1)
vars = ManageVars.GetManageVars();
Init();
}
/// <summary>
/// 初始化方法
/// 使用for循环给各个List进行默认填充
/// 我们得获得ManagerVar身上的东西
/// </summary>
private void Init()
{
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.normalPlatformPre, ref normalPlatformList);
}
///
/// commonPlatform有好几种,两层循环保证每一种循环都有5个
///
for (int i = 0; i < initSpawnCount; i++)
{
for (int j = 0; j < vars.commonPlatformGroup.Count; j++)
{
InstantiateObject(vars.commonPlatformGroup[j],ref commonPlatformList);
}
}
for (int i = 0; i < initSpawnCount; i++)
{
for (int j = 0; j < vars.grassPlatformGroup .Count; j++)
{
InstantiateObject(vars.grassPlatformGroup [j], ref commonPlatformList);
}
}
for (int i = 0; i < initSpawnCount; i++)
{
for (int j = 0; j < vars.winterPlatformGroup .Count; j++)
{
InstantiateObject(vars.winterPlatformGroup[j], ref commonPlatformList);
}
}
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.spikePlatformLeft, ref spikePlatformLeftList);
}
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.spikePlatformRight, ref spikePlatformRightList);
}
}
/// <summary>
/// 需要修改List内容的时候,用ref关键字
/// 统一刚开始隐藏,需要时变成true
/// </summary>
private GameObject InstantiateObject(GameObject prefab,ref List<GameObject> addlist)
{
GameObject go = Instantiate(prefab, transform);
go.SetActive(false);
addlist.Add(go);
return go;//用于统一化
}
/// 获取方法,需要对每一个List一个获得的方法
/// 如果所需要的没有在场景中显示,就将其Return出去
/// 获得单个平台
public GameObject GetNormalPlatform()
{
for (int i = 0; i < normalPlatformList.Count; i++)
{
if (normalPlatformList[i].activeInHierarchy==false)
{
return normalPlatformList[i];
}
}
///执行到这里就说明对象池中没有物体了,我们就给它生成一个物体,
///生成之后还需要将其加进去
return InstantiateObject(vars.normalPlatformPre, ref normalPlatformList);
}
/// 获得通用组合平台
public GameObject GetCommonPlatformGroup()
{
for (int i = 0; i < commonPlatformList.Count; i++)
{
if (commonPlatformList[i].activeInHierarchy == false)
{
return commonPlatformList[i];
}
}
///执行到这里就说明对象池中没有物体了,我们就给它生成一个物体,
///生成之后还需要将其加进去
///因为这里是Group所以生成一个随机值
int ran = Random.Range(0, vars.commonPlatformGroup.Count);
return InstantiateObject(vars.commonPlatformGroup[ran], ref commonPlatformList);
}
/// 获得草地组合平台
public GameObject GetGrassPlatformGroup()
{
for (int i = 0; i < grassPlatformList.Count; i++)
{
if (grassPlatformList[i].activeInHierarchy == false)
{
return grassPlatformList[i];
}
}
///执行到这里就说明对象池中没有物体了,我们就给它生成一个物体,
///生成之后还需要将其加进去
///因为这里是Group所以生成一个随机值
int ran = Random.Range(0, vars.grassPlatformGroup.Count);
return InstantiateObject(vars.grassPlatformGroup[ran], ref grassPlatformList);
}
/// 获得冬季组合平台
public GameObject GetWinterPlatformGroup()
{
for (int i = 0; i < winterPlatformList.Count; i++)
{
if (winterPlatformList[i].activeInHierarchy == false)
{
return winterPlatformList[i];
}
}
///执行到这里就说明对象池中没有物体了,我们就给它生成一个物体,
///生成之后还需要将其加进去
///因为这里是Group所以生成一个随机值
int ran = Random.Range(0, vars.winterPlatformGroup.Count);
return InstantiateObject(vars.winterPlatformGroup[ran], ref winterPlatformList);
}
/// 获得左边钉子组合平台
public GameObject GetSpikerPlatformLeft()
{
for (int i = 0; i < spikePlatformLeftList.Count; i++)
{
if (spikePlatformLeftList[i].activeInHierarchy == false)
{
return spikePlatformLeftList[i];
}
}
///执行到这里就说明对象池中没有物体了,我们就给它生成一个物体,
///生成之后还需要将其加进去
return InstantiateObject(vars.spikePlatformLeft, ref spikePlatformLeftList);
}
/// 获得左边钉子组合平台
public GameObject GetSpikerPlatformRight()
{
for (int i = 0; i < spikePlatformRightList.Count; i++)
{
if (spikePlatformRightList[i].activeInHierarchy == false)
{
return spikePlatformRightList[i];
}
}
///执行到这里就说明对象池中没有物体了,我们就给它生成一个物体,
///生成之后还需要将其加进去
return InstantiateObject(vars.spikePlatformRight, ref spikePlatformRightList);
}
}
之前的PlatformSpawner.cs
要回到PlatformSpawner里将所有实例化的方法都更改一下
现在我把之前的代码记录一下,方便以后万一需要的时候可参考
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum PlatformGroupType
{
Grass,
Winter
}
public class PlatformSpawner : MonoBehaviour {
public Vector3 startSpwawnPos;
/// <summary>
/// 生成平台数量
/// </summary>
private int spawnPlatformCount;
private ManageVars vars;
/// <summary>
/// 平台的生成位置
/// </summary>
private Vector3 platformSpawnPosition;
/// <summary>
/// 是否朝左边生成,反之朝右
/// </summary>
private bool isLeftSpawn = false;
/// <summary>
/// 选好的平台图用此接收
/// </summary>
private Sprite selectPlatformSprite;
/// <summary>
/// 组合平台类型
/// </summary>
private PlatformGroupType groupType;
/// <summary>
/// 生成钉子组合平台的方向是否在左边
/// </summary>
private bool spikeSpawnLeft = false;
/// <summary>
/// 钉子方向平台的位置
/// </summary>
private Vector3 spikeDirPlatformPos;
/// <summary>
/// 生成钉子平台之后需要在钉子方向生成的平台数量
/// </summary>
private int afterSpawnSpikeSpawnCount;
/// <summary>
/// 生成钉子平台时,也需要生成一下我们原先的这个平台
/// 所以得生成两个,需要一个bool值,确认路径DecidePath
/// </summary>
private bool isSpawnSpike;
private void Awake()
{
EventCenter.AddListener(EventDefine.DecidePath,DecidePath);
vars = ManageVars.GetManageVars();
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.DecidePath, DecidePath);
}
private void Start()
{
RandomPlatformTheme();
platformSpawnPosition=startSpwawnPos;
//vars = ManageVars.GetManageVars();
//在RandomPlatformTheme(); 中调用vars,vars这里还没有赋值
//拿到Awake()中去
for (int i = 0; i < 5; i++)
{
spawnPlatformCount = 5;
DecidePath();
}
//生成人物
GameObject go = Instantiate(vars.charactorPre);
//设置位置是transform
go.transform.position = new Vector3(0, -1.87f, 0);
}
/// <summary>
/// 随即平台主题,随机之后选择组合平台
/// 冬季主题选择冬季组合平台
/// 其他主体选择草地主题平台
/// </summary>
private void RandomPlatformTheme()
{
int ran = Random.Range(0, vars.platformThemeSpriteList.Count);
selectPlatformSprite = vars.platformThemeSpriteList[ran];
if (ran==2)
{
groupType = PlatformGroupType.Winter;
}
else
{
groupType = PlatformGroupType.Grass;
}
}
/// <summary>
/// 确定路径(将其做成一个监听,给它一个事件码)
/// 在PlayerController里面点击跳跃之后广播事件码进行调用
/// </summary>
private void DecidePath()
{
if (isSpawnSpike)
{
AfterSpawnSpike();
return;
}
if (spawnPlatformCount>0)
{
spawnPlatformCount--;
SpawnPlatform();
}
else//反转生成方向
{
isLeftSpawn = !isLeftSpawn;
spawnPlatformCount = Random.Range(1, 4);
SpawnPlatform();
}
}
/// <summary>
/// 生成平台
/// spawnPlatformCount ==0代表一波生成平台的最后一个
/// 最后一个让其生成组合平台
/// </summary>
private void SpawnPlatform()
{
int ranObstacleDir = Random.Range(0, 2);
//生成单个平台
if (spawnPlatformCount>=1)
{
SpawnNormalPlatform(ranObstacleDir);
}
//生成组合平台
else if (spawnPlatformCount ==0)
{
int ran = Random.Range(0,3);
//生成通用组合平台
if (ran==0)
{
SpawnCommonPlatformGroup(ranObstacleDir);
}
//生成主题组合平台
//要选择是哪一个主题
else if (ran==1)
{
switch (groupType)
{
case PlatformGroupType.Grass:
SpawnGrassPlatformGroup(ranObstacleDir);
break;
case PlatformGroupType.Winter:
SpawnWinterPlatformGroup(ranObstacleDir);
break;
default:
break;
}
}
//生成钉子组合平台
else
{
int value = -1;
if (isLeftSpawn)
{
value = 0;//生成右边方向的钉子
}
else
{
value = 1;//生成左边方向的钉子
}
SpawnSpikePlatform(value);
afterSpawnSpikeSpawnCount = 4;
isSpawnSpike = true;
//拿到了钉子方向的初始生成位置,还需要钉子方向生成几个平台,所以还需要一个变量
if (spikeSpawnLeft)//钉子在左边
{
spikeDirPlatformPos = new Vector3(platformSpawnPosition.x - 1.65f,
platformSpawnPosition.y + vars.nextYPos, 0);
}
else
{
spikeDirPlatformPos = new Vector3(platformSpawnPosition.x + 1.65f,
platformSpawnPosition.y + vars.nextYPos, 0);
}
}
}
if (isLeftSpawn)//如果向左生成
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x - vars.nextXPos,
platformSpawnPosition.y + vars.nextXPos, 0);
}
else//如果向右生成
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x + vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
}
/// <summary>
/// 生成普通平台(单个)
/// 随机到的图要传给我们要生成的图
/// 在这里生成了一个普通平台
/// 我们这里要把图传给普通平台
/// 让其知道该更换图了
/// (创建PlatformSprite脚本实现这一功能)
/// </summary>
private void SpawnNormalPlatform(int ranObstacleDir)
{
//实例化平台
GameObject go = Instantiate(vars.normalPlatformPre,transform);
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
}
/// <summary>
/// 生成通用组合平台
/// 要实例化的是vars里面的commonPlatformGroup
/// Instantiate(vars.commonPlatformGroup[ran][要实例化的东西],transform[父物体])
/// </summary>
private void SpawnCommonPlatformGroup(int ranObstacleDir)
{
int ran = Random.Range(0,vars.commonPlatformGroup.Count);
//实例化平台
GameObject go = Instantiate(vars.commonPlatformGroup[ran],transform);
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
}
/// <summary>
/// 生成草地组合平台
/// </summary>
private void SpawnGrassPlatformGroup(int ranObstacleDir)
{
int ran = Random.Range(0, vars.grassPlatformGroup.Count);
//实例化平台
GameObject go = Instantiate(vars.grassPlatformGroup[ran], transform);
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
}
/// <summary>
/// 生成冬季组合平台
/// </summary>
private void SpawnWinterPlatformGroup(int ranObstacleDir)
{
int ran = Random.Range(0, vars.winterPlatformGroup.Count);
//实例化平台
GameObject go = Instantiate(vars.winterPlatformGroup[ran], transform);
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
}
/// <summary>
/// 生成钉子组合平台
/// 需要传递进来一个int值,判断向左还是向右
/// </summary>
private void SpawnSpikePlatform(int dir)
{
GameObject temp = null;
if (dir==0)
{
spikeSpawnLeft = false;
//实例化平台
temp = Instantiate(vars.spikePlatformRight, transform);
}
else
{
spikeSpawnLeft = true;
//实例化平台
temp = Instantiate(vars.spikePlatformLeft, transform);
}
//实例化平台后,要对其位置进行赋值
temp.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite,dir);
}
/// <summary>
/// 生成钉子平台之后需要生成的平台
/// 包括钉子的方向,也包括原来的方向
/// 记得要把预制体先实例化出来
/// </summary>
private void AfterSpawnSpike()
{
print("进入AfterSpawnSpike()方法");
if (afterSpawnSpikeSpawnCount>0)
{
afterSpawnSpikeSpawnCount--;
for (int i = 0; i < 2; i++)
{
GameObject temp = Instantiate(vars.normalPlatformPre, transform);
if (i==0)//生成原来方向的平台
{
temp.transform.position = platformSpawnPosition;
//如果钉子在左边,我们原先路径就在右边
if (spikeSpawnLeft)
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x + vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
else
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x - vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
}
else//生成钉子方向的平台,原先路径就在左边
{
temp.transform.position = spikeDirPlatformPos;
//如果钉子在右边,生成钉子方向的平台就在右边
if (spikeSpawnLeft)
{
spikeDirPlatformPos = new Vector3(spikeDirPlatformPos.x - vars.nextXPos,
spikeDirPlatformPos.y + vars.nextYPos, 0);
}
else
{
spikeDirPlatformPos = new Vector3(spikeDirPlatformPos.x + vars.nextXPos,
spikeDirPlatformPos.y + vars.nextYPos, 0);
}
}
//普通平台是没有障碍物的
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite, 1);
}
}
else
{
isSpawnSpike = false;
DecidePath();
}
}
}
普通平台修改
/// <summary>
/// 生成普通平台(单个)
/// 随机到的图要传给我们要生成的图
/// 在这里生成了一个普通平台
/// 我们这里要把图传给普通平台
/// 让其知道该更换图了
/// (创建PlatformSprite脚本实现这一功能)
/// </summary>
private void SpawnNormalPlatform(int ranObstacleDir)
{
//实例化平台
GameObject go = Instantiate(vars.normalPlatformPre,transform);
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
}
这一段里面的
GameObject go = Instantiate(vars.normalPlatformPre,transform);
改成引用对象池中刚写的方法:
GameObject go = ObjectPool.Instance.GetNormalPlatform();
还要在最后将go显示出来,因为我们之前ObjectPool中设置的是默认隐藏的
go.SetActive(true);
最后普通平台生成修改为:
/// 生成普通平台(单个)
private void SpawnNormalPlatform(int ranObstacleDir)
{
//实例化平台
GameObject go = ObjectPool.Instance.GetNormalPlatform();
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
go.SetActive(true);
}
组合平台修改
/// <summary>
/// 生成通用组合平台
/// 要实例化的是vars里面的commonPlatformGroup
/// Instantiate(vars.commonPlatformGroup[ran][要实例化的东西],transform[父物体])
/// </summary>
private void SpawnCommonPlatformGroup(int ranObstacleDir)
{
int ran = Random.Range(0,vars.commonPlatformGroup.Count);
//实例化平台
GameObject go = Instantiate(vars.commonPlatformGroup[ran],transform);
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
}
组合平台现在就不需要随机值所以可以删掉
int ran = Random.Range(0,vars.commonPlatformGroup.Count);
同理
GameObject go = Instantiate(vars.commonPlatformGroup[ran],transform);
改成
GameObject go = ObjectPool.Instance.GetCommonPlatformGroup();
最后让go显示出来
go.SetActive(true);
改完之后:
/// 生成通用组合平台
private void SpawnCommonPlatformGroup(int ranObstacleDir)
{
//实例化平台
GameObject go = ObjectPool.Instance.GetCommonPlatformGroup();
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
go.SetActive(true);
}
所有组合平台都按上述组合平台修改方法修改
钉子组合平台
/// <summary>
/// 生成钉子组合平台
/// 需要传递进来一个int值,判断向左还是向右
/// </summary>
private void SpawnSpikePlatform(int dir)
{
GameObject temp = null;
if (dir==0)
{
spikeSpawnLeft = false;
//实例化平台
temp = Instantiate(vars.spikePlatformRight, transform);
}
else
{
spikeSpawnLeft = true;
//实例化平台
temp = Instantiate(vars.spikePlatformLeft, transform);
}
//实例化平台后,要对其位置进行赋值
temp.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite,dir);
}
要修改:
temp = Instantiate(vars.spikePlatformRight, transform);
为:
temp = ObjectPool.Instance.GetSpikerPlatformRight();
并添加
temp.SetActive(true);
修改后:
private void SpawnSpikePlatform(int dir)
{
GameObject temp = null;
if (dir==0)
{
spikeSpawnLeft = false;
//实例化平台
temp = ObjectPool.Instance.GetSpikerPlatformRight();
}
else
{
spikeSpawnLeft = true;
//实例化平台
temp = ObjectPool.Instance.GetSpikerPlatformLeft();
}
//实例化平台后,要对其位置进行赋值
temp.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite,dir);
temp.SetActive(true);
}
生成钉子平台后生成的平台
/// 生成钉子平台之后需要生成的平台
/// 包括钉子的方向,也包括原来的方向
/// 记得要把预制体先实例化出来
/// </summary>
private void AfterSpawnSpike()
{
print("进入AfterSpawnSpike()方法");
if (afterSpawnSpikeSpawnCount>0)
{
afterSpawnSpikeSpawnCount--;
for (int i = 0; i < 2; i++)
{
GameObject temp = Instantiate(vars.normalPlatformPre, transform);
if (i==0)//生成原来方向的平台
{
temp.transform.position = platformSpawnPosition;
//如果钉子在左边,我们原先路径就在右边
if (spikeSpawnLeft)
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x + vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
else
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x - vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
}
else//生成钉子方向的平台,原先路径就在左边
{
temp.transform.position = spikeDirPlatformPos;
//如果钉子在右边,生成钉子方向的平台就在右边
if (spikeSpawnLeft)
{
spikeDirPlatformPos = new Vector3(spikeDirPlatformPos.x - vars.nextXPos,
spikeDirPlatformPos.y + vars.nextYPos, 0);
}
else
{
spikeDirPlatformPos = new Vector3(spikeDirPlatformPos.x + vars.nextXPos,
spikeDirPlatformPos.y + vars.nextYPos, 0);
}
}
//普通平台是没有障碍物的
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite, 1);
}
}
else
{
isSpawnSpike = false;
DecidePath();
}
}
要把:
GameObject temp = Instantiate(vars.normalPlatformPre, transform);
改为:
GameObject temp = ObjectPool.Instance.GetNormalPlatform();
最后显示temp:
temp.SetActive(true);
修改完毕的PlatformSpawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum PlatformGroupType
{
Grass,
Winter
}
public class PlatformSpawner : MonoBehaviour {
public Vector3 startSpwawnPos;
/// <summary>
/// 生成平台数量
/// </summary>
private int spawnPlatformCount;
private ManageVars vars;
/// <summary>
/// 平台的生成位置
/// </summary>
private Vector3 platformSpawnPosition;
/// <summary>
/// 是否朝左边生成,反之朝右
/// </summary>
private bool isLeftSpawn = false;
/// <summary>
/// 选好的平台图用此接收
/// </summary>
private Sprite selectPlatformSprite;
/// <summary>
/// 组合平台类型
/// </summary>
private PlatformGroupType groupType;
/// <summary>
/// 生成钉子组合平台的方向是否在左边
/// </summary>
private bool spikeSpawnLeft = false;
/// <summary>
/// 钉子方向平台的位置
/// </summary>
private Vector3 spikeDirPlatformPos;
/// <summary>
/// 生成钉子平台之后需要在钉子方向生成的平台数量
/// </summary>
private int afterSpawnSpikeSpawnCount;
/// <summary>
/// 生成钉子平台时,也需要生成一下我们原先的这个平台
/// 所以得生成两个,需要一个bool值,确认路径DecidePath
/// </summary>
private bool isSpawnSpike;
private void Awake()
{
EventCenter.AddListener(EventDefine.DecidePath,DecidePath);
vars = ManageVars.GetManageVars();
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.DecidePath, DecidePath);
}
private void Start()
{
RandomPlatformTheme();
platformSpawnPosition=startSpwawnPos;
//vars = ManageVars.GetManageVars();
//在RandomPlatformTheme(); 中调用vars,vars这里还没有赋值
//拿到Awake()中去
for (int i = 0; i < 5; i++)
{
spawnPlatformCount = 5;
DecidePath();
}
//生成人物
GameObject go = Instantiate(vars.charactorPre);
//设置位置是transform
go.transform.position = new Vector3(0, -1.87f, 0);
}
/// <summary>
/// 随即平台主题,随机之后选择组合平台
/// 冬季主题选择冬季组合平台
/// 其他主体选择草地主题平台
/// </summary>
private void RandomPlatformTheme()
{
int ran = Random.Range(0, vars.platformThemeSpriteList.Count);
selectPlatformSprite = vars.platformThemeSpriteList[ran];
if (ran==2)
{
groupType = PlatformGroupType.Winter;
}
else
{
groupType = PlatformGroupType.Grass;
}
}
/// <summary>
/// 确定路径(将其做成一个监听,给它一个事件码)
/// 在PlayerController里面点击跳跃之后广播事件码进行调用
/// </summary>
private void DecidePath()
{
if (isSpawnSpike)
{
AfterSpawnSpike();
return;
}
if (spawnPlatformCount>0)
{
spawnPlatformCount--;
SpawnPlatform();
}
else//反转生成方向
{
isLeftSpawn = !isLeftSpawn;
spawnPlatformCount = Random.Range(1, 4);
SpawnPlatform();
}
}
/// <summary>
/// 生成平台
/// spawnPlatformCount ==0代表一波生成平台的最后一个
/// 最后一个让其生成组合平台
/// </summary>
private void SpawnPlatform()
{
int ranObstacleDir = Random.Range(0, 2);
//生成单个平台
if (spawnPlatformCount>=1)
{
SpawnNormalPlatform(ranObstacleDir);
}
//生成组合平台
else if (spawnPlatformCount ==0)
{
int ran = Random.Range(0,3);
//生成通用组合平台
if (ran==0)
{
SpawnCommonPlatformGroup(ranObstacleDir);
}
//生成主题组合平台
//要选择是哪一个主题
else if (ran==1)
{
switch (groupType)
{
case PlatformGroupType.Grass:
SpawnGrassPlatformGroup(ranObstacleDir);
break;
case PlatformGroupType.Winter:
SpawnWinterPlatformGroup(ranObstacleDir);
break;
default:
break;
}
}
//生成钉子组合平台
else
{
int value = -1;
if (isLeftSpawn)
{
value = 0;//生成右边方向的钉子
}
else
{
value = 1;//生成左边方向的钉子
}
SpawnSpikePlatform(value);
afterSpawnSpikeSpawnCount = 4;
isSpawnSpike = true;
//拿到了钉子方向的初始生成位置,还需要钉子方向生成几个平台,所以还需要一个变量
if (spikeSpawnLeft)//钉子在左边
{
spikeDirPlatformPos = new Vector3(platformSpawnPosition.x - 1.65f,
platformSpawnPosition.y + vars.nextYPos, 0);
}
else
{
spikeDirPlatformPos = new Vector3(platformSpawnPosition.x + 1.65f,
platformSpawnPosition.y + vars.nextYPos, 0);
}
}
}
if (isLeftSpawn)//如果向左生成
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x - vars.nextXPos,
platformSpawnPosition.y + vars.nextXPos, 0);
}
else//如果向右生成
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x + vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
}
/// <summary>
/// 生成普通平台(单个)
/// 随机到的图要传给我们要生成的图
/// 在这里生成了一个普通平台
/// 我们这里要把图传给普通平台
/// 让其知道该更换图了
/// (创建PlatformSprite脚本实现这一功能)
/// </summary>
private void SpawnNormalPlatform(int ranObstacleDir)
{
//实例化平台
GameObject go = ObjectPool.Instance.GetNormalPlatform();
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
go.SetActive(true);
}
/// <summary>
/// 生成通用组合平台
/// 要实例化的是vars里面的commonPlatformGroup
/// Instantiate(vars.commonPlatformGroup[ran][要实例化的东西],transform[父物体])
/// </summary>
private void SpawnCommonPlatformGroup(int ranObstacleDir)
{
//实例化平台
GameObject go = ObjectPool.Instance.GetCommonPlatformGroup();
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
go.SetActive(true);
}
/// <summary>
/// 生成草地组合平台
/// </summary>
private void SpawnGrassPlatformGroup(int ranObstacleDir)
{
//实例化平台
GameObject go = ObjectPool.Instance.GetGrassPlatformGroup();
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
go.SetActive(true);
}
/// <summary>
/// 生成冬季组合平台
/// </summary>
private void SpawnWinterPlatformGroup(int ranObstacleDir)
{
//实例化平台
GameObject go = ObjectPool.Instance.GetWinterPlatformGroup();
//实例化平台后,要对其位置进行赋值
go.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, ranObstacleDir);
go.SetActive(true);
}
/// <summary>
/// 生成钉子组合平台
/// 需要传递进来一个int值,判断向左还是向右
/// </summary>
private void SpawnSpikePlatform(int dir)
{
GameObject temp = null;
if (dir==0)
{
spikeSpawnLeft = false;
//实例化平台
temp = ObjectPool.Instance.GetSpikerPlatformRight();
}
else
{
spikeSpawnLeft = true;
//实例化平台
temp = ObjectPool.Instance.GetSpikerPlatformLeft();
}
//实例化平台后,要对其位置进行赋值
temp.transform.position = platformSpawnPosition;
//生成平台后要拿到平台上的组件
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite,dir);
temp.SetActive(true);
}
/// <summary>
/// 生成钉子平台之后需要生成的平台
/// 包括钉子的方向,也包括原来的方向
/// 记得要把预制体先实例化出来
/// </summary>
private void AfterSpawnSpike()
{
print("进入AfterSpawnSpike()方法");
if (afterSpawnSpikeSpawnCount>0)
{
afterSpawnSpikeSpawnCount--;
for (int i = 0; i < 2; i++)
{
GameObject temp = ObjectPool.Instance.GetNormalPlatform();
if (i==0)//生成原来方向的平台
{
temp.transform.position = platformSpawnPosition;
//如果钉子在左边,我们原先路径就在右边
if (spikeSpawnLeft)
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x + vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
else
{
platformSpawnPosition = new Vector3(platformSpawnPosition.x - vars.nextXPos,
platformSpawnPosition.y + vars.nextYPos, 0);
}
}
else//生成钉子方向的平台,原先路径就在左边
{
temp.transform.position = spikeDirPlatformPos;
//如果钉子在右边,生成钉子方向的平台就在右边
if (spikeSpawnLeft)
{
spikeDirPlatformPos = new Vector3(spikeDirPlatformPos.x - vars.nextXPos,
spikeDirPlatformPos.y + vars.nextYPos, 0);
}
else
{
spikeDirPlatformPos = new Vector3(spikeDirPlatformPos.x + vars.nextXPos,
spikeDirPlatformPos.y + vars.nextYPos, 0);
}
}
//普通平台是没有障碍物的
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite, 1);
temp.SetActive(true);
}
}
else
{
isSpawnSpike = false;
DecidePath();
}
}
}