JSBinding / About JSComponent and Serialization

About JSComponent

JSCompnent is a normal Unity script.

It inherits from JSSerializer and JSSerializer inherits from MonoBehaviour.

public class JSSerializer : MonoBehaviour {
}
public class JSComponent : JSSerializer {
}

 

When using c#, steps to add a component to a gameobject are:

  1. In Hierarchy window, select a GameObject
  2. In Inspector window, click AddComponent button
  3. Select script you need

 

In the case of javascript, how to add a 'js monobehaviour' to a gameobject? For example, we have a js monobehaviour:

复制代码
// define a js monobehaviour
jss.define_mb("TestMb", function () {

    // called from c#
    this.Start = function () {
    }

    // called from c#
    this.Update = function () {
    }
});
复制代码

 

Steps to add it to a gameobject:

  1. In Hierarchy window, select a GameObject
  2. In Inspector window, click AddComponent button
  3. Select JSComponent
  4. Set 'Js Class Name' to 'jss.TestMb'

 

The main difference here is the use of JSComponent. JSComponent is an agent for javascript monobehaviour. 

What does JSComponent do?

  1. Create a js object named 'jss.TestMb'
  2. Redirect MonoBehaviour's event funtions to js
  3. Destroy js object when its OnDestroy is called

 

复制代码
public class JSComponent : JSSerializer
{
    int jsObjID;

    void initJs() {
        // 1 create js object
        jsObjID = JSApi.newJSClassObject(this.jsClassName);
    }

    void Start() {
        // 2 call js Start
        CallJSFunction(jsObjID, "Start");
    }

    void Update() {
        // 2 call js Update
        CallJSFunction(jsObjID, "Update");
    }

    void OnDestroy() {
        // 2 call js OnDestroy
        CallJSFunction(jsObjID, "OnDestroy");

        // 3 delete js object
        DeleteJSObject(jsObjID);
    }
}
复制代码

 

About Serialization

Serializing data to js object is JSSerializer's job. Steps to add serialization fields to javascript and let JSSerializer do work for you:

  • 1. Add some variables to javascript monobehaviour:
复制代码
// define a js monobehaviour
jss.define_mb("TestMb", function () {
    // UnityEngine.Object
    this.oValue = null;

    // int
    this.iValue = 0;

    // string
    this.sValue = "";
     
    // double
    this.fValue = 0;

    // another js monobehaviour
    this.kValue = null;
});
复制代码

 

  • 2. Assign values in Inspector window:

Arr String

Size 5

Element 0 oValue/0
Element 1 iValue/5
Element 2 sValue/hello
Element 3 fValue/6.3
Element 4 kValue/1/jss.SayHello

Arr Object

Size 2

Element 0 [MainCamera]

Element 1 [SayHello]

 

After that, your js object's fields will be correctly assigned at application launching.

 

Extending & Customizing JSComponent

The default JSComponent only contains these event functions

  • Awake
  • Start
  • OnDestroy
  • FixedUpdate
  • Update
  • LateUpdate
  • OnEnable

They are probably not enough. There is an example script extending JSComponent: JSComponentCustom1. Let me show you how it works:

  • 1. First, add a new script inheriting from JSComponent, add event functions you need:
复制代码
public class JSComponentCustom1 : JSComponent
{
    int idOnGUI = 0;

    protected override void initMemberFunction()
    {
        base.initMemberFunction();
        idOnGUI = JSApi.getObjFunction(jsObjID, "OnGUI");
    }

    void OnGUI()
    {
        callIfExist(idOnGUI);
    }
}
复制代码
  • 2. In Components.cs, make a slight change to GameObject_AddComponentT1 function:
复制代码
public static bool GameObject_AddComponentT1(JSVCall vc, int count)
    {
        help_getGoAndType(vc);

        if (typeInfo.IsCSMonoBehaviour)
        {
            Component com = go.AddComponent(type);
            JSMgr.datax.setObject((int)JSApi.SetType.Rval, com);
        }
        else
        {
            JSComponent jsComp;
            int iOfJsComp = 0;
            if (count > 1)
                iOfJsComp = JSApi.getInt32((int)JSApi.GetType.Arg);

            switch (iOfJsComp)
            {
// add here!
case 1: jsComp = go.AddComponent<JSComponentCustom1>(); break; default: jsComp = go.AddComponent<JSComponent>(); break; } jsComp.jsClassName = typeString; jsComp.jsFail = false; jsComp.init(true); jsComp.callAwake(); //JSApi.JSh_SetRvalObject(vc.cx, vc.vp, jsComp.jsObj); JSApi.setObject((int)JSApi.SetType.Rval, jsComp.GetJSObjID(false)); } return true; }
复制代码
  • 3. When you call AddComponent$1 in javascript, add a custom parameter (1)
this.oDogGameObject.AddComponent$1(jss.Dog, 1/* Custom JSComponent */ );

 

 

backto JSBinding / Home

posted on   AnswerWinner  阅读(413)  评论(0编辑  收藏  举报

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示