Unity实战篇:移植游戏到安卓平台的注意事项及其实例(四)(对象池概念的引入以及优化)
1.对象池基础概念的了解(必看)
2.针对项目来进行嵌入
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class GamePanel : MonoBehaviour {
private GameObject [] enemy;
private GameObject[] stone;
private GameObject[] enemyAttack;
private Text score;
private Text percent_exp;
private Slider exp;
public GameObject player;
private void Awake()
{
score = transform.Find("Score").GetComponent<Text>();
exp = transform.Find("Exp").GetComponent<Slider>();
percent_exp = transform.Find("Exp/Text").GetComponent<Text>();
score.transform.localPosition = new Vector3(-1500, 819, 0);
exp.transform.localPosition = new Vector3(1500, 820, 0);
InActiveUI();
}
private void Update()
{
if(Done_GameController.Instance.loadCount==2)
{
if (Done_GameController.Instance.UIPanels[0].activeSelf == false &&
Done_GameController.Instance.UIPanels[2].activeSelf == false)
{
Done_GameController.Instance.score = 0;
Done_GameController.Instance.level = 1;
StartGame();
Done_GameController.Instance.loadCount++;
}
}
if(Done_GameController.Instance.isDead&& !Done_GameController.Instance.gameOver)
{
ClearAllEnemy();
ObjectPool.GetInstance().GetObj(ObjectPool.player, player.transform.position, player.transform.rotation);
Done_GameController.Instance.isDead = false;
}
if (Done_GameController.Instance.gameOver)
{
GameOver();
}
score.text = "Score: " + Done_GameController.Instance.score.ToString();
exp.value =float.Parse((Done_GameController.Instance.score / (1000 * (Mathf.Pow(2, Done_GameController.Instance.level)))).ToString("f2"));
percent_exp.text = "Level " + Done_GameController.Instance.level.ToString() + " " + (exp.value*100).ToString()+"%";
if(exp.value>=1)
{
Done_GameController.Instance.level++;
}
}
private void OnEnable()
{
Done_GameController.Instance.gameOver = false;
Done_GameController.Instance.playerHealth.PlayerHealth = 3 ;
Done_GameController.Instance.loadCount = 1;
Done_GameController.Instance.loadCount++;
Done_GameController.Instance.StartIEnumerator();
ClearAllEnemy();
ObjectPool.GetInstance().GetObj(ObjectPool.player,player.transform.position,player.transform.rotation);
}
private void OnDisable()
{
if(Done_GameController.Instance)
Done_GameController.Instance.StopIEnumerator();
}
public void StartGame()
{
ActiveUI();
score.transform.DOLocalMoveX(-233, 0.5f);
exp.transform.DOLocalMoveX(258, 0.5f);
}
public void GameOver()
{
score.transform.DOLocalMoveX(-1500, 0.5f);
exp.transform.DOLocalMoveX(1500, 0.5f);
Invoke("InActiveUI", 0.5f);
Invoke("SetPanelInActive", 0.5f);
Done_GameController.Instance.SetPanelActive(2);
}
private void ActiveUI()
{
score.gameObject.SetActive(true);
percent_exp.gameObject.SetActive(true);
exp.gameObject.SetActive(true);
}
private void InActiveUI()
{
score.gameObject.SetActive(false);
percent_exp.gameObject.SetActive(false);
exp.gameObject.SetActive(false);
}
private void SetPanelInActive()
{
Done_GameController.Instance.SetPanelInActive(1);
}
private void SetPanelActive()
{
Done_GameController.Instance.SetPanelActive(1);
}
private void ClearAllEnemy()
{
enemy = GameObject.FindGameObjectsWithTag("Enemy");
for (int i = 0; i < enemy.Length; i++)
{
if (enemy[i].activeSelf)
ObjectPool.GetInstance().RecycleObj(enemy[i]);
}
stone = GameObject.FindGameObjectsWithTag("Stone");
for (int i = 0; i < stone.Length; i++)
{
if (stone[i].activeSelf)
ObjectPool.GetInstance().RecycleObj(stone[i]);
}
enemyAttack = GameObject.FindGameObjectsWithTag("EnemyAttack");
for (int i = 0; i < enemyAttack.Length; i++)
{
if(enemyAttack[i].activeSelf)
ObjectPool.GetInstance().RecycleObj(enemyAttack[i]);
}
}
}
最终效果
GC表示情绪稳定。
帧数显著提升!