制作我的小游戏(跳一跳1)

目录

ObjectPool.cs

之前的PlatformSpawner.cs

普通平台修改

组合平台修改

钉子组合平台

生成钉子平台后生成的平台

修改完毕的PlatformSpawner.cs


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();
        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值