gameobject上挂载
using UnityEngine;
public class UIInterface : MonoBehaviour
{
public Object[] compChilds;
}
写wraper
[LuaCallCSharp]
public static class UIInterfaceWraper
{
//由于lua特性,lua获取到的Object类型,可以直接调用其具体类型的属性方法
//但是,如果要调用C#方法,必须使用具体类型
//比如这个,需通过wraper方法
public static void ForceRebuildLayoutImmediate(Object obj)
{
LayoutRebuilder.ForceRebuildLayoutImmediate(obj as RectTransform);
}
public static Object GetUnityEngineObject(UIInterface face,int index)
{
return face.pChilds[index];
}
}
lua中这样获取
local getUEObject =function (index,face)
return face.compChilds[index]
end
local face = self.container:GetComponent("UIInterface")
self.obj1 = getUEObject(0, face)
self.scrollRect = getUEObject(1, face)--获取Object类型,可直接在lua'中当作对应类型处理
self.content = getUEObject(2, face)
CS.UIInterfaceWraper.ForceRebuildLayoutImmediate(self.content)
ui组件自动获取(editor代码)
public static void AddComp()
{
GameObject window = Selection.activeGameObject;
if (window == null)
return;
UIInterface face = window.GetComponent<UIInterface>();
if (face == null)
{
face = window.AddComponent<UIInterface>();
}
AllList = new List<Object>();
AddToList(face.transform);
face.pChilds = new Object[AllList.Count];
for (int i = 0; i < AllList.Count; i++)
{
face.pChilds[i] = AllList[i];
}
EditorUtility.SetDirty(window);
//AssetDatabase.SaveAssets();
}
static void AddToList(Transform transform)
{
foreach (Transform item in transform)
{
var obj = GetObj(item.gameObject);
if (obj != null)
{
AllList.Add(obj);
}
if (item.childCount > 0 && item.GetComponent<UIInterface>() == null)
AddToList(item);
}
}
public static UnityEngine.Object GetObj(GameObject tgo)
{
int length = tgo.gameObject.name.Length;
if (length <= 3)
return null;
string n = tgo.name.Remove(3);
UnityEngine.Object obj = null;
switch (n)
{
case "txt":
obj = tgo.GetComponent<TextMeshProUGUI>();
break;
case "btn":
obj = tgo.GetComponent<Button>();
break;
case "obj":
obj = tgo;
break;
case "tra":
obj = tgo.transform;
break;
case "rct":
obj = tgo.transform as RectTransform;
break;
case "ins":
obj = tgo.GetComponent<UIInterface>();
break;
case "sdr":
obj = tgo.GetComponent<Slider>();
break;
case "tog":
obj = tgo.GetComponent<Toggle>();
break;
case "inp":
obj = tgo.GetComponent<InputField>();
break;
case "slr":
obj = tgo.GetComponent<ScrollRect>();
break;
case "cvg":
obj = tgo.GetComponent<CanvasGroup>();
break;
default:
// Log.Error("未能处理物体:", tgo.name);
break;
}
return obj;
}
ui代码生成 (editor代码)
private static string upperFirst(string s)
{
return Regex.Replace(s, @"\b[a-z]\w+", delegate (Match match)
{
string v = match.ToString();
return char.ToUpper(v[0]) + v.Substring(1);
});
}
private static string GenCode()
{
GameObject window = Selection.activeGameObject;
if (window == null)
return;
UIInterface face = window.GetComponent<UIInterface>();
var list = face.pChilds;
string line = "--UI Members " + "\n";
int index = 0;
foreach (var obj in list)
{
string Goanme = string.Empty;
GameObject go = null;
if (obj is GameObject)
{
go = obj as GameObject;
Goanme = go.name;
}
else if (obj is Component com)
{
Goanme = com.transform.gameObject.name;
}
string start = Goanme.Remove(3);
string name = "self.m" + upperFirst(Goanme).Replace(" ","");
if (!string.IsNullOrEmpty(Goanme))
{
line += name+ "=Utils.GetUnityEngineObject(" +index+",face)\n";
}
index++;
}
Debug.Log(line);
}
效果
--UI Members
self.mSlrScrollView=Utils.GetUnityEngineObject(0,face)
self.mSdrSlider=Utils.GetUnityEngineObject(1,face)
self.mBtnButton=Utils.GetUnityEngineObject(2,face)
网友评论