Unity+toLua+FairyGUIプロジェクトのluaビジネス層がUIを使用する方法

3255 ワード

lua層でFairyGUIエディタを用いて導出されたUIを使用して、業務ロジックを実現する.
前言
本人が現在行っているプロジェクトは、Unity 3 dエンジンに基づいて開発されたもので、toLuaフレームを使って業務層をluaレベルに転嫁し、熱的に更新することができます.UI面ではFairyGUIエディタを使用しています.ここでは、toluaおよびfairygui環境をどのように構成するかについて多くの説明を要しない.本論文では、サービス開発において、UIのviewやcomponentを特定のオブジェクト(例えば、バックパックの中の道具やキャラの血条情報欄など)と見なして、関連する変数や方法を拡張する必要があるので、lua層でどうやってUI関連の業務ロジックを作成するかを考えています.私はここでレンガを投げて玉を引いて、いくつか構想を提供して、参考と討論に供します.
一、公式提供の拡張FairyGUI類の方法:fgui.extension_クラス(「FairyGUIクラス名」)
FairyGUIの公式教程では、この方法を拡張するために提供しています.公式サイトの例をコピーしてください.
--     。      ,    。     GButton,       GComponent。
MyButton = fgui.extension_class(GButton)

--          ,              

function MyButton:ctor()
	print(self:GetChild('n1'))
end

--           
function MyButton:Test()
	print('test')
end

local get = tolua.initget(MyButton)
local set = tolua.initset(MyButton)
get.myProp = function(self)
	return self._myProp
end

set.myProp = function(self, value)
	self._myProp = value
	self:GetChild('n1').text = value
end

--     。            。
fgui.register_extension("ui://  /    ", MyButton)

--       ,  “    ”                MyButton   。  :
local myButton = someComponent:GetChild("myButton") --  myButton    “    ”
myButton:Test()
myButton.myProp = 'hello'

local myButton2 = UIPackage.CreateObject("  ","    ")
myButton2:Test()
myButton2.myProp = 'world'
この方法は非常に直接的である場合、拡張クラスはUIコンポーネントと一対一に対応しており、簡単な開発においては、基本的にこのような方式を利用すれば、需要を満たすことができる.しかし、本人はこのような方式を使う過程でいくつかの問題に遭遇しました.
1、共通部品は異なるページで異なる方法が必要です.
この問題はどう言いますか?コードの中で解決しなくてはいけないわけではないです.(UIを編集する時は、汎用部品の使い方が違ってくるのを避けてもいいですが、UIを作る同僚がこれを理解できるとは保証できません.).fgui.extensionを使えばクラスについては、二つの方法について、一つはあらゆる可能な方法を拡張クラスに書くことです.二つ目は、複数の拡張クラスを実現し、異なるところに異なる種類を登録してオブジェクトを作成することです.(しかし、同じページの同じ二つのコンポーネントには異なる使い方があります.Emmmmはこのような状況はお父さんに聞こえますが、やはりその言葉です.私たちは╳▽╰╳を保証することができません.).
2、異なるコンポーネントは同じ機能を表しています.
この問題は主にいくつかの機能的なコンポーネントに対して、UIのクラスメートはいくつかの変化が必要で、彼らは異なるコンポーネントを作っていますが、実は私たちにとってこれらのコンポーネントは機能的にほとんど区別がないかもしれません.だから、いくつかの拡張タイプを書いたかもしれません.
出会った問題に基づいて、同僚と溝を通過した後、私達は次のような方法を選びました.
二、自分でluaのclassを作成して、UIの対象を変数としてクラスに割り当てます.
この方法は実はよく分かります.例を挙げます.
local myComponent = class("myComponent")
function myComponent:ctor(uiComponent)
	self.ui = uiComponent
end

function myComponent:getChildAt(index)
	if self.ui then  --     
		return self.ui:GetChildAt(index)
	end
end

function myComponent:myFunction()
	print("myFunction")
end

return myComponent
これにより、自分のluaクラスが実現され、使用中にまずエディタのUIオブジェクトを取得し、newは自分のlua類をパラメータとして転送し、後に自分のlua類オブジェクトを使って方法の呼び出しができます.
local ui = view:GetChild("component")
local myui = myComponent.new(ui)
myui:myFunction()
このような拡張方式は、サービスロジックをluaクラスに書いて、業務層とUIオブジェクトを組み合わせて使用することで、多くの問題を解決できます.類と類は直接にも比較的明るい後継関係を確立することができます.もちろん、UIとは分離しすぎて、実際にUIオブジェクトが獲得されたかどうかを判断する必要があるという欠点もあります.しかし、本人が実際に使ってみると、いろいろな点がいいと思います.可読性であれ、使うものであれ、単品で多く使うことや、複数のコンポーネントで同じように使うことを心配する必要はありません.自分で編集者を使ってUIを作る場合、UIが使うluaのような経路をUIのカスタムデータに書くことができます.これは使えます.
require(ui.userData).new(ui)
を作成します.異なるクラスを使う場合は、エディタでuserDataを変更するだけでいいです.
終わりに
ここで、lua層はfairyguiの方法を使って紹介しました.これを利用して玉を転用します.もし他のより良い使い方があれば、交流指導を惜しまないでください.ありがとうございます.