首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

QFramework基本API汇总

  • 25-03-05 22:41
  • 3747
  • 11859
blog.csdn.net

文章目录

  • 前言
    • ResKit
    • UIKit
    • AudioKit
    • SingletonKit
    • LogKit
    • ActionKit
    • FluentAPI
    • EnumEventSystem
    • PoolKit
    • FSM
    • 宏
  • 总结


前言

QF框架内置了不少案例,并且QF文档也详细说明了使用规范。虽然如此,但考虑到说明太过详细导致有的时候翻起来不便,以及工程当中的案例我习惯都清理掉,以下选了部分常用的API记录。

ResKit

//除了Resource加载,每个脚本都需要声明加载器
private ResLoader mResLoader = ResLoader.Allocate();
  • 1
  • 2

基本加载1

// 项目启动只调用一次即可
ResKit.Init();
// 通过资源名 + 类型搜索并加载资源(更方便)
var prefab = mResLoader.LoadSync<GameObject>("AssetObj");
// 通过 AssetBundleName 和 资源名搜索并加载资源(更精确)
//prefab = mResLoader.LoadSync("assetobj_prefab", "AssetObj");
var gameObj = Instantiate(prefab);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

基本加载2

mResLoader.LoadSync<GameObject("ImageA").InstantiateWithParent(this.transform);
  • 1

基本加载3

//  加载 Resources 目录里的资源不用调用 ResKit.Init
RawImage.texture = mResLoader.LoadSync<Texture2("resources://TestTexture");
  • 1
  • 2

异步加载

private float progress;

 ResLoader resLoader;
 IEnumerator Load()
 {
     yield return ResKit.InitAsync();

     resLoader = ResLoader.Allocate();

     resLoader.Add2Load<GameObject>("AssetObj 1",(b, res) =>
     {
         if (b)
         {
             res.Asset.As<GameObject>().Instantiate();
         }
     });

     // AssetBundleName + AssetName
     resLoader.Add2Load<GameObject>("assetobj 2_prefab","AssetObj 2",(b, res) =>
     {
         if (b)
         {
             res.Asset.As<GameObject>().Instantiate();
         }
     });
     
     resLoader.LoadAsync(() =>
     {
         // 加载成功 5 秒后回收
         ActionKit.Delay(5.0f, () =>
         {
             resLoader.Recycle2Cache();

         }).Start(this);
     });
 }
  //获得进度
  private void SetProgress() {
     while (progress < resLoader.Progress * 100)
     {
         progress += 1;
         Debug.Log(progress);
     }
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

加载场景

 private ResLoader mResLoader = null;

 void Start()
 {
     ResKit.Init();

     mResLoader = ResLoader.Allocate();

     // 同步加载
     mResLoader.LoadSceneSync("SceneRes");

     // 异步加载
     mResLoader.LoadSceneAsync("SceneRes");

     // 异步加载
     mResLoader.LoadSceneAsync("SceneRes", onStartLoading: operation =>
     {
         // 做一些加载操作
     });
 }

 private void OnDestroy()
 {
     mResLoader.Recycle2Cache();
     mResLoader = null;
 }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

UIKit

初始化

//初始化UIKit
ResKit.Init();
// UIKit 的分辨率设置
UIKit.Root.SetResolution(1920, 1080, 1);
//获取 UIRoot 的摄像机,进行特殊效果的设置
var uiCamera = UIKit.Root.Camera;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

打开关闭

//打开UI
UIKit.OpenPanel<UIBasicPanel>()
// 在 Forward 层级打开
UIKit.OpenPanel<UIBasicPanel>(UILevel.Forward)
//关闭UI
UIKit.ClosePanel<UIBasicPanel>();
//UI内部关闭
this.CloseSelf();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

给UI传递数据

// 传递初始数据给 UIHomePanel
UIKit.OpenPanel<UIBasicPanel>(new UIHomePanelData()
{
    Coin = 10
});
//传递的数据在UI脚本里面需要实现
public class UIBasicPanelData : QFramework.UIPanelData
    {
        public int Coin;
    }
public partial class UIBasicPanel : QFramework.UIPanel
  {
    protected override void OnInit(QFramework.IUIData uiData)
     {
         mData = uiData as UIBasicPanelData ?? new UIBasicPanelData();
         // please add init code here

         // 外边传进来的,第一次初始化的时候使用
         Debug.Log(mData.Coin);
     }

     protected override void OnOpen(QFramework.IUIData uiData)
     {
         // 每次 OpenPanel 的时候使用
         Debug.Log((uiData as UIBasicPanelData).Coin);
     }   
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

弹窗堆栈

// UIHomePanel 需要确保是打开的状态,如果不打开会报错。以下是压栈和推栈两种方法。
UIKit.Stack.Push(this); // this 是 Panel
UIKit.Stack.Push<UIHomePanel>();
this.Back(); // 弹出 UIHomePanel
UIKit.Back<UIHomePanel>(); // 弹出 this
  • 1
  • 2
  • 3
  • 4
  • 5

AudioKit

播放背景音乐,同一时间只能播放一个音乐,播放别的音乐会直接卸载掉正在播放的音乐。
AudioKit.PlayMusic("resources://game_bg");
播放音效,同一时间可以播放多个音效,当多人说话时,也可以用来播放人声。
AudioKit.PlaySound("resources://game_bg");
播放人声,与播放背景音乐一致,同一时间只能播放一个人声,用于播放一些旁白之类的声音非常适合。
AudioKit.PlayVoice("resources://game_bg");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
//声音开关
AudioKit.Settings.IsSoundOn.Value
AudioKit.Settings.IsMusicOn.Value
AudioKit.Settings.IsVoiceOn.Value
//音量控制
AudioKit.Settings.MusicVolume.RegisterWithInitValue(v => musicVolumeSlider.value = v);
AudioKit.Settings.VoiceVolume.RegisterWithInitValue(v => voiceVolumeSlider.value = v);
AudioKit.Settings.SoundVolume.RegisterWithInitValue(v => soundVolumeSlider.value = v);

musicVolumeSlider.onValueChanged.AddListener(v => { AudioKit.Settings.MusicVolume.Value = v; });
voiceVolumeSlider.onValueChanged.AddListener(v => { AudioKit.Settings.VoiceVolume.Value = v; });
soundVolumeSlider.onValueChanged.AddListener(v => { AudioKit.Settings.SoundVolume.Value = v; });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

SingletonKit

C# 单例类
public class GameDataManager : Singleton<GameDataManager>
{
}
Mono 单例
public class GameDataManager : MonoSingleton<GameDataManager>
{
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

LogKit

日志输出

LogKit.I("一般等级");
LogKit.W("警告等级");
LogKit.E("错误等级");
  • 1
  • 2
  • 3

拼接日志

LogKit.Builder().Append("Hello").Append("World").ToString().LogInfo();
  • 1

ActionKit

延迟

ActionKit.Delay(1.0f, () =>
          {
              Debug.Log("End Time:" + Time.time);

          }).Start(this);
  • 1
  • 2
  • 3
  • 4
  • 5

重复执行

// 每次点击鼠标左键都会输出:Mouse Clicked
ActionKit.Repeat()
               .Condition(() => Input.GetMouseButtonDown(0))
               .Callback(() => Debug.Log("Mouse Clicked"))
               .Start(this);
// 点击鼠标右键,只会输出五次:Mouse right clicked,第五次输出  Right click finished
ActionKit.Repeat(5)
             .Condition(() => Input.GetMouseButtonDown(1))
             .Callback(() => Debug.Log("Mouse right clicked"))
             .Start(this, () =>
             {
                 Debug.Log("Right click finished");
             });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

条件

ActionKit.Sequence()
            .Callback(() => Debug.Log("Before Condition"))
            .Condition(() => Input.GetMouseButtonDown(0))
            .Callback(() => Debug.Log("Mouse Clicked"))
            .Start(this);
  • 1
  • 2
  • 3
  • 4
  • 5

FluentAPI

mResLoader.LoadSync<GameObject>("mygameobj")
  .InstantiateWithParent(parent)
  .transform
  .LocalIdentity()
  .Name("MyGameObj")
  .Show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

EnumEventSystem

定义事件

public enum TestEvent
 {
     Start,
     TestOne,
     End,
 }

public enum TestEventB
 {
     Start = TestEvent.End, // 为了保证每个消息 Id 唯一,需要头尾相接
     TestB,
     End,
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

使用

//注册事件
EnumEventSystem.Global.Register(TestEvent.TestOne, OnEvent);
//发送事件
EnumEventSystem.Global.Send(TestEvent.TestOne, "Hello World!");
//注销事件
EnumEventSystem.Global.UnRegister(TestEvent.TestOne, OnEvent);

//事件触发方法
void OnEvent(int key, params object[] obj)
 {
     switch (key)
     {
         case (int) TestEvent.TestOne:
             Debug.Log(obj[0]);
             break;
     }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

PoolKit

安全对象池(有限制)
使用方法:

SafeObjectPool<Bullet>.Instance.SetFactoryMethod(() =>
{
// bullet can be mono behaviour
return new Bullet();
});

SafeObjectPool<Bullet>.Instance.SetObjectFactory(new DefaultObjectFactory<Bullet>());

//初始化对象池,限制为50个,预先缓存25个
SafeObjectPool<Bullet>.Instance.Init(50,25);
//分配-》从对象池拿出来子弹进行——放到枪口、发射等操作
var bullet = Bullet.Allocate();
Debug.Log(SafeObjectPool<Bullet>.Instance.CurCount);//对象池剩24个预先缓存
//回收刚刚分配的子弹
bullet.Recycle2Cache();
Debug.Log(SafeObjectPool<Bullet>.Instance.CurCount);//对象池剩25个预先缓存
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

对象缓存:

class Bullet :IPoolable,IPoolType
{
    public void OnRecycled()
    {
        Debug.Log("回收了");
    }

    public  bool IsRecycled { get; set; }

    //分配
    public static Bullet Allocate()
    {
        return SafeObjectPool<Bullet>.Instance.Allocate();
    }
    
    public void Recycle2Cache()
    {
        SafeObjectPool<Bullet>.Instance.Recycle(this);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

FSM

以下不是自带的FSMKit,因为状态机自己就能随便写了,而且更通俗易懂
初始化

//示例场景:吊装机械吊起吊物放到结束位置
public enum ModelState
{
    Nomal,//初始状态
    Hoisting,//吊起
    Finish//结束
}
 public ModelState modelState = ModelState.Nomal;
    //控制者所控制的机器
    private StateMachine machine;
    void Awake()
    {
        NormalState normal = new NormalState(0, this);
        HoistingState hoisting = new HoistingState(1, this);
        FinishState finish = new FinishState(2, this);

        machine = new StateMachine(normal);
        machine.AddState(hoisting);
        machine.AddState(finish);

    }
    /// 
    /// 切换状态,isSave为是否保存位置到本地-这个isSave和事件传参一样,通常是无参,这里项目特殊需求才假的
    /// 
    public void SwichState(ModelState modelState,bool isSave = true)
    {
        this.modelState = modelState;
        //根据枚举类型去改变动画
        switch (modelState)
        {
            case ModelState.Nomal:
                machine.TranslateState(0, isSave);
                break;

            case ModelState.Hoisting:
                machine.TranslateState(1);
                break;

            case ModelState.Finish:
                machine.TranslateState(2);
                break;
        }
    }
    void Update()
    {
        machine.FSMUpdate();
    }
    //设置物体
     public void SetGo(GameObject go, bool b)
    {
    	//省略逻辑 
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
//初始状态
public class NormalState : TemplateState<Model>
{

    public NormalState(int id, Model o) : base(id, o)
    {

    }
    private bool isSave = true;
    public override void OnEnter(params object[] args)
    {
        base.OnEnter(args);
        //重置位置为“某种”状态
        owner.SetGo(owner.gameObject, false);
       	//传参,没有可以不加这个,只要owner就够了
        isSave = (bool)args[0];
    }

    public override void OnStay(params object[] args)
    {
        base.OnStay(args);
        //if (!isSave)
        //{
        //    return;
        //}
        //记录当时的位置,用来还原、缓存等-这里是用Matrix4x4矩阵来记录位置的逻辑,主要展示owner的作用
        owner.transform.GetComponent<DataInfo().PersistModelItemData.InitMatrix4x4(owner.transform);
    }

    public override void OnExit(params object[] args)
    {
        base.OnExit(args);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

宏

管理宏,防止重命名只改当前平台的变量名称;有特殊的需求可以自行扩展。

 if (PlatformCheck.IsiOS)
   {
		//TODO
   }
 if (PlatformCheck.IsEditor)
   {
		//TODO
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

总结

刚入门推荐去看官方文档,此篇 类笔记总结——QF常用API。

注:本文转载自blog.csdn.net的adogai的文章"https://blog.csdn.net/qq_41912124/article/details/128452376"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top