Unity3D开发技术研究构建实战小游戏项目之幻径(对象池模块应
2021-08-01 本文已影响0人
TonyWan_AR
一、框架视图
二、关键代码
CameraFollow
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
private Transform target;
private Vector3 offset;
private Vector2 velocity;
private void Update()
{
if (target == null && GameObject.FindGameObjectWithTag("Player") != null)
{
target = GameObject.FindGameObjectWithTag("Player").transform;
offset = target.position - transform.position;
}
}
private void FixedUpdate()
{
if (target != null)
{
float posX = Mathf.SmoothDamp(transform.position.x,
target.position.x - offset.x, ref velocity.x, 0.05f);
float posY = Mathf.SmoothDamp(transform.position.y,
target.position.y - offset.y, ref velocity.y, 0.05f);
if (posY > transform.position.y)
transform.position = new Vector3(posX, posY, transform.position.z);
}
}
}
GameData
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class GameData
{
/// <summary>
/// 是否再来一次游戏
/// </summary>
public static bool IsAgainGame = false;
private bool isFirstGame;
private bool isMusicOn;
private int[] bestScoreArr;
private int selectSkin;
private bool[] skinUnlocked;
private int diamondCount;
public void SetIsFirstGame(bool isFirstGame)
{
this.isFirstGame = isFirstGame;
}
public void SetIsMusicOn(bool isMusicOn)
{
this.isMusicOn = isMusicOn;
}
public void SetBestScoreArr(int[] bestScoreArr)
{
this.bestScoreArr = bestScoreArr;
}
public void SetSelectSkin(int selectSkin)
{
this.selectSkin = selectSkin;
}
public void SetSkinUnlocked(bool[] skinUnlocked)
{
this.skinUnlocked = skinUnlocked;
}
public void SetDiamondCount(int diamondCount)
{
this.diamondCount = diamondCount;
}
public bool GetIsFirstGame()
{
return isFirstGame;
}
public bool GetIsMusicOn()
{
return isMusicOn;
}
public int[] GetBestScoreArr()
{
return bestScoreArr;
}
public int GetSelectSkin()
{
return selectSkin;
}
public bool[] GetSkinUnlocked()
{
return skinUnlocked;
}
public int GetDiamondCount()
{
return diamondCount;
}
}
GameManager
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
using System.IO;
using System.Linq;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private GameData data;
private ManagerVars vars;
/// <summary>
/// 游戏是否开始
/// </summary>
public bool IsGameStarted { get; set; }
/// <summary>
/// 游戏是否结束
/// </summary>
public bool IsGameOver { get; set; }
public bool IsPause { get; set; }
/// <summary>
/// 玩家是否开始移动
/// </summary>
public bool PlayerIsMove { get; set; }
/// <summary>
/// 游戏成绩
/// </summary>
private int gameScore;
private int gameDiamond;
private bool isFirstGame;
private bool isMusicOn;
private int[] bestScoreArr;
private int selectSkin;
private bool[] skinUnlocked;
private int diamondCount;
private void Awake()
{
vars = ManagerVars.GetManagerVars();
Instance = this;
EventCenter.AddListener(EventDefine.AddScore, AddGameScore);
EventCenter.AddListener(EventDefine.PlayerMove, PlayerMove);
EventCenter.AddListener(EventDefine.AddDiamond, AddGameDiamond);
if (GameData.IsAgainGame)
{
IsGameStarted = true;
}
InitGameData();
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.AddScore, AddGameScore);
EventCenter.RemoveListener(EventDefine.PlayerMove, PlayerMove);
EventCenter.RemoveListener(EventDefine.AddDiamond, AddGameDiamond);
}
/// <summary>
/// 保存成绩
/// </summary>
/// <param name="score"></param>
public void SaveScore(int score)//60
{
List<int> list = bestScoreArr.ToList();
//从大到小排序list
list.Sort((x, y) => (-x.CompareTo(y)));
bestScoreArr = list.ToArray();
//50 20 10
int index = -1;
for (int i = 0; i < bestScoreArr.Length; i++)
{
if (score > bestScoreArr[i])
{
index = i;
}
}
if (index == -1) return;
for (int i = bestScoreArr.Length - 1; i > index; i--)
{
bestScoreArr[i] = bestScoreArr[i - 1];
}
bestScoreArr[index] = score;
Save();
}
/// <summary>
/// 获取最高分
/// </summary>
/// <returns></returns>
public int GetBestScore()
{
return bestScoreArr.Max();
}
/// <summary>
/// 获得最高分数组
/// </summary>
/// <returns></returns>
public int[] GetScoreArr()
{
List<int> list = bestScoreArr.ToList();
//从大到小排序list
list.Sort((x, y) => (-x.CompareTo(y)));
bestScoreArr = list.ToArray();
return bestScoreArr;
}
/// <summary>
/// 玩家移动会调用到此方法
/// </summary>
private void PlayerMove()
{
PlayerIsMove = true;
}
/// <summary>
/// 增加游戏成绩
/// </summary>
private void AddGameScore()
{
if (IsGameStarted == false || IsGameOver || IsPause) return;
gameScore++;
EventCenter.Broadcast(EventDefine.UpdateScoreText, gameScore);
}
/// <summary>
/// 获取游戏成绩
/// </summary>
public int GetGameScore()
{
return gameScore;
}
/// <summary>
/// 更新游戏钻石数量
/// </summary>
private void AddGameDiamond()
{
gameDiamond++;
EventCenter.Broadcast(EventDefine.UpdateDiamondText, gameDiamond);
}
/// <summary>
/// 获得吃到的钻石数
/// </summary>
/// <returns></returns>
public int GetGameDiamond()
{
return gameDiamond;
}
/// <summary>
/// 获取当前皮肤是否解锁
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public bool GetSkinUnlocked(int index)
{
return skinUnlocked[index];
}
/// <summary>
/// 设置当前皮肤解锁
/// </summary>
/// <param name="index"></param>
public void SetSkinUnloacked(int index)
{
skinUnlocked[index] = true;
Save();
}
/// <summary>
/// 获取所有得钻石数量
/// </summary>
/// <returns></returns>
public int GetAllDiamond()
{
return diamondCount;
}
/// <summary>
/// 更新总钻石数量
/// </summary>
/// <param name="value"></param>
public void UpdateAllDiamond(int value)
{
diamondCount += value;
Save();
}
/// <summary>
/// 设置当前选择的皮肤下标
/// </summary>
/// <param name="index"></param>
public void SetSelectedSkin(int index)
{
selectSkin = index;
Save();
}
/// <summary>
/// 获得当前选择的皮肤
/// </summary>
/// <returns></returns>
public int GetCurrentSelectedSkin()
{
return selectSkin;
}
/// <summary>
/// 设置音效是否开启
/// </summary>
/// <param name="value"></param>
public void SetIsMusicOn(bool value)
{
isMusicOn = value;
Save();
}
/// <summary>
/// 获取音效是否开启
/// </summary>
/// <returns></returns>
public bool GetIsMusicOn()
{
return isMusicOn;
}
/// <summary>
/// 初始化游戏数据
/// </summary>
private void InitGameData()
{
Read();
if (data != null)
{
isFirstGame = data.GetIsFirstGame();
}
else
{
isFirstGame = true;
}
//如果第一次开始游戏
if (isFirstGame)
{
isFirstGame = false;
isMusicOn = true;
bestScoreArr = new int[3];
selectSkin = 0;
skinUnlocked = new bool[vars.skinSpriteList.Count];
skinUnlocked[0] = true;
diamondCount = 10;
data = new GameData();
Save();
}
else
{
isMusicOn = data.GetIsMusicOn();
bestScoreArr = data.GetBestScoreArr();
selectSkin = data.GetSelectSkin();
skinUnlocked = data.GetSkinUnlocked();
diamondCount = data.GetDiamondCount();
}
}
/// <summary>
/// 储存数据
/// </summary>
private void Save()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = File.Create(Application.persistentDataPath + "/GameData.data"))
{
data.SetBestScoreArr(bestScoreArr);
data.SetDiamondCount(diamondCount);
data.SetIsFirstGame(isFirstGame);
data.SetIsMusicOn(isMusicOn);
data.SetSelectSkin(selectSkin);
data.SetSkinUnlocked(skinUnlocked);
bf.Serialize(fs, data);
}
}
catch (System.Exception e)
{
Debug.Log(e.Message);
}
}
/// <summary>
/// 读取
/// </summary>
private void Read()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = File.Open(Application.persistentDataPath + "/GameData.data", FileMode.Open))
{
data = (GameData)bf.Deserialize(fs);
}
}
catch (System.Exception e)
{
Debug.Log(e.Message);
}
}
/// <summary>
/// 重置数据
/// </summary>
public void ResetData()
{
isFirstGame = false;
isMusicOn = true;
bestScoreArr = new int[3];
selectSkin = 0;
skinUnlocked = new bool[vars.skinSpriteList.Count];
skinUnlocked[0] = true;
diamondCount = 10;
Save();
}
}
ObjectPool
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
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 List<GameObject> deathEffectList = new List<GameObject>();
private List<GameObject> diamondList = new List<GameObject>();
private ManagerVars vars;
private void Awake()
{
Instance = this;
vars = ManagerVars.GetManagerVars();
Init();
}
private void Init()
{
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.normalPlatformPre, ref normalPlatformList);
}
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 grassPlatformList);
}
}
for (int i = 0; i < initSpawnCount; i++)
{
for (int j = 0; j < vars.winterPlatformGroup.Count; j++)
{
InstantiateObject(vars.winterPlatformGroup[j], ref winterPlatformList);
}
}
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.spikePlatformLeft, ref spikePlatformLeftList);
}
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.spikePlatformRight, ref spikePlatformRightList);
}
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.deathEffect, ref deathEffectList);
}
for (int i = 0; i < initSpawnCount; i++)
{
InstantiateObject(vars.diamondPre, ref diamondList);
}
}
private GameObject InstantiateObject(GameObject prefab, ref List<GameObject> addList)
{
GameObject go = Instantiate(prefab, transform);
go.SetActive(false);
addList.Add(go);
return go;
}
/// <summary>
/// 获取单个平台
/// </summary>
/// <returns></returns>
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);
}
/// <summary>
/// 获取通用组合平台
/// </summary>
/// <returns></returns>
public GameObject GetCommonPlatformGroup()
{
for (int i = 0; i < commonPlatformList.Count; i++)
{
if (commonPlatformList[i].activeInHierarchy == false)
{
return commonPlatformList[i];
}
}
int ran = Random.Range(0, vars.commonPlatformGroup.Count);
return InstantiateObject(vars.commonPlatformGroup[ran], ref commonPlatformList);
}
/// <summary>
/// 获取草地组合平台
/// </summary>
/// <returns></returns>
public GameObject GetGrassPlatformGroup()
{
for (int i = 0; i < grassPlatformList.Count; i++)
{
if (grassPlatformList[i].activeInHierarchy == false)
{
return grassPlatformList[i];
}
}
int ran = Random.Range(0, vars.grassPlatformGroup.Count);
return InstantiateObject(vars.grassPlatformGroup[ran], ref grassPlatformList);
}
/// <summary>
/// 获取冬季组合平台
/// </summary>
/// <returns></returns>
public GameObject GetWinterPlatformGroup()
{
for (int i = 0; i < winterPlatformList.Count; i++)
{
if (winterPlatformList[i].activeInHierarchy == false)
{
return winterPlatformList[i];
}
}
int ran = Random.Range(0, vars.winterPlatformGroup.Count);
return InstantiateObject(vars.winterPlatformGroup[ran], ref winterPlatformList);
}
/// <summary>
/// 获取左边钉子组合平台
/// </summary>
/// <returns></returns>
public GameObject GetLeftSpikePlatform()
{
for (int i = 0; i < spikePlatformLeftList.Count; i++)
{
if (spikePlatformLeftList[i].activeInHierarchy == false)
{
return spikePlatformLeftList[i];
}
}
return InstantiateObject(vars.spikePlatformLeft, ref spikePlatformLeftList);
}
/// <summary>
/// 获取右边钉子组合平台
/// </summary>
/// <returns></returns>
public GameObject GetRightSpikePlatform()
{
for (int i = 0; i < spikePlatformRightList.Count; i++)
{
if (spikePlatformRightList[i].activeInHierarchy == false)
{
return spikePlatformRightList[i];
}
}
return InstantiateObject(vars.spikePlatformRight, ref spikePlatformRightList);
}
/// <summary>
/// 获取死亡特效
/// </summary>
/// <returns></returns>
public GameObject GetDeathEffect()
{
for (int i = 0; i < deathEffectList.Count; i++)
{
if (deathEffectList[i].activeInHierarchy == false)
{
return deathEffectList[i];
}
}
return InstantiateObject(vars.deathEffect, ref deathEffectList);
}
/// <summary>
/// 获取钻石
/// </summary>
/// <returns></returns>
public GameObject GetDiamond()
{
for (int i = 0; i < diamondList.Count; i++)
{
if (diamondList[i].activeInHierarchy == false)
{
return diamondList[i];
}
}
return InstantiateObject(vars.diamondPre, ref diamondList);
}
}
PlatformScript
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlatformScript : MonoBehaviour
{
public SpriteRenderer[] spriteRenderers;
public GameObject obstacle;
private bool startTimer;
private float fallTime;
private Rigidbody2D my_Body;
private void Awake()
{
my_Body = GetComponent<Rigidbody2D>();
}
public void Init(Sprite sprite, float fallTime, int obstacleDir)
{
my_Body.bodyType = RigidbodyType2D.Static;
this.fallTime = fallTime;
startTimer = true;
for (int i = 0; i < spriteRenderers.Length; i++)
{
spriteRenderers[i].sprite = sprite;
}
if (obstacleDir == 0)//朝右边
{
if (obstacle != null)
{
obstacle.transform.localPosition = new Vector3(-obstacle.transform.localPosition.x,
obstacle.transform.localPosition.y, 0);
}
}
}
private void Update()
{
if (GameManager.Instance.IsGameStarted == false || GameManager.Instance.PlayerIsMove == false) return;
if (startTimer)
{
fallTime -= Time.deltaTime;
if (fallTime < 0)//倒计时结束
{
//掉落
startTimer = false;
if (my_Body.bodyType != RigidbodyType2D.Dynamic)
{
my_Body.bodyType = RigidbodyType2D.Dynamic;
StartCoroutine(DealyHide());
}
}
}
if (transform.position.y - Camera.main.transform.position.y < -6)
{
StartCoroutine(DealyHide());
}
}
private IEnumerator DealyHide()
{
yield return new WaitForSeconds(1f);
gameObject.SetActive(false);
}
}
PlatformSpawner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum PlatformGroupType
{
Grass,
Winter
}
public class PlatformSpawner : MonoBehaviour
{
public Vector3 startSpawnPos;
/// <summary>
/// 里程碑数
/// </summary>
public int milestoneCount = 10;
public float fallTime;
public float minFallTime;
public float multiple;
/// <summary>
/// 生成平台数量
/// </summary>
private int spawnPlatformCount;
private ManagerVars 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;
private bool isSpawnSpike;
private void Awake()
{
EventCenter.AddListener(EventDefine.DecidePath, DecidePath);
vars = ManagerVars.GetManagerVars();
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.DecidePath, DecidePath);
}
private void Start()
{
RandomPlatformTheme();
platformSpawnPosition = startSpawnPos;
for (int i = 0; i < 5; i++)
{
spawnPlatformCount = 5;
DecidePath();
}
//生成人物
GameObject go = Instantiate(vars.characterPre);
go.transform.position = new Vector3(0, -1.8f, 0);
}
private void Update()
{
if (GameManager.Instance.IsGameStarted && GameManager.Instance.IsGameOver == false)
{
UpdateFallTime();
}
}
/// <summary>
/// 更新平台掉落时间
/// </summary>
private void UpdateFallTime()
{
if (GameManager.Instance.GetGameScore() > milestoneCount)
{
milestoneCount *= 2;
fallTime *= multiple;
if (fallTime < minFallTime)
{
fallTime = minFallTime;
}
}
}
/// <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>
/// 确定路径
/// </summary>
private void DecidePath()
{
if (isSpawnSpike)
{
AfterSpawnSpike();
return;
}
if (spawnPlatformCount > 0)
{
spawnPlatformCount--;
SpawnPlatform();
}
else
{
//反转生成方向
isLeftSpawn = !isLeftSpawn;
spawnPlatformCount = Random.Range(1, 4);
SpawnPlatform();
}
}
/// <summary>
/// 生成平台
/// </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);
isSpawnSpike = true;
afterSpawnSpikeSpawnCount = 4;
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);
}
}
}
int ranSpawnDiamond = Random.Range(0, 8);
if (ranSpawnDiamond >= 6 && GameManager.Instance.PlayerIsMove)
{
GameObject go = ObjectPool.Instance.GetDiamond();
go.transform.position = new Vector3(platformSpawnPosition.x,
platformSpawnPosition.y + 0.5f, 0);
go.SetActive(true);
}
if (isLeftSpawn)//向左生成
{
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);
}
}
/// <summary>
/// 生成普通平台(单个)
/// </summary>
private void SpawnNormalPlatform(int ranObstacleDir)
{
GameObject go = ObjectPool.Instance.GetNormalPlatform();
go.transform.position = platformSpawnPosition;
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, fallTime, ranObstacleDir);
go.SetActive(true);
}
/// <summary>
/// 生成通用组合平台
/// </summary>
private void SpawnCommonPlatformGroup(int ranObstacleDir)
{
GameObject go = ObjectPool.Instance.GetCommonPlatformGroup();
go.transform.position = platformSpawnPosition;
go.GetComponent<PlatformScript>().Init(selectPlatformSprite, fallTime, 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, fallTime, 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, fallTime, ranObstacleDir);
go.SetActive(true);
}
/// <summary>
/// 生成钉子组合平台
/// </summary>
/// <param name="dir"></param>
private void SpawnSpikePlatform(int dir)
{
GameObject temp = null;
if (dir == 0)
{
spikeSpawnLeft = false;
temp = ObjectPool.Instance.GetRightSpikePlatform();
}
else
{
spikeSpawnLeft = true;
temp = ObjectPool.Instance.GetLeftSpikePlatform();
}
temp.transform.position = platformSpawnPosition;
temp.GetComponent<PlatformScript>().Init(selectPlatformSprite, fallTime, dir);
temp.SetActive(true);
}
/// <summary>
/// 生成钉子平台之后需要生成的平台
/// 包括钉子方向,也包括原来的方向
/// </summary>
private void 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, fallTime, 1);
temp.SetActive(true);
}
}
else
{
isSpawnSpike = false;
DecidePath();
}
}
}
PlayerController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.EventSystems;
public class PlayerController : MonoBehaviour
{
public Transform rayDown, rayLeft, rayRight;
public LayerMask platformLayer, obstacleLayer;
/// <summary>
/// 是否向左移动,反之向右
/// </summary>
private bool isMoveLeft = false;
/// <summary>
/// 是否正在跳跃
/// </summary>
private bool isJumping = false;
private Vector3 nextPlatformLeft, nextPlatformRight;
private ManagerVars vars;
private Rigidbody2D my_Body;
private SpriteRenderer spriteRenderer;
private bool isMove = false;
private AudioSource m_AudioSource;
private void Awake()
{
EventCenter.AddListener<bool>(EventDefine.IsMusicOn, IsMusicOn);
EventCenter.AddListener<int>(EventDefine.ChangeSkin, ChangeSkin);
vars = ManagerVars.GetManagerVars();
spriteRenderer = GetComponent<SpriteRenderer>();
my_Body = GetComponent<Rigidbody2D>();
m_AudioSource = GetComponent<AudioSource>();
}
private void Start()
{
ChangeSkin(GameManager.Instance.GetCurrentSelectedSkin());
}
private void OnDestroy()
{
EventCenter.RemoveListener<int>(EventDefine.ChangeSkin, ChangeSkin);
EventCenter.RemoveListener<bool>(EventDefine.IsMusicOn, IsMusicOn);
}
/// <summary>
/// 音效是否开启
/// </summary>
/// <param name="value"></param>
private void IsMusicOn(bool value)
{
m_AudioSource.mute = !value;
}
/// <summary>
/// 更换皮肤的调用
/// </summary>
/// <param name="skinIndex"></param>
private void ChangeSkin(int skinIndex)
{
spriteRenderer.sprite = vars.characterSkinSpriteList[skinIndex];
}
private int count;
private bool IsPointerOverGameObject(Vector2 mousePosition)
{
//创建一个点击事件
PointerEventData eventData = new PointerEventData(EventSystem.current);
eventData.position = mousePosition;
List<RaycastResult> raycastResults = new List<RaycastResult>();
//向点击位置发射一条射线,检测是否点击的UI
EventSystem.current.RaycastAll(eventData, raycastResults);
return raycastResults.Count > 0;
}
private void Update()
{
Debug.DrawRay(rayDown.position, Vector2.down * 1, Color.red);
Debug.DrawRay(rayLeft.position, Vector2.left * 0.15f, Color.red);
Debug.DrawRay(rayRight.position, Vector2.right * 0.15f, Color.red);
//if (Application.platform == RuntimePlatform.Android ||
// Application.platform == RuntimePlatform.IPhonePlayer)
//{
// int fingerId = Input.GetTouch(0).fingerId;
// if (EventSystem.current.IsPointerOverGameObject(fingerId)) return;
//}
//else
//{
// if (EventSystem.current.IsPointerOverGameObject()) return;
//}
if (IsPointerOverGameObject(Input.mousePosition)) return;
if (GameManager.Instance.IsGameStarted == false || GameManager.Instance.IsGameOver
|| GameManager.Instance.IsPause)
return;
if (Input.GetMouseButtonDown(0) && isJumping == false && nextPlatformLeft != Vector3.zero)
{
if (isMove == false)
{
EventCenter.Broadcast(EventDefine.PlayerMove);
isMove = true;
}
m_AudioSource.PlayOneShot(vars.jumpClip);
EventCenter.Broadcast(EventDefine.DecidePath);
isJumping = true;
Vector3 mousePos = Input.mousePosition;
//点击的是左边屏幕
if (mousePos.x <= Screen.width / 2)
{
isMoveLeft = true;
}
//点击的右边屏幕
else if (mousePos.x > Screen.width / 2)
{
isMoveLeft = false;
}
Jump();
}
//游戏结束了
if (my_Body.velocity.y < 0 && IsRayPlatform() == false && GameManager.Instance.IsGameOver == false)
{
m_AudioSource.PlayOneShot(vars.fallClip);
spriteRenderer.sortingLayerName = "Default";
GetComponent<BoxCollider2D>().enabled = false;
GameManager.Instance.IsGameOver = true;
StartCoroutine(DealyShowGameOverPanel());
}
if (isJumping && IsRayObstacle() && GameManager.Instance.IsGameOver == false)
{
m_AudioSource.PlayOneShot(vars.hitClip);
GameObject go = ObjectPool.Instance.GetDeathEffect();
go.SetActive(true);
go.transform.position = transform.position;
GameManager.Instance.IsGameOver = true;
spriteRenderer.enabled = false;
StartCoroutine(DealyShowGameOverPanel());
}
if (transform.position.y - Camera.main.transform.position.y < -5 && GameManager.Instance.IsGameOver == false)
{
m_AudioSource.PlayOneShot(vars.fallClip);
GameManager.Instance.IsGameOver = true;
StartCoroutine(DealyShowGameOverPanel());
}
}
IEnumerator DealyShowGameOverPanel()
{
yield return new WaitForSeconds(1f);
//调用结束面板
EventCenter.Broadcast(EventDefine.ShowGameOverPanel);
}
private GameObject lastHitGo = null;
/// <summary>
/// 是否检测到平台
/// </summary>
/// <returns></returns>
private bool IsRayPlatform()
{
RaycastHit2D hit = Physics2D.Raycast(rayDown.position, Vector2.down, 1f, platformLayer);
if (hit.collider != null)
{
if (hit.collider.tag == "Platform")
{
if (lastHitGo != hit.collider.gameObject)
{
if (lastHitGo == null)
{
lastHitGo = hit.collider.gameObject;
return true;
}
EventCenter.Broadcast(EventDefine.AddScore);
lastHitGo = hit.collider.gameObject;
}
return true;
}
}
return false;
}
/// <summary>
/// 是否检测到障碍物
/// </summary>
/// <returns></returns>
private bool IsRayObstacle()
{
RaycastHit2D leftHit = Physics2D.Raycast(rayLeft.position, Vector2.left, 0.15f, obstacleLayer);
RaycastHit2D rightHit = Physics2D.Raycast(rayRight.position, Vector2.right, 0.15f, obstacleLayer);
if (leftHit.collider != null)
{
if (leftHit.collider.tag == "Obstacle")
{
return true;
}
}
if (rightHit.collider != null)
{
if (rightHit.collider.tag == "Obstacle")
{
return true;
}
}
return false;
}
private void Jump()
{
if (isJumping)
{
if (isMoveLeft)
{
transform.localScale = new Vector3(-1, 1, 1);
transform.DOMoveX(nextPlatformLeft.x, 0.2f);
transform.DOMoveY(nextPlatformLeft.y + 0.8f, 0.15f);
}
else
{
transform.DOMoveX(nextPlatformRight.x, 0.2f);
transform.DOMoveY(nextPlatformRight.y + 0.8f, 0.15f);
transform.localScale = Vector3.one;
}
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Platform")
{
isJumping = false;
Vector3 currentPlatformPos = collision.gameObject.transform.position;
nextPlatformLeft = new Vector3(currentPlatformPos.x -
vars.nextXPos, currentPlatformPos.y + vars.nextYPos, 0);
nextPlatformRight = new Vector3(currentPlatformPos.x +
vars.nextXPos, currentPlatformPos.y + vars.nextYPos, 0);
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.tag == "Pickup")
{
m_AudioSource.PlayOneShot(vars.diamondClip);
EventCenter.Broadcast(EventDefine.AddDiamond);
//吃到钻石了
collision.gameObject.SetActive(false);
}
}
}
BgTheme
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BgTheme : MonoBehaviour
{
private SpriteRenderer m_SpriteRenderer;
private ManagerVars vars;
private void Awake()
{
vars = ManagerVars.GetManagerVars();
m_SpriteRenderer = GetComponent<SpriteRenderer>();
int ranValue = Random.Range(0, vars.bgThemeSpriteList.Count);
m_SpriteRenderer.sprite = vars.bgThemeSpriteList[ranValue];
}
}
ClickAudio
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClickAudio : MonoBehaviour
{
private AudioSource m_AudioSource;
private ManagerVars vars;
private void Awake()
{
m_AudioSource = GetComponent<AudioSource>();
vars = ManagerVars.GetManagerVars();
EventCenter.AddListener(EventDefine.PlayClikAudio, PlayAudio);
EventCenter.AddListener<bool>(EventDefine.IsMusicOn, IsMusicOn);
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.PlayClikAudio, PlayAudio);
EventCenter.RemoveListener<bool>(EventDefine.IsMusicOn, IsMusicOn);
}
private void PlayAudio()
{
m_AudioSource.PlayOneShot(vars.buttonClip);
}
/// <summary>
/// 音效是否开启
/// </summary>
/// <param name="value"></param>
private void IsMusicOn(bool value)
{
m_AudioSource.mute = !value;
}
}
GameOverPanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameOverPanel : MonoBehaviour
{
public Text txt_Score, txt_BestScore, txt_AddDiamondCount;
public Button btn_Restart, btn_Rank, btn_Home;
public Image img_New;
private void Awake()
{
btn_Restart.onClick.AddListener(OnRestartButtonclick);
btn_Rank.onClick.AddListener(OnRankButtonClick);
btn_Home.onClick.AddListener(OnHomeButtonClick);
EventCenter.AddListener(EventDefine.ShowGameOverPanel, Show);
gameObject.SetActive(false);
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.ShowGameOverPanel, Show);
}
private void Show()
{
if (GameManager.Instance.GetGameScore() > GameManager.Instance.GetBestScore())
{
img_New.gameObject.SetActive(true);
txt_BestScore.text = "最高分 " + GameManager.Instance.GetGameScore();
}
else
{
img_New.gameObject.SetActive(false);
txt_BestScore.text = "最高分 " + GameManager.Instance.GetBestScore();
}
GameManager.Instance.SaveScore(GameManager.Instance.GetGameScore());
txt_Score.text = GameManager.Instance.GetGameScore().ToString();
txt_AddDiamondCount.text = "+" + GameManager.Instance.GetGameDiamond().ToString();
//更新总的钻石数量
GameManager.Instance.UpdateAllDiamond(GameManager.Instance.GetGameDiamond());
gameObject.SetActive(true);
}
/// <summary>
/// 再来一局按钮点击
/// </summary>
private void OnRestartButtonclick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
GameData.IsAgainGame = true;
}
/// <summary>
/// 排行榜按钮点击
/// </summary>
private void OnRankButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
EventCenter.Broadcast(EventDefine.ShowRankPanel);
}
/// <summary>
/// 主界面按钮点击
/// </summary>
private void OnHomeButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
GameData.IsAgainGame = false;
}
}
GamePanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GamePanel : MonoBehaviour
{
private Button btn_Pause;
private Button btn_Play;
private Text txt_Score;
private Text txt_DiamondCount;
private void Awake()
{
EventCenter.AddListener(EventDefine.ShowGamePanel, Show);
EventCenter.AddListener<int>(EventDefine.UpdateScoreText, UpdateScoreText);
EventCenter.AddListener<int>(EventDefine.UpdateDiamondText, UpdateDiamondText);
Init();
}
private void Init()
{
btn_Pause = transform.Find("btn_Pause").GetComponent<Button>();
btn_Pause.onClick.AddListener(OnPauseButtonClick);
btn_Play = transform.Find("btn_Play").GetComponent<Button>();
btn_Play.onClick.AddListener(OnPlayButtonClick);
txt_Score = transform.Find("txt_Score").GetComponent<Text>();
txt_DiamondCount = transform.Find("Diamond/txt_DiamondCount").GetComponent<Text>();
btn_Play.gameObject.SetActive(false);
gameObject.SetActive(false);
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.ShowGamePanel, Show);
EventCenter.RemoveListener<int>(EventDefine.UpdateScoreText, UpdateScoreText);
EventCenter.RemoveListener<int>(EventDefine.UpdateDiamondText, UpdateDiamondText);
}
private void Show()
{
gameObject.SetActive(true);
}
/// <summary>
/// 更新成绩显示
/// </summary>
/// <param name="score"></param>
private void UpdateScoreText(int score)
{
txt_Score.text = score.ToString();
}
/// <summary>
/// 更新钻石数量显示
/// </summary>
/// <param name="diamond"></param>
private void UpdateDiamondText(int diamond)
{
txt_DiamondCount.text = diamond.ToString();
}
/// <summary>
/// 暂停按钮点击
/// </summary>
private void OnPauseButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
btn_Play.gameObject.SetActive(true);
btn_Pause.gameObject.SetActive(false);
//游戏暂停
Time.timeScale = 0;
GameManager.Instance.IsPause = true;
}
/// <summary>
/// 开始按钮点击
/// </summary>
private void OnPlayButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
btn_Play.gameObject.SetActive(false);
btn_Pause.gameObject.SetActive(true);
//继续游戏
Time.timeScale = 1;
GameManager.Instance.IsPause = false;
}
}
Hint
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class Hint : MonoBehaviour
{
private Image img_Bg;
private Text txt_Hint;
private void Awake()
{
img_Bg = GetComponent<Image>();
txt_Hint = GetComponentInChildren<Text>();
img_Bg.color = new Color(img_Bg.color.r, img_Bg.color.g, img_Bg.color.b, 0);
txt_Hint.color = new Color(txt_Hint.color.r, txt_Hint.color.g, txt_Hint.color.b, 0);
EventCenter.AddListener<string>(EventDefine.Hint, Show);
}
private void OnDestroy()
{
EventCenter.RemoveListener<string>(EventDefine.Hint, Show);
}
private void Show(string text)
{
StopCoroutine("Dealy");
transform.localPosition = new Vector3(0, -70, 0);
transform.DOLocalMoveY(0, 0.3f).OnComplete(() =>
{
StartCoroutine("Dealy");
});
img_Bg.DOColor(new Color(img_Bg.color.r, img_Bg.color.g, img_Bg.color.b, 0.4f), 0.1f);
txt_Hint.DOColor(new Color(txt_Hint.color.r, txt_Hint.color.g, txt_Hint.color.b, 1), 0.1f);
}
private IEnumerator Dealy()
{
yield return new WaitForSeconds(1f);
transform.DOLocalMoveY(70, 0.3f);
img_Bg.DOColor(new Color(img_Bg.color.r, img_Bg.color.g, img_Bg.color.b, 0), 0.1f);
txt_Hint.DOColor(new Color(txt_Hint.color.r, txt_Hint.color.g, txt_Hint.color.b, 0), 0.1f);
}
}
MainPanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainPanel : MonoBehaviour
{
private Button btn_Start;
private Button btn_Shop;
private Button btn_Rank;
private Button btn_Sound;
private Button btn_Reset;
private ManagerVars vars;
private void Awake()
{
vars = ManagerVars.GetManagerVars();
EventCenter.AddListener(EventDefine.ShowMainPanel, Show);
EventCenter.AddListener<int>(EventDefine.ChangeSkin, ChangeSkin);
Init();
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.ShowMainPanel, Show);
EventCenter.RemoveListener<int>(EventDefine.ChangeSkin, ChangeSkin);
}
private void Show()
{
gameObject.SetActive(true);
}
/// <summary>
/// 皮肤更换,这里更换UI皮肤图片
/// </summary>
/// <param name="skinIndex"></param>
private void ChangeSkin(int skinIndex)
{
btn_Shop.transform.GetChild(0).GetComponent<Image>().sprite =
vars.skinSpriteList[skinIndex];
}
private void Start()
{
if (GameData.IsAgainGame)
{
EventCenter.Broadcast(EventDefine.ShowGamePanel);
gameObject.SetActive(false);
}
Sound();
ChangeSkin(GameManager.Instance.GetCurrentSelectedSkin());
}
private void Init()
{
btn_Start = transform.Find("btn_Start").GetComponent<Button>();
btn_Start.onClick.AddListener(OnStartButtonClick);
btn_Shop = transform.Find("Btns/btn_Shop").GetComponent<Button>();
btn_Shop.onClick.AddListener(OnShopButtonClick);
btn_Rank = transform.Find("Btns/btn_Rank").GetComponent<Button>();
btn_Rank.onClick.AddListener(OnRankButtonClick);
btn_Sound = transform.Find("Btns/btn_Sound").GetComponent<Button>();
btn_Sound.onClick.AddListener(OnSoundButtonClick);
btn_Reset = transform.Find("Btns/btn_Reset").GetComponent<Button>();
btn_Reset.onClick.AddListener(OnResetButtonClick);
}
/// <summary>
/// 开始按钮点击后调用此方法
/// </summary>
private void OnStartButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
GameManager.Instance.IsGameStarted = true;
EventCenter.Broadcast(EventDefine.ShowGamePanel);
gameObject.SetActive(false);
}
/// <summary>
/// 商店按钮点击
/// </summary>
private void OnShopButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
EventCenter.Broadcast(EventDefine.ShowShopPanel);
gameObject.SetActive(false);
}
/// <summary>
/// 排行榜按钮点击
/// </summary>
private void OnRankButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
EventCenter.Broadcast(EventDefine.ShowRankPanel);
}
/// <summary>
/// 音效按钮点击
/// </summary>
private void OnSoundButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
GameManager.Instance.SetIsMusicOn(!GameManager.Instance.GetIsMusicOn());
Sound();
}
private void Sound()
{
if (GameManager.Instance.GetIsMusicOn())
{
btn_Sound.transform.GetChild(0).GetComponent<Image>().sprite = vars.musicOn;
}
else
{
btn_Sound.transform.GetChild(0).GetComponent<Image>().sprite = vars.musicOff;
}
EventCenter.Broadcast(EventDefine.IsMusicOn, GameManager.Instance.GetIsMusicOn());
}
/// <summary>
/// 重置按钮点击
/// </summary>
private void OnResetButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
EventCenter.Broadcast(EventDefine.ShowResetPanel);
}
}
RankPanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class RankPanel : MonoBehaviour
{
private Button btn_Close;
public Text[] txt_Scores;
private GameObject go_ScoreList;
private void Awake()
{
EventCenter.AddListener(EventDefine.ShowRankPanel, Show);
btn_Close = transform.Find("btn_Close").GetComponent<Button>();
btn_Close.onClick.AddListener(OnCloseButtonClick);
go_ScoreList = transform.Find("ScoreList").gameObject;
btn_Close.GetComponent<Image>().color = new Color(btn_Close.GetComponent<Image>().
color.r, btn_Close.GetComponent<Image>().color.g, btn_Close.GetComponent<Image>().color.b, 0);
go_ScoreList.transform.localScale = Vector3.zero;
gameObject.SetActive(false);
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.ShowRankPanel, Show);
}
private void Show()
{
gameObject.SetActive(true);
btn_Close.GetComponent<Image>().DOColor(new Color(btn_Close.GetComponent<Image>().
color.r, btn_Close.GetComponent<Image>().color.g,
btn_Close.GetComponent<Image>().color.b, 0.3f), 0.3f);
go_ScoreList.transform.DOScale(Vector3.one, 0.3f);
int[] arr = GameManager.Instance.GetScoreArr();
for (int i = 0; i < arr.Length; i++)
{
txt_Scores[i].text = arr[i].ToString();
}
}
private void OnCloseButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
btn_Close.GetComponent<Image>().DOColor(new Color(btn_Close.GetComponent<Image>().
color.r, btn_Close.GetComponent<Image>().color.g,
btn_Close.GetComponent<Image>().color.b, 0), 0.3f);
go_ScoreList.transform.DOScale(Vector3.zero, 0.3f).OnComplete(() =>
{
gameObject.SetActive(false);
});
}
}
ResetPanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.SceneManagement;
public class ResetPanel : MonoBehaviour
{
private Button btn_Yes;
private Button btn_No;
private Image img_Bg;
private GameObject dialog;
private void Awake()
{
EventCenter.AddListener(EventDefine.ShowResetPanel, Show);
img_Bg = transform.Find("bg").GetComponent<Image>();
btn_Yes = transform.Find("Dialog/btn_Yes").GetComponent<Button>();
btn_Yes.onClick.AddListener(OnYesButtonClick);
btn_No = transform.Find("Dialog/btn_No").GetComponent<Button>();
btn_No.onClick.AddListener(OnNoButtonClick);
dialog = transform.Find("Dialog").gameObject;
img_Bg.color = new Color(img_Bg.color.r, img_Bg.color.g, img_Bg.color.b, 0);
dialog.transform.localScale = Vector3.zero;
gameObject.SetActive(false);
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.ShowResetPanel, Show);
}
private void Show()
{
gameObject.SetActive(true);
img_Bg.DOColor(new Color(img_Bg.color.r, img_Bg.color.g, img_Bg.color.b, 0.3f), 0.3f);
dialog.transform.DOScale(Vector3.one, 0.3f);
}
/// <summary>
/// 是按钮点击
/// </summary>
private void OnYesButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
GameManager.Instance.ResetData();
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
/// <summary>
/// 否按钮点击
/// </summary>
private void OnNoButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
img_Bg.DOColor(new Color(img_Bg.color.r, img_Bg.color.g, img_Bg.color.b, 0), 0.3f);
dialog.transform.DOScale(Vector3.zero, 0.3f).OnComplete(() =>
{
gameObject.SetActive(false);
});
}
}
ShopPanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class ShopPanel : MonoBehaviour
{
private ManagerVars vars;
private Transform parent;
private Text txt_Name;
private Text txt_Diamond;
private Button btn_Back;
private Button btn_Select;
private Button btn_Buy;
private int selectIndex;
private void Awake()
{
EventCenter.AddListener(EventDefine.ShowShopPanel, Show);
parent = transform.Find("ScroolRect/Parent");
txt_Name = transform.Find("txt_Name").GetComponent<Text>();
txt_Diamond = transform.Find("Diamond/Text").GetComponent<Text>();
btn_Back = transform.Find("btn_Back").GetComponent<Button>();
btn_Back.onClick.AddListener(OnBackButtonClick);
btn_Select = transform.Find("btn_Select").GetComponent<Button>();
btn_Select.onClick.AddListener(OnSelectButtonClick);
btn_Buy = transform.Find("btn_Buy").GetComponent<Button>();
btn_Buy.onClick.AddListener(OnBuyButtonClick);
vars = ManagerVars.GetManagerVars();
}
private void Start()
{
Init();
gameObject.SetActive(false);
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.ShowShopPanel, Show);
}
private void Show()
{
gameObject.SetActive(true);
}
/// <summary>
/// 返回按钮点击
/// </summary>
private void OnBackButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
EventCenter.Broadcast(EventDefine.ShowMainPanel);
gameObject.SetActive(false);
}
/// <summary>
/// 购买按钮点击
/// </summary>
private void OnBuyButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
int price = int.Parse(btn_Buy.GetComponentInChildren<Text>().text);
if (price > GameManager.Instance.GetAllDiamond())
{
EventCenter.Broadcast(EventDefine.Hint, "钻石不足");
Debug.Log("钻石不足,不能购买");
return;
}
GameManager.Instance.UpdateAllDiamond(-price);
GameManager.Instance.SetSkinUnloacked(selectIndex);
parent.GetChild(selectIndex).GetChild(0).GetComponent<Image>().color = Color.white;
}
/// <summary>
/// 选择按钮点击
/// </summary>
private void OnSelectButtonClick()
{
EventCenter.Broadcast(EventDefine.PlayClikAudio);
EventCenter.Broadcast(EventDefine.ChangeSkin, selectIndex);
GameManager.Instance.SetSelectedSkin(selectIndex);
EventCenter.Broadcast(EventDefine.ShowMainPanel);
gameObject.SetActive(false);
}
private void Init()
{
parent.GetComponent<RectTransform>().sizeDelta = new Vector2((vars.skinSpriteList.Count + 2) * 160, 302);
for (int i = 0; i < vars.skinSpriteList.Count; i++)
{
GameObject go = Instantiate(vars.skinChooseItemPre, parent);
//未解锁
if (GameManager.Instance.GetSkinUnlocked(i) == false)
{
go.GetComponentInChildren<Image>().color = Color.gray;
}
else//解锁了
{
go.GetComponentInChildren<Image>().color = Color.white;
}
go.GetComponentInChildren<Image>().sprite = vars.skinSpriteList[i];
go.transform.localPosition = new Vector3((i + 1) * 160, 0, 0);
}
//打开页面直接定位到选中的皮肤
parent.transform.localPosition =
new Vector3(GameManager.Instance.GetCurrentSelectedSkin() * -160, 0);
}
private void Update()
{
selectIndex = (int)Mathf.Round(parent.transform.localPosition.x / -160.0f);
if (Input.GetMouseButtonUp(0))
{
parent.transform.DOLocalMoveX(selectIndex * -160, 0.2f);
//parent.transform.localPosition = new Vector3(currentIndex * -160, 0);
}
SetItemSize(selectIndex);
RefreshUI(selectIndex);
}
private void SetItemSize(int selectIndex)
{
for (int i = 0; i < parent.childCount; i++)
{
if (selectIndex == i)
{
parent.GetChild(i).GetChild(0).GetComponent<RectTransform>().sizeDelta = new Vector2(160, 160);
}
else
{
parent.GetChild(i).GetChild(0).GetComponent<RectTransform>().sizeDelta = new Vector2(80, 80);
}
}
}
private void RefreshUI(int selectIndex)
{
txt_Name.text = vars.skinNameList[selectIndex];
txt_Diamond.text = GameManager.Instance.GetAllDiamond().ToString();
//未解锁
if (GameManager.Instance.GetSkinUnlocked(selectIndex) == false)
{
btn_Select.gameObject.SetActive(false);
btn_Buy.gameObject.SetActive(true);
btn_Buy.GetComponentInChildren<Text>().text = vars.skinPrice[selectIndex].ToString();
}
else
{
btn_Select.gameObject.SetActive(true);
btn_Buy.gameObject.SetActive(false);
}
}
}