Unity Game FrameWork - モジュールの使用法 - オブジェクト プールの使用法

オブジェクト プールを使用するには、ObjectBase を継承する必要があります。まず、ObjectBase から継承した OPGame クラスを作成します。以下に示すように、当面はそれを OP オブジェクトと呼びます。
[写真]

OP オブジェクトにはメンバー オブジェクトまたは変数を保存できる場所が 2 つあり、1 つはモデル ID: m_ModelID などの OP オブジェクト内にあります。もう 1 つは、オブジェクト プールの基本クラス ObjectBase の m_Target が、ボックス化とボックス化解除を必要とする任意のデータ型を格納できることです。OP オブジェクトを作成するときに、カスタム タイプ ModelInfor を渡し、基本クラスの初期化時にそれをパラメーターとして渡します。

API呼び出し

OP オブジェクト プールを作成します:
m_OPPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool(Utility.Text.Format(“OP Pool ({0})”, name), 20, 10, 0);
OP オブジェクトを作成します:作成後、使用中
ModelInfor ModelInfor = new ModelInfor(i);
OPGame OPGame = OPGame.Create("Model" + CreateNums, CreateNums, ModelInfor);
m_OPPool.Register(OPGame, true);
OP オブジェクトの取得:オブジェクト プールから未使用の OP オブジェクト
OPGameを取得しますOPGame = m_OPPool.Spawn("Model" + 0);
OP オブジェクトのリサイクル:使用中のオブジェクトを解放し、オブジェクト プールにリサイクルします。
m_OPPool.Unspawn(OPGame);
OP オブジェクトがロックされているかどうかを設定します:ロック後、オブジェクトはロックできなくなります。プール内の Destroy
m_OPPool.SetLocked(OPGame, true);
OP オブジェクトの優先順位を設定します:
m_OPPool.SetPriority(OPGame, 10);を使用します。

完全なコード

ProcedureObjectPool: プロセスを開始し、ObjectPlayer オブジェクトを作成します

using UnityEngine;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace StarForce
{
    
    
    public class ProcedureObjectPool : ProcedureBase
    {
    
    
        public override bool UseNativeDialog
        {
    
    
            get
            {
    
    
                return true;
            }
        }

        public override void OnEnter(ProcedureOwner procedureOwner)
        {
    
    
            base.OnEnter(procedureOwner);
            GameObject TT = new GameObject("Player");
            TT.AddComponent<ObjectPlayer>();
        }
    }
}

OPGame: OP オブジェクトと格納されたデータ クラス

using GameFramework;
using GameFramework.ObjectPool;
using UnityEngine;

public class OPGame : ObjectBase
{
    
    
    private int m_ModelID;

    public OPGame()
    {
    
    
    }

    public static OPGame Create(string name,int ID, ModelInfor Model)
    {
    
    
        OPGame InstanceOP = ReferencePool.Acquire<OPGame>();
        InstanceOP.Initialize(name, Model);
        InstanceOP.m_ModelID = ID;
        return InstanceOP;
    }

    public override void Clear()
    {
    
    
        base.Clear();
        m_ModelID = -1;
    }
    public override void Release(bool isShutdown)
    {
    
    
        
    }
}
public class ModelInfor
{
    
    
    private int ID;
    private Mesh Mesh;
    private Texture2D Texture2D;
    public ModelInfor(int ID)
    {
    
    
        this.ID = ID;
        Mesh = null;
        Texture2D = null;
    }
    public ModelInfor()
    {
    
    
        this.ID = -1;
        Mesh = null;
        Texture2D = null;
    }
    public Mesh GetMesh()
    {
    
    
        return Mesh;
    }
    public Texture2D GetTexture2D()
    {
    
    
        return Texture2D;
    }
    public int GetID()
    {
    
    
        return ID;
    }
}

ObjectPlayer: OP オブジェクト プール呼び出しの実装

using GameFramework;
using GameFramework.ObjectPool;
using StarForce;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPlayer : MonoBehaviour
{
    
    
    //创建对象名称编号
    int CreateNums = 0;
    private IObjectPool<OPGame> m_OPPool;
    List<OPGame> UsingOPGames;
    void Start()
    {
    
    
        m_OPPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool<OPGame>(Utility.Text.Format("OP Pool ({0})", name), 20, 10, 0);
        m_OPPool.AutoReleaseInterval = 5;
        UsingOPGames = new List<OPGame>();
    }
    [ContextMenu("CreateItem")]
    public void CreateItem()
    {
    
    
        for (int i = 0; i < 10; i++)
        {
    
    
            ModelInfor ModelInfor = new ModelInfor(i);
            OPGame OPGame = OPGame.Create("模型" + CreateNums, CreateNums, ModelInfor);
            //创建对象
            m_OPPool.Register(OPGame, true);
            UsingOPGames.Add(OPGame);
            if (CreateNums == 2)
            {
    
    
                CreateNums = 0;
            }
            else
            {
    
    
                CreateNums++;
            }
            if (i==0)
            {
    
    
                m_OPPool.SetLocked(OPGame, true);
                m_OPPool.SetPriority(OPGame, 10);
            }
            ModelInfor Model = (ModelInfor)OPGame.Target;
            Debug.LogError(Model.GetID());
        }
        
    }
    [ContextMenu("SpawnItem")]
    public void SpawnItem()
    {
    
    
        //获取对象
        OPGame OPGame = m_OPPool.Spawn("模型" + 0);
        UsingOPGames.Add(OPGame);
        Debug.LogError("获取的对象:"+OPGame.Name);
    }
    [ContextMenu("UnspawnItem")]
    public void UnspawnItem()
    {
    
    
        if (UsingOPGames.Count>3)
        {
    
    
            for (int i = 2; i >= 0; i--)
            {
    
    
                OPGame OPGame = UsingOPGames[i];
                //回收对象
                m_OPPool.Unspawn(OPGame);
                UsingOPGames.Remove(OPGame);
                Debug.LogError("释放的对象:" + OPGame.Name);
            }
        }
    }
}

効果を達成する

図に示すように、CreateItem、SpawnItem、UnspawnItem の 3 つの関数を作成します。
[写真]

関数呼び出しのエントリは次のとおりです。クリックして呼び出します。呼び出し順序は CreateItem、UnspawnItem、SpawnItem です。
[写真]

CreateItem は 10 個のオブジェクトの作成を実現し、最初のオブジェクトはロックされ、優先度は 10 に設定されます。
[写真]

UnspawnItem は最初に作成された 3 つのオブジェクトの回復を実現します。SpawnItem
[写真]
はオブジェクト プールから「モデル 0」という名前のオブジェクトの取得を実現します。InUse は false から true に変わります。
[写真]
「モデル 0」という名前の取得操作を実現しない場合しばらくすると、InUse ステータスが false のオブジェクトはオブジェクト プールによって破棄されますが、Locked が true に設定されている「モデル 0」は破棄されません。
[写真]

おすすめ

転載: blog.csdn.net/qq_37619255/article/details/130129751