CodeBind 根据 Unity Hierarchy 节点名称收集目标,生成 partial C# 绑定代码并写入序列化引用。它支持直接绑定 MonoBehaviour、由 Unity Host 承载普通 C# 类,以及按字符串 key 访问引用。
- 节点名称支持类型 token、缩写模糊匹配、多个目标和
*wildcard。 - 使用
(0)、(1)等后缀生成数组成员。 - 支持嵌套
BindingRootAttribute边界,避免父级重复收集子绑定根。 - 支持自定义名称分隔符、输出路径和命名空间。
- 通过
IBindingTargetTokenConfig批量扩展 token 映射。 - 通过
IBindingCodeCustomizer自定义生成字段、属性和附加源码。 - 生成结果使用 partial class,不修改业务实现。
在 Unity Package Manager 中选择 Add package from git URL,输入:
https://github.com/XuToWei/CodeBind.git
也可以下载仓库并放入项目的 Packages 目录。
CodeBind 需要 Odin Inspector。
默认格式:
[变量名]_[目标类型 token][_目标类型 token...][ (数组索引)]
示例:
| 节点名称 | 生成成员 | 说明 |
|---|---|---|
Player_Transform |
PlayerTransform |
绑定 Transform |
UI_Button_Image |
UIButton、UIImage |
同一节点绑定多个目标 |
Panel_* |
PanelGameObject、PanelTransform 及该节点上其他已映射组件 |
wildcard 使用实际目标 token,不生成 PanelStar |
Item_Transform (0)、Item_Transform (1) |
ItemTransformArray |
按索引后缀收集数组 |
类型 token 支持模糊补全,例如 Self_Tr 可规范化为 Self_Transform。常见内置 token 包括 GameObject、Transform、RectTransform、Button、Text、Image 和 Slider。
CodeBind 直接将
变量名 + 目标 token交给当前IBindingCodeCustomizer。默认实现不会自动转换大小写;若希望生成 PascalCase,请在 Hierarchy 变量名或 customizer 中明确实现。
在业务脚本上添加 MonoBehaviourBindingAttribute:
using CodeBind;
using UnityEngine;
namespace Game
{
[MonoBehaviourBinding('_')]
public partial class PlayerView : MonoBehaviour
{
private void Start()
{
RootTransform.position = Vector3.zero;
SubmitButton.onClick.AddListener(Submit);
}
private void Submit()
{
Debug.Log("Submitted");
}
}
}对应节点:
PlayerView
├── Root_Transform
└── Submit_Button
生成的 PlayerView.Bind.cs 类似:
namespace Game
{
public partial class PlayerView
{
[UnityEngine.SerializeField]
private UnityEngine.Transform m_RootTransform;
[UnityEngine.SerializeField]
private UnityEngine.UI.Button m_SubmitButton;
public UnityEngine.Transform RootTransform => m_RootTransform;
public UnityEngine.UI.Button SubmitButton => m_SubmitButton;
}
}在 Odin Inspector 中使用 Generate Binding Source 和 Generate Serialization。新建脚本也可以使用 Hierarchy 菜单:
GameObject > CodeBind > MonoBehaviour Binding Generator
PlainClass 模式适合不继承 MonoBehaviour 的普通 C# 类。业务主脚本只需要声明为 partial;生成的 .Bind.cs 会实现 IPlainClassBinding:
namespace Game
{
public partial class PlayerPresenter
{
public void Show()
{
TitleText.text = "Hello CodeBind";
}
}
}- 在 GameObject 上添加
PlainClassBindingHost。 - 将业务脚本赋给 Host 的 Binding Class Script。
- 生成绑定源码和序列化数据。
- 通过扩展方法取得缓存实例:
PlayerPresenter presenter = gameObject.GetPlainClassBinding<PlayerPresenter>();
presenter.Show();生成协议提供:
public PlainClassBindingHost BindingHost { get; private set; }
public Transform RootTransform { get; private set; }
public void Bind(PlainClassBindingHost host);
public void Unbind();新建 PlainClass 脚本可以使用:
GameObject > CodeBind > Plain Class Binding Generator
NamedReferenceBindingHost 支持两类引用:
- Inspector 手动维护的 key 到
GameObject映射。 - 根据 Hierarchy 命名自动生成的 key 到目标映射。
运行时 API:
GameObject panel = host.GetManualGameObject("Panel");
Button submit = host.GetGeneratedReference<Button>("SubmitButton");
List<Image> icons = host.GetGeneratedReferences<Image>("IconImageArray");对于单个自定义 Component,可以直接标记 token:
using CodeBind;
using UnityEngine;
[BindingTargetToken("HealthBar")]
public sealed class HealthBar : MonoBehaviour
{
}需要批量配置、别名或 GameObject 映射时,实现 IBindingTargetTokenConfig:
using System;
using System.Collections.Generic;
using CodeBind.Editor;
public sealed class ProjectBindingTargetTokenConfig : IBindingTargetTokenConfig
{
public int Priority => 100;
public IReadOnlyDictionary<string, Type> TargetTypesByToken { get; } =
new Dictionary<string, Type>
{
{ "HealthBar", typeof(HealthBar) },
{ "HB", typeof(HealthBar) },
};
}发现优先级为:BindingTargetTokenAttribute > IBindingTargetTokenConfig(按 Priority 从高到低)> 默认配置。
实现 IBindingCodeCustomizer 即可自定义生成成员名称和附加源码。最高 Priority 的实现生效;默认实现优先级为 0。
using System.Collections.Generic;
using CodeBind.Editor;
public sealed class ProjectBindingCodeCustomizer : IBindingCodeCustomizer
{
public int Priority => 100;
public string GetSerializedFieldName(string memberName) => $"_{memberName}";
public string GetPublicPropertyName(string memberName) => memberName;
public string BuildAdditionalSource(
string namespaceName,
string className,
List<BindingDescriptor> singleBindings,
SortedDictionary<string, List<BindingDescriptor>> arrayBindingsByMemberName,
string indentation)
{
return string.Empty;
}
}框架传入的 memberName 已经是 MemberNamePrefix + TargetToken;数组还会预先追加固定的 Array 后缀。不要在 customizer 中再次拼接 token 或数组后缀。
BindingDescriptor 提供:
public string MemberNamePrefix { get; }
public Type TargetType { get; }
public string TargetToken { get; }
public Transform SourceTransform { get; }选中一个或多个根 GameObject 后,可以使用:
GameObject > CodeBind > Refresh All Binding Sources
GameObject > CodeBind > Refresh All Serialized Bindings
已有脚本的生成文件位于原脚本旁边,名称为 原类名.Bind.cs。Generator Window 使用所选输出目录。
需要。生成绑定源码后,再生成序列化数据。MonoBehaviour Inspector 在脚本重载后会自动完成待处理的序列化步骤。
支持。带 BindingRootAttribute 的组件会形成扫描边界,父绑定不会收集嵌套绑定根内部的节点。
- QQ 交流群:949482664
- 问题反馈:GitHub Issues
本项目基于 MIT License 开源。