一、JK框架介绍
主要功能系统:
-
对象池系统:重复利用GameObject或普通class实例,并且支持设置对象池容量
-
事件系统:解耦工具,不需要持有引用来进行函数的调用
-
资源系统
- Resources版本:关联对象池进行资源的加载卸载
- Addressables版本:关联对象池进行资源的加载卸载,可结合事件工具做到销毁时自动从Addressables Unload
-
MonoSystem:为不继承MonoBehaviour的对象提供Update、FixedUpdate、协程等功能
-
音效系统:背景音乐、背景音乐轮播、特效音乐、音量全局控制等
-
存档系统:
- 支持多存档
- 自动缓存,避免频繁读磁盘
- 存玩家设置类数据,也就是不关联任何一个存档
- 支持二进制和Json存档,开发时使用Json调试,上线后使用二进制加密与减少文件体积
-
日志系统:日志控制、保存等
-
UI系统:UI窗口的层级管理、Tips功能
-
场景系统:对Unity场景加载封装了一层,主要用于监听场景加载进度
-
本地化系统:分为全局配置和局部配置(随GameObject加载)、UI自动本地化收集器(Text、Image组件无需代码即可自动本地化)
框架源码地址:https://github.com/Joker-YF/JKFrame 框架Github地址
二、框架导入
将下载下的框架文件夹拖拽到Assets问价夹下即可
如遇到报错是Odin插件的报错,重新打开工程即可
三、对象池简单示例
TestPoolSystem 脚本
1. 数据类普通对象 和 游戏对象 的简单使用流程, 此方法做解释不调用
void 简单使用()
{
// 1.普通对象
BagData bagData = new BagData();
//把对象推送给对象池
PoolSystem.PushObject(bagData);
//对象池获取对象
BagData bagData2 = PoolSystem.GetObject<BagData>();
//2, 游戏对象
GameObject bullet = GameObject.Instantiate(bulletPrefabs);
bullet.name = bulletPrefabs.name;
PoolSystem.PushGameObject(bullet);
GameObject bullet2 = PoolSystem.GetGameObject(bulletPrefabs.name);
}
2.初始化流程介绍:可选择初始化对象池的限制,通过Get/Push去调用取出放入,最后做清理对象池的操作
void 流程()
{
//1.初始化(非必要) 设置了子弹池,最多50,默认生成50
//如果不初始化 ,就是无限空间,没有默认数量
PoolSystem.InitGameObjectPool(bulletPrefabs, 50, 50);
//2,放进去和获取 Get/Push
//3,对象池清理
PoolSystem.ClearGameObject(bulletPrefabs.name);
}
3.完整代码:对应上图Gif的效果 ,鼠标左键控制发射子弹
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using JKFrame;
public class TestPoolSystem : MonoBehaviour
{
public GameObject bulletPrefabs;
// Start is called before the first frame update
void Start()
{
PoolSystem.InitGameObjectPool(bulletPrefabs, 10, 10);
}
void 简单使用()
{
// 1.普通对象
BagData bagData = new BagData();
//把对象推送给对象池
PoolSystem.PushObject(bagData);
//对象池获取对象
BagData bagData2 = PoolSystem.GetObject<BagData>();
//2, 游戏对象
GameObject bullet = GameObject.Instantiate(bulletPrefabs);
bullet.name = bulletPrefabs.name;
PoolSystem.PushGameObject(bullet);
GameObject bullet2 = PoolSystem.GetGameObject(bulletPrefabs.name);
}
void 流程()
{
//1.初始化(非必要) 设置了子弹池,最多50,默认生成50
//如果不初始化 ,就是无限空间,没有默认数量
PoolSystem.InitGameObjectPool(bulletPrefabs, 50, 50);
//2,放进去和获取 Get/Push
//3,对象池清理
PoolSystem.ClearGameObject(bulletPrefabs.name);
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
PoolSystem.GetGameObject<BulletControler>(bulletPrefabs.name).Init(Vector3.zero,Random.Range(5,10));
}
}
}
/// <summary>
/// 例子: 背包里一个格子的数据 要复用
/// </summary>
public class BagData
{
}
BulletControler :子弹控制脚本,配合子弹预制体使用
using System.Collections;
using System.Collections.Generic;
using JKFrame;
using UnityEngine;
public class BulletControler : MonoBehaviour
{
private bool isInit = false;
private float moveSpeed;
public void Init(Vector3 pos, float moveSpeed)
{
transform.position = pos;
isInit = true;
this.moveSpeed = moveSpeed;
Invoke("Destory", 1f);
}
public void UnInit()
{
isInit = false;
}
// Update is called once per frame
void Update()
{
if (isInit)
{
transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
}
}
private void Destory()
{
UnInit();
PoolSystem.PushGameObject(gameObject);
}
}