Unity實戰篇:移植遊戲到安卓平臺的注意事項及其例項(四)(物件池概念的引入以及優化)
阿新 • • 發佈:2018-12-13
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表示情緒穩定。
幀數顯著提升!