JBehaviour

JEngine现已支持基于MonoBehaviour,却更强大的基类已经制作了比使用MonoBehaviour更优化性能的基类,JBehaviour已经不基于MonoBehaviour了

为什么使用JBehaviour?

  • 更简单的周期处理
  • 少量代码,更强功能,API丰富
  • 以异步代替Update,节约开销
  • 更可控的循环,可以调整循环模式和频率
  • 对比热更内继承MonoBehaviour,更少GC,性能更强,执行更快
JBehaviour

继承使用

  1. 在您的热更工程里,引入以下命名空间:

    using JEngine.Core;
    
  2. 继承JBehaviour

    namespace HotUpdateScripts
    {
        public class Sample : JBehaviour
        {
        	//ToDo
        }
    }
    
  3. JBehaviour有四个可override方法

    • Init => 当类被添加到GameObject,可以参考Awake
    • Run => Init之后,参考Start
    • Loop => 频率循环事件,参考Update
    • End => 当脚本被销毁,参考OnDestory
  4. 注意:JBehaviour不推荐用gameObject.GetComponent获取,因为JBehaviour原理的缘故,真机这么操作无效,所以建议就用gameObject.GetJBehaviour获取

Demo示例(包含90%以上的API使用)

using System;
using JEngine.Core;

namespace JEngine.Examples
{
    public class JBehaviourExample : JBehaviour
    {
        private int i;

        public override void Init()
        {
            Log.Print("JBehaviour has been created!");
        }

        public override void Run()
        {
            Log.Print("JBehaviour is running!");
            //Change the frequency of loop
            FrameMode = false;//Don't loop in frame
            Frequency = 1000;//Run every 1000 milliseconds

            i = 1;

            Destroy(this.gameObject, 10);
        }

        public override void Loop()
        {
            Log.Print("Hello JBehaviour * " + i + " times!");
            i++;
        }

        public override void End()
        {
            Log.Print("I have been destroyed!");
        }
    }
}

  1. 显而易见,在Run方法中,分配了framefrequency数值,这两个数值影响loop方法的频率。

    • FrameMode: bool,如果为true,帧循环;反之,毫秒循环 ,默认为true
    • Frequency: int,代表循环的间隔时间,代表毫秒或帧数,默认为1

其他接口

/// <summary>
/// Total time that this JBehaviour has run
/// 该JBehaviour运行总时长
/// </summary>
public float TotalTime = 0;
/// <summary>
/// Deltatime of loop
/// 循环耗时
/// </summary>
public float LoopDeltaTime = 0;
/// <summary>
/// Loop counts
/// 循环次数
/// </summary>
public long LoopCounts = 0;
/// <summary>
/// Time scale
/// 时间倍速
/// </summary>
public float TimeScale = 1;
/// <summary>
/// Hides the UI gameObject
/// 隐藏UI对象
/// </summary>
public JBehaviour Hide()
/// <summary>
/// Shows the UI gameObject
/// 显示UI对象
/// </summary>
public JBehaviour Show()
/// <summary>
/// Pause the loop
/// 暂停循环
/// </summary>
public JBehaviour Pause()
/// <summary>
/// Resume the loop
/// 恢复循环
/// </summary>
public JBehaviour Resume()
/// <summary>
/// Activate the JBehaviour
/// 激活
/// </summary>
/// <returns></returns>
public JBehaviour Activate()

实例化

  • 创建实例(3种方法)
    1. 直接在编辑器内使用ClassBind挂载脚本参考这里
    2. 使用JBehaviour的创造方法JBehaviour.CreateOn<T>(GameObject gameObject, bool activeAfter = true) where T : JBehaviour
    3. 直接new(),会创建以唯一实例ID命名的GameObject,并挂上该JBehaviour
  • 获取实例
    1. 获取单个实例T GetJBehaviour<T>(GameObject gameObject) where T : JBehaviour
    2. 获取单个实例T GetJBehaviour<T>(string instanceID) where T : JBehaviour
    3. 获取某GameObject上多个实例T[] GetJBehaviours<T>(GameObject gameObject) where T : JBehaviour
  • 删除实例 RemoveJBehaviour(JBehaviour jBehaviour)
  • Demo示范
var go = new UnityEngine.GameObject("Test");

//创建实例
JBehaviourExample jb1 = JBehaviour.CreateOn<JBehaviourExample>(go, false);
JBehaviourExample jb2 = JBehaviour.CreateOn<JBehaviourExample>(go, false);

//创建后有唯一实例ID
Log.Print($"jb1: {jb1.InstanceID}");
Log.Print($"jb2: {jb2.InstanceID}");


//通过实例ID获取
JBehaviourExample getJb1 = JBehaviour.GetJBehaviour<JBehaviourExample>(jb1.InstanceID);
Log.Print($"jb1 == getJb1 is {jb1 == getJb1}");

//通过GameObject获取第一个挂在上面的JBehaviour
JBehaviourExample getJb1GO = JBehaviour.GetJBehaviour<JBehaviourExample>(go);
Log.Print($"jb1 == getJb1GO is {jb1 == getJb1GO}");

//获取某GameObject上全部挂着的JBehaviour
JBehaviourExample[] allJbsOnGO =
  JBehaviour.GetJBehaviours<JBehaviourExample>(go);

var allJbsIds = from jb in allJbsOnGO select jb.InstanceID;

Log.Print($"Test go has {allJbsOnGO.Length} JBehaviours, " +
          $"which are {string.Join(",", allJbsIds)}");

//删除JBehvaiour
JBehaviour.RemoveJBehaviour(jb1);