1. 程式人生 > >Unity實戰篇:移植遊戲到安卓平臺的注意事項及其例項(四)(物件池概念的引入以及優化)

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表示情緒穩定。

幀數顯著提升!